udata customizations for data.gouv.fr
Project description
⚙️ Udata customizations for data.gouv.fr made by Etalab ⚙️
- Notes on this repo
- Compatibility
- Installation
- Theme development
- 📖 Read more
Notes on this repo
This is a new version of udata-gouvfr This is a udata extension, you should read the udata documentation first.
Compatibility
udata-front requires Python 3.7+ and udata.
Installation
Install udata.
Remain in the same Python virtual environment and install udata-front:
pip install udata-front
Create a local configuration file udata.cfg
in your udata directory
(or where your UDATA_SETTINGS point out) or modify an existing one as following:
PLUGINS = ['front']
THEME = 'gouvfr'
Theme development
The front-end theme for the public facing website, is split into two parts :
- The Jinja templates are located inside
udata_front/theme/gouvfr/templates
. - The Less, Vue & other sourcefiles for the front-end are located in
theme
.
🚀 Getting started
Before you start your developper journey, you have to setup your python and/or javascript development tools.
It is recommended to have a workspace with the following layout:
$WORKSPACE
├── fs
├── udata
│ ├── ...
│ └── setup.py
├── udata-front
│ ├── ...
│ └── setup.py
└── udata.cfg
Modify your local udata.cfg
configuration file as following:
PLUGINS = ['front']
THEME = 'gouvfr'
🐍 Python development
🧱 Installing the python dependencies
Prepare a udata development environment.
Note that we're using pip-tools on this repository too.
The following steps use the same Python virtual environment as udata
.
Install udata-front
in development mode:
cd udata-front
pre-commit install
pip install -e . -r requirements/test.pip -r requirements/develop.pip
NB: the
udata.(in|pip)
files are used by the CI to stay in sync withudata
requirements. You shouldn't need to tinker with them on your local environment, but they might be updated by the CI when you make a Pull Request.
🚩 Starting the python development server
Simply run the udata project with udata-front loaded as a plugin:
cd udata
inv serve
☕ Javascript development
🏗 Installing the javascript dependencies
First, you need to use Node (version 14+) on your platform. You should consider installing NVM which uses the existing .nvmrc.
cd udata-front
nvm install
nvm use
npm install
And voilà ! ✨
💪 Starting the javascript development server
Simply run this command in the project directory :
npm start
This will start a development server that will listen to changes and automatically rebuild the project when needed.
Note that a webserver is started by Parcel (default port is 1234
), however we will not be using it as our CSS and JS files will be served by Jinja instead. More on that later.
👀 Other dev commands
Finally, we have a bunch of commands to make your life a tad easier.
You can execute udata-front
specific tasks from the udata-front
directory with invoke
. You can list available development commands with:
inv -l
Example commands:
i18n
: Extract translatable stringsi18nc
: Compile translationsqa
: Run a quality reporttest
: Run tests suite
Additionally, you can run javascript-related commands through npm run
.
build
: Builds the final CSS/JS files and the UI-Kit Documentation. You should probably use this one in production.build:app
: Builds the final CSS/JS files without the UI-Kitbuild:stylemark
: Builds the UI-Kit files and also the CSS/JS files but unminifed (do not use those static files in production)i18n:report
: Generates a report of the i18n missing and unused keysi18n:extract
: Same as above, but also automatically adds missing keys to translation filesclean
: Cleans Parcel cache. Use this if you stumble upon weird bugs to start anew.start
: Get to coding with live reload and things. Same asnpm run dev
test
: Runs the Cypress tests. More on that in the Tests section of this README.
🏰 General architecture
🚜 Jinja2 templates
Because udata is written in Python, its templating engine is Jinja 2.
This means that the HTML received by clients is built at runtime, for each request, using templates with {% block %}
tags and includes.
Those template are responsible for building the pages using layouts and blocks. Here are a few to get started (in udata_front/theme/gouvfr/templates
), from less specific to more specific :
raw.html
: contains the general html structure exposing abody
block where we can write our page's body. This template is also responsible for including the CSS and JS files.base.html
: contains some extra html structure exposing acontent
block for our page's content, and wraps it around the header and footer.header.html
andfooter.html
: standard header and footer block that will appear on each pagehome.html
: the home page template (duh)
🚲 Javascript
In order to add some interactivity to the project, we are using Vue 3 and some good old VanillaJS.
The JS assets are compiled in a single index.js
file that includes everything for every page. If the bundle size starts to grow a little bit too much, you might need to think about splitting it into separate files for each page.
🖼️ Style
We are using the DSFR to build our front-end components.
In addition we have a nice litle set of CSS Utilities to quickly build custom components, inspired by bootstrap, most of its documentation
lives in the css located in theme/less/
and is built using Stylemark, you can read the live documentation in udata_front/theme/stylemark/
after building it using npm run build-stylemark
.
You can access the UI-kit documentation by visiting the following route : /_stylemark/index.html
Whenever a components needs some special styling, you can find their corresponding definitions inside theme/less/specific/<component>
,
it's best if we can avoid having too much specific styling, but sometimes you just really need it.
🛠️ Build tools
This project uses Parcel 2 to build and transform our source files into nice bundles for browsers.
Its config can be found in the .parcelrc
file, as well as the package.json
entries.
Parcel does multiple custom things in this project :
- Transform the
.js
files into modern Javascript for browsers - Transform the
less
files into modern CSS usingPostCSS
- Bundle the
svg
used in the JS files - Copy the static assets when they change (config is in the
package.json
'sstaticFiles
key) - Build the Stylemark (UI-kit) documentation on file change
🏭 Javascript architecture
🏔️ Vue mounting
We are using the full build of VueJS that includes the compiler in order to compile templates directly in the browser.
There is a single VueJS app (in index.js
) that contains every component and plugins.
However, this app is mounted multiple times, on each DOM node containing a vuejs
class.
This allows us to mount the app only where it's needed, because each subsequent mount is more DOM to compile and thus has an impact on performance. Moreover, mounting to the smallest possible HTML allows us to prevent accidental XSS vulnerability by forbidding users to compile their content with the Vue engine.
In order to allow inter-component communication, a global event bus is available in the global app, under the $bus
variable.
You can emit events by using $bus.emit('event')
and components can listen to events by using $bus.on('event')
.
👩🔬 Tests
Tests are run in a headless browser using Cypress. Test definitions are located in the cypress/integration
directory.
Writing tests is very easy thanks to its syntax :
it("Displays the page title", () => {
cy.get("h1").should("be.visible");
});
Then, tests can be run using the following command :
npm run test
Cypress also comes with cypress-axe to allow for accessibility automated testing.
📖 Read more
Changelog
Current (in progress)
- Move template hook logic to udata and add oauth hooks #29
1.1.1 (2021-10-22)
- Update README to reflect front changes #17
- Add Participate banner in the footer #24
- Fix min-heigth used in posts images to center them #23
- Update dataset page with navigation quickfixes and add DSFR components #18
- Implement feedbacks on quickfixes #26
1.1.0 (2021-10-12)
- Add Cypress front-end tests stub #9
- Add read only mode back on frontend #10
- Fix RGAA criterion 1.2 Each decorative image is ignored by assistive technologies. #13
- Add a request membership action on organization page #12
- Unset vue delimiters used in html templates to prevent injections #11
- Fix temporal coverage order in search results metadata #14
- VueJS multiple mount points with a global event bus #15 #19
- Fix RGAA criterion 12.6 Block of contents from multiple pages can be reached or skipped #21
1.0.0 (2021-09-16)
- :warning: breaking change: Package renaming and new repository #1:
- udata-gouvfr is now udata-front
- Update feedparser following setuptools 58.0.2 release that drops support for
use_2to3
#6 - Show correct number of latest reuses on homepage #3
- Fix next value on login to prevent infinite loop #4 #8
Previous udata-gouvfr changelog
If you're migrating from udata-gouvfr, see previous changelog here
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for udata_front-1.1.2.dev1009-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | db250545e1298f3476e80c8a3571ddf1c231129a910ae9d2a287ddd6fe9db0ab |
|
MD5 | 7c0390dcfe8fad9bed19993f75ed51c7 |
|
BLAKE2b-256 | 5a3626414b1dee118aa66637efffd085e7abeef6a6e54c3116e3f719669eb562 |