From 448ff4db1a1ffc49f4cf22d049c4e58a8f43e04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Fern=C3=A1ndez=20de=20Alba?= Date: Thu, 10 Mar 2022 09:34:09 +0100 Subject: [PATCH] Update readme 2022 (#3131) * New updated, completed and fixed README. Update versions everywhere, more convenience commands * Changelog * Fix regression in multilingual test * Apply suggestions from Steve's code review Co-authored-by: Steve Piercy Co-authored-by: Steve Piercy --- CHANGELOG.md | 3 + Makefile | 10 +- README.md | 174 +++++++++--------- api/versions.cfg | 3 - .../tests/multilingual/basic-multilingual.js | 39 +++- logos/VoltoLogoEra2-dark-mode.png | Bin 0 -> 6158 bytes logos/VoltoLogoEra2.png | Bin 0 -> 21337 bytes package.json | 4 + 8 files changed, 139 insertions(+), 94 deletions(-) create mode 100644 logos/VoltoLogoEra2-dark-mode.png create mode 100644 logos/VoltoLogoEra2.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 8154b1da4e..83afc59f6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ ### Internal +- Better Readme, updated to 2022 @sneridagh +- Update to latest versions for Python packages @sneridagh + ### Documentation - Fix broken links. @stevepiercy diff --git a/Makefile b/Makefile index d429b0e176..8ae9fb3936 100644 --- a/Makefile +++ b/Makefile @@ -13,8 +13,8 @@ MAKEFLAGS+=--no-builtin-rules # Project settings INSTANCE_PORT=8080 -DOCKER_IMAGE=plone/plone-backend:5.2.6 -KGS=plone.restapi==8.21.0 plone.volto==4.0.0a3 plone.rest==2.0.0a2 plone.app.iterate==4.0.2 plone.app.vocabularies==4.3.0 +DOCKER_IMAGE=plone/plone-backend:5.2.7 +KGS=plone.restapi==8.21.2 plone.volto==4.0.0a3 plone.rest==2.0.0a3 plone.app.iterate==4.0.2 plone.app.vocabularies==4.3.0 # Sphinx variables # You can set these variables from the command line. @@ -173,7 +173,11 @@ start-backend: ## Start Plone Backend .PHONY: start-backend-docker start-backend-docker: - docker run -it --rm -p 8080:8080 -e SITE=Plone -e ADDONS='$(KGS)' $(DOCKER_IMAGE) + docker run -it --rm --name=backend -p 8080:8080 -e SITE=Plone -e ADDONS='$(KGS)' $(DOCKER_IMAGE) + +.PHONY: start-frontend-docker +start-frontend-docker: + docker run -it --rm --name=volto --link backend -p 3000:3000 -e RAZZLE_INTERNAL_API_PATH=http://backend:8080/Plone -e RAZZLE_DEV_PROXY_API_PATH=http://backend:8080/Plone plone/plone-frontend:latest .PHONY: start-backend-docker-guillotina start-backend-docker-guillotina: diff --git a/README.md b/README.md index f8b0766b60..514447576e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Volto -Volto png +Volto logo png +Volto logo png [![NPM](https://img.shields.io/npm/v/@plone/volto.svg)](https://www.npmjs.com/package/@plone/volto) [![Build Status Core](https://github.com/plone/volto/actions/workflows/core.yml/badge.svg)](https://github.com/plone/volto/actions) @@ -8,11 +9,9 @@ ## Introduction -[Volto](https://github.com/plone/volto) is a React-based frontend for content -management systems, currently supporting three backend implementations: Plone, -Guillotina and a NodeJS reference implementation. +[Volto](https://github.com/plone/volto) is a ReactJS-based frontend for the [Plone](https://plone.org) Content Management System. It will become the default UI for the upcoming Plone 6 release. -[Plone](https://plone.org) is a CMS built on Python with over 20 years of history and experience. +[Plone](https://plone.org) is a CMS built on Python with more than 20 years of history and experience. Plone has very interesting features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing and a @@ -20,17 +19,16 @@ sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets. -Volto exposes all these features and communicates with Plone via its -mature [REST API](https://github.com/plone/plone.restapi). Volto has the -ability of being highly themable and customizable. +Volto exposes all these features and communicates with Plone via its [REST API](https://github.com/plone/plone.restapi). +Volto has the ability of being easily extensible, themeable, and customizable. -Volto also supports other APIs like [Guillotina](https://guillotina.io/), a -Python resource management system, inspired by Plone and using the same basic -concepts like traversal, content types and permissions model. +It features the Pastanaga editor, a modern block-based content layout editor. It is extensible and customizable, so you can adapt the default blocks provided to match your requirements, or build new ones to cover them. -Last but not least, it also supports a [Volto Nodejs-based backend reference](https://github.com/plone/volto-reference-backend) API implementation that -demos how other systems could also use Volto to display and create content -through it. +Volto is extensible using add-ons. +You can build your own or choose from the community released ones: + +- [Volto Add-ons in NPM](https://www.npmjs.com/search?q=keywords%3Avolto-addon%2Cvolto) +- [Volto Awesome](https://github.com/collective/awesome-volto) ## Demo @@ -56,7 +54,7 @@ First get all the requirements installed on your system. - [Node.js LTS (16.x)](https://nodejs.org/) - [Python 3.8.x](https://python.org/) or -- [Docker](https://www.docker.com/get-started) (if using the Plone/Guillotina docker images) +- [Docker](https://www.docker.com/get-started) (if using the Plone docker images) ### Create a Volto project using the generator @@ -74,8 +72,6 @@ follow the prompts questions, provide `myvoltoproject` as project name then, whe ### Bootstrap the Plone API backend -We recommend Plone as backend of choice for Volto. - You can bootstrap a ready Docker Plone container with all the dependencies and ready for Volto use. We recommend to use the Plone docker builds based in `pip` [plone/plone-backend](https://github.com/plone/plone-backend) image: ```shell @@ -98,13 +94,13 @@ For the Plone 5 series latest released version (with Python 3) and above is reco The following KGS (or above) are also recommended, for any Plone version used. -#### KGS (known good versions) for backend packages +#### KGS (known good set of versions) for backend packages Volto always works best with latest versions of the "Frontend stack" or at least the recommended ones (in parenthesis) which are: -- plone.restapi (8.18.0) -- plone.rest (2.0.0a1) -- plone.volto (3.1.0a7) +- plone.restapi (8.21.2) +- plone.rest (2.0.0a3) +- plone.volto (4.0.0a3) and the following core packages since some features require up to date versions: @@ -167,7 +163,7 @@ Please create a new [issue](https://github.com/plone/volto/issues/new) or [pull ## Documentation -You can find the documentation in [https://docs.voltocms.com](https://docs.voltocms.com) +You can find the latest (in-progress) documentation in [https://6.dev-docs.plone.org/](https://6.dev-docs.plone.org/volto/index.html) ## Training @@ -222,14 +218,14 @@ JavaScript-centered trainings. ## Browser support -Volto works well with any modern (and updated) browser, including their mobile +Volto works well with any modern (evergreen) browser, including their mobile flavors: Chrome, Firefox, Safari, Edge. -We do not guarantee that browsers who were deprecated by their vendors (e.g. Internet Explorer 11) will be supported by Volto in the future. +We do not guarantee that deprecated browsers (e.g., Internet Explorer 11) are supported by Volto. Although proven possible, it's too great an effort to maintain. It is left to the integrator to provide support for it. ## Upgrades -You can find the upgrade guide here: https://docs.voltocms.com/upgrade-guide/ +You can find the upgrade guide here: https://6.dev-docs.plone.org/volto/upgrade-guide/index.html ## Volto Development @@ -248,14 +244,12 @@ git clone https://github.com/plone/volto.git yarn ``` -### Install a backend - -#### Plone (recommended) +### Install Plone backend -Either using a Docker image +Either using a Docker command: ```shell -docker run -it --rm --name=plone -p 8080:8080 -e SITE=Plone -e ADDONS="plone.volto" -e ZCML="plone.volto.cors" -e PROFILES="plone.volto:default-homepage" plone +docker run -it --rm --name=backend -p 8080:8080 -e SITE=Plone -e ADDONS="plone.restapi==8.21.2 plone.app.iterate==4.0.2 plone.rest==2.0.0a3 plone.app.vocabularies==4.3.0 plone.volto==4.0.0a3" -e PROFILES="plone.volto:default-homepage" plone/plone-backend ``` or using the convenience makefile command: @@ -272,36 +266,24 @@ Installation Documentation](https://docs.plone.org/manage/installing/installatio make build-backend ``` -#### Guillotina (experimental) +### Run frontend -It still doesn't support the full API/features that Plone provides. +Either using a Docker command: ```shell -docker-compose -f g-api/docker-compose.yml up -d +docker run -it --rm --name=volto --link backend -p 3000:3000 -e RAZZLE_INTERNAL_API_PATH=http://backend:8080/Plone -e RAZZLE_DEV_PROXY_API_PATH=http://backend:8080/Plone plone/plone-frontend:latest ``` or using the convenience makefile command: ```shell -make start-backend-docker-guillotina -``` - -### Run frontend - -Either using Docker - -```shell -docker run -it --rm --name=volto --link plone -p 3000:3000 plone/volto - -# or with Volto add-ons enabled: - -docker run -it --rm --name=volto --link plone -e ADDONS="volto-testaddon volto-slate:asDefault" -p 3000:3000 plone/volto +make start-frontend-docker ``` -or using the convenience yarn command: +or from the local repository code: ```shell -yarn start +yarn && yarn start ``` ### Browsing @@ -339,59 +321,55 @@ a dry-release command for testing the output is also available: yarn dry-release ``` -### Acceptance testing - -Volto uses [Cypress](https://www.cypress.io/) for browser-based acceptance testing. - -Run acceptance tests (with the Plone backend): +and alpha release can also be cut using: ```shell -yarn ci:cypress:run +yarn release-alpha ``` -Run acceptance tests (with the Guillotina backend): +### Acceptance testing -```shell -yarn ci:cypress:run:guillotina -``` +Volto uses [Cypress](https://www.cypress.io/) for browser-based acceptance testing. -#### Writing new acceptance tests +There are a number of fixtures available covering all the configuration use cases. These fixtures have both a specific backend and frontend configuration setup and a related set of tests. The CI infrastructure runs them all automatically on every push to a branch or PR. -When writing new acceptance tests you usually want to minimize the time it takes to run the tests. +The tests can be run in headless mode (same as the CI does), or within the Cypress user interface. The latter is the one that you run under development. -To do so, start three individual terminal sessions for running the Plone backend, the Volto frontend and the acceptance tests. +### How to run acceptance tests locally (during development) -Start the Plone backend: +When writing new acceptance tests, you usually want to minimize the time it takes to run the tests, while also being able to debug or inspect what's going on. -```shell -make start-test-backend -``` +To do so, start three individual terminal sessions for running the Plone backend, the Volto frontend, and the acceptance tests. -Start the Volto frontend: +1. Run the backend fixture + ```shell + make test-acceptance-server + ``` +2. Run the frontend fixture + ```shell + yarn cypress:start-frontend + ``` +3. Run the Cypress tests for that fixture + ```shell + yarn cypress:open + ``` -```shell -make start-test-frontend -``` +Available fixtures: -Open Cypress and start acceptance tests: +- Core (core or not special naming in the test commands) +- Multilingual (multilingual) +- Working Copy (workingCopy) +- Core Sandbox (coresandbox) -```shell -make start-test -``` +There are convenience commands for each of these fixtures. See `package.json` or `.github` CI setup for more information. -Go to the `cypress/integration` folder to see existing tests. +#### Writing new acceptance tests + +Go to the `cypress/tests` folder to see existing tests. There is a directory per fixture. This directory is hot reloaded with your changes as you write the tests. For more information on how to write Cypress tests: https://docs.cypress.io -#### Running the acceptance tests with Guillotina backend - -If you want to use Guillotina as backend to run the tests you should run: - -```shell -yarn ci:start-api-plone-guillotina -``` - ## Translations If you would like contribute to translate Volto into several languages, please, read the [Internationalization (i18n) guide](https://docs.voltocms.com/customizing/i18n/). @@ -402,6 +380,38 @@ If you would like contribute to translate Volto into several languages, please, +## Alternative backends + +Volto also supports other APIs like [Guillotina](https://guillotina.io/), a +Python resource management system, inspired by Plone and using the same basic +concepts like traversal, content types, and permissions model. + +Last but not least, it also supports a [Volto Node.js-based backend reference](https://github.com/plone/volto-reference-backend) API implementation that +demos how other systems could also use Volto to display and create content +through it. + +### Run a Guillotina backend + +*Disclaimer:* Guillotina doesn't support the full API/features that Plone provides. Contributors are welcome. + +```shell +docker-compose -f g-api/docker-compose.yml up -d +``` + +or using the convenience makefile command: + +```shell +make start-backend-docker-guillotina +``` + +### Running the acceptance tests with Guillotina backend + +If you want to use Guillotina as a backend to run the tests you should run: + +```shell +yarn ci:start-api-plone-guillotina +``` + ## License MIT License. Copyrights hold the [Plone Foundation](https://plone.org/foundation). diff --git a/api/versions.cfg b/api/versions.cfg index 9605d93eb4..92ce49442b 100644 --- a/api/versions.cfg +++ b/api/versions.cfg @@ -48,6 +48,3 @@ sortedcontainers = 2.4.0 # Added by buildout at 2022-02-14 13:57:43.277710 plone.volto = 4.0.0a3 - -# Added by buildout at 2022-02-14 13:57:43.277710 -plone.volto = 4.0.0a3 diff --git a/cypress/tests/multilingual/basic-multilingual.js b/cypress/tests/multilingual/basic-multilingual.js index 66ea2c3039..e9da23d1b8 100644 --- a/cypress/tests/multilingual/basic-multilingual.js +++ b/cypress/tests/multilingual/basic-multilingual.js @@ -65,21 +65,48 @@ describe('Basic multilingual Tests', () => { }); it('Manage translations menu', function () { - cy.navigate('/en'); + // Create translation + cy.get('#toolbar-add').click(); + cy.findByText('Translate to italiano').click(); + cy.findByText('Test document'); + cy.findByText('Traduci in Italiano'); + cy.get( + '.new-translation .documentFirstHeading > .public-DraftStyleDefault-block', + ).type('My IT page'); + cy.get('.new-translation .block.inner.text .public-DraftEditor-content') + .type('This is the italian text') + .get('span[data-text]') + .contains('This is the italian text') + .type('{enter}'); + cy.get('.new-translation .ui.basic.icon.button.block-add-button').click(); + cy.get('.ui.basic.icon.button.image').contains('Immagine').click(); + cy.get('#toolbar-save').click(); + cy.waitForResourceToLoad('@navigation'); + cy.waitForResourceToLoad('@breadcrumbs'); + cy.waitForResourceToLoad('@actions'); + cy.waitForResourceToLoad('@types'); + cy.waitForResourceToLoad('my-it-page'); + + cy.findByLabelText('Vai a english').click(); + + // The english doc should be shown + cy.get('#page-document').findByText('Test document'); + cy.findByLabelText('More').click(); cy.findByText('Manage Translations').click(); cy.findByText('Manage translations for'); - cy.findByText('/en'); - cy.findByText('/it'); + cy.findByText('/en/document'); + cy.findByText('/it/my-it-page'); // Unlink translation for italian cy.findByLabelText('Unlink translation for italiano').click(); - cy.contains('/it').should('not.exist'); + cy.contains('/it/my-it-page').should('not.exist'); // Link it again cy.findByLabelText('Link translation for italiano').click(); cy.findByLabelText('Back').click(); - cy.findByLabelText('Select Italiano').dblclick(); - cy.findByText('/it'); + cy.findByLabelText('Browse Italiano').click(); + cy.findByLabelText('Select My IT page').dblclick(); + cy.findByText('/it/my-it-page'); }); }); diff --git a/logos/VoltoLogoEra2-dark-mode.png b/logos/VoltoLogoEra2-dark-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..3a48da63a85eb37649247cbda04083852dbf41c6 GIT binary patch literal 6158 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 Q7bnEc$>aF5UkTU#4|QuB)&Kwi literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 37d1c172b0..4671d1b7a5 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,10 @@ "cypress:run:multilingual": "NODE_ENV=production CYPRESS_API=plone cypress run --config integrationFolder='cypress/tests/multilingual'", "cypress:run:workingCopy": "NODE_ENV=production CYPRESS_API=plone cypress run --config integrationFolder='cypress/tests/workingCopy'", "cypress:run:guillotina": "NODE_ENV=production CYPRESS_API=guillotina cypress run --config integrationFolder='cypress/tests/guillotina'", + "cypress:start-frontend": "RAZZLE_API_PATH=http://localhost:55001/plone yarn start", + "cypress:start-frontend-coresandbox": "ADDONS=coresandbox RAZZLE_API_PATH=http://localhost:55001/plone yarn start", + "cypress:start-frontend-multilingual": "ADDONS=coresandbox:multilingualFixture RAZZLE_API_PATH=http://localhost:55001/plone yarn start", + "cypress:start-frontend-workingCopy": "ADDONS=coresandbox:workingCopyFixture RAZZLE_API_PATH=http://localhost:55001/plone yarn start", "cy:install": "cypress install", "cy:test:fixture:setup": "node cypress/support/reset-fixture.js", "cy:test:fixture:teardown": "node cypress/support/reset-fixture.js teardown",