├── .circleci └── config.yml ├── .editorconfig ├── .gitignore ├── .lighthouseci └── front-plugin-udata.cfg ├── .nvmrc ├── .postcssrc ├── .pre-commit-config.yaml ├── .pyup.yml ├── .storybook ├── custom-runner.js ├── load-theme-preview-preset.ts ├── main.ts ├── msw │ └── mockServiceWorker.js ├── preview-head.html └── preview.ts ├── CHANGELOG.md ├── LICENSE ├── MANIFEST.in ├── README.md ├── babel.cfg ├── bumpr.rc ├── coverage.rc ├── crowdin.yml ├── cypress.config.js ├── cypress ├── cypress.config.js ├── e2e │ ├── a11y.cy.js │ ├── datasets.cy.js │ ├── discussions.cy.js │ ├── home.cy.js │ ├── menu-search.cy.js │ └── register.cy.js ├── fixtures │ ├── dataset.json │ ├── example.json │ └── organization.json ├── support │ ├── commands.js │ ├── component-index.html │ ├── component.js │ └── e2e.js └── udata-front-e2e.cfg.example ├── jsconfig.json ├── lighthouserc.js ├── package-lock.json ├── package.json ├── pep8.rc ├── public └── mockServiceWorker.js ├── requirements ├── develop.in ├── develop.pip ├── install.in ├── install.pip ├── test.in ├── test.pip ├── udata.in └── udata.pip ├── setup.cfg ├── setup.py ├── svgo.config.js ├── tasks.py ├── test-runner-jest.config.js ├── tox.ini ├── tsconfig.json ├── udata-front-plugins-helper ├── README.md ├── package-lock.json ├── package.json ├── postcss.config.js ├── src │ ├── env.d.ts │ └── index.ts ├── test │ ├── index.test-d.ts │ └── index.test.ts ├── tsconfig.json └── vite.config.ts ├── udata_front ├── __init__.py ├── api.py ├── forms.py ├── frontend │ ├── __init__.py │ ├── error_handlers.py │ ├── helpers.py │ ├── markdown.py │ ├── menu_helpers.py │ └── resource_helpers.py ├── migrations │ ├── 2015-07-07-C3-datasets-titles.txt │ ├── 2015-07-10-dataconnexions-badges.js │ ├── 2015-09-14-dataconnexions-6.js │ ├── 2015-09-28-fix-maaf-harvester-doublouns.js │ ├── 2016-04-05-deactivate-datapublica.js │ ├── 2017-01-05-geozones-admin-levels-fr.js │ ├── 2017-08-04-fix-wrong-spatial-coverages.js │ ├── 2018-04-09-normalize-resource-filetype.js │ └── 2018-04-18-migrate-active-users.js ├── models.py ├── settings.py ├── static │ ├── c3 │ │ └── logo-c3.png │ ├── dataconnexions │ │ ├── dataconnexions6-logo-couleur.png │ │ ├── logo-blanc-rouge.png │ │ ├── logo-blanc.png │ │ ├── logo-couleur-rouge.png │ │ ├── logo-couleur.png │ │ └── logo-transparent.png │ ├── faq │ │ ├── integration │ │ │ └── exemple-integration-blog-etalab.png │ │ └── outils │ │ │ ├── 800px-CartePOI.png │ │ │ ├── 800px-Evolutionbio.png │ │ │ ├── 800px-Inventaire_du_patrimoine_Poitou-Chatrentes.png │ │ │ ├── 800px-Inventaire_du_patrimoine_vecteurs.png │ │ │ ├── 800px-OSM-cadastre.png │ │ │ ├── 800px-TileMill.png │ │ │ ├── Alluvial.png │ │ │ ├── Dependencies.png │ │ │ ├── Heatmap-salons-coiffure-paris-opendatasoft.png │ │ │ └── PAC2012.jpg │ ├── licences │ │ ├── ETALAB-Licence-Ouverte-v2.0.pdf │ │ ├── description-contenu.pdf │ │ ├── homologation-licences-2017-05-05.pdf │ │ ├── homologation-licences-2017-09-26.pdf │ │ ├── homologation-licences-2017-09-29.pdf │ │ ├── homologation-licences-2019-04-17.pdf │ │ ├── homologation-licences-2019-05-29.pdf │ │ ├── licence-d-utilisation-a-titre-gratuit-de-l-IGN-2017-05-05.pdf │ │ ├── licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-de-PI-2019-04-17.pdf │ │ ├── licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-du-RNCS-2019-04-17.pdf │ │ ├── licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2017-05-05.pdf │ │ └── licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2019-05-29.pdf │ ├── nec_mergitur │ │ └── logo_nec_mergitur.png │ └── openfield16 │ │ └── logo.jpg ├── tests │ ├── __init__.py │ ├── conftest.py │ ├── frontend │ │ ├── __init__.py │ │ └── test_frontend_filters.py │ ├── test_api.py │ ├── test_discussions.py │ ├── test_error.py │ ├── test_forms.py │ ├── test_security.py │ ├── test_sitemap.py │ ├── test_static_pages.py │ ├── tests.py │ └── views │ │ ├── __init__.py │ │ ├── test_dataset.py │ │ ├── test_oembed.py │ │ ├── test_organization.py │ │ ├── test_post.py │ │ ├── test_reuse.py │ │ ├── test_security.py │ │ ├── test_site.py │ │ ├── test_territories.py │ │ ├── test_topic.py │ │ └── test_user.py ├── theme │ ├── __init__.py │ ├── gouvfr │ │ ├── __init__.py │ │ ├── assets │ │ │ ├── fonts │ │ │ │ ├── Marianne-ExtraBold.woff │ │ │ │ ├── Marianne-ExtraBold.woff2 │ │ │ │ ├── Spectral-Italic.woff │ │ │ │ └── Spectral-Italic.woff2 │ │ │ ├── img │ │ │ │ ├── favicon.png │ │ │ │ ├── homepage │ │ │ │ │ ├── annuaire.png │ │ │ │ │ ├── annuaire@2x.png │ │ │ │ │ ├── datasets.png │ │ │ │ │ ├── datasets@2x.png │ │ │ │ │ ├── datasets@3x.png │ │ │ │ │ ├── dvf.png │ │ │ │ │ ├── dvf@2x.png │ │ │ │ │ ├── hero-background.png │ │ │ │ │ ├── reuses.png │ │ │ │ │ ├── reuses@2x.png │ │ │ │ │ └── reuses@3x.png │ │ │ │ ├── logo-social.png │ │ │ │ ├── organizations │ │ │ │ │ ├── cnil.png │ │ │ │ │ ├── cnil@2x.png │ │ │ │ │ ├── cnil@3x.png │ │ │ │ │ ├── googlemaps.png │ │ │ │ │ ├── googlemaps@2x.png │ │ │ │ │ ├── googlemaps@3x.png │ │ │ │ │ ├── insee.png │ │ │ │ │ ├── insee@2x.png │ │ │ │ │ ├── insee@3x.png │ │ │ │ │ ├── lemonde.png │ │ │ │ │ ├── lemonde@2x.png │ │ │ │ │ ├── lemonde@3x.png │ │ │ │ │ ├── liberation.png │ │ │ │ │ ├── liberation@2x.png │ │ │ │ │ ├── liberation@3x.png │ │ │ │ │ ├── minedu.png │ │ │ │ │ ├── minedu@2x.png │ │ │ │ │ ├── minedu@3x.png │ │ │ │ │ ├── spf.png │ │ │ │ │ ├── spf@2x.png │ │ │ │ │ ├── spf@3x.png │ │ │ │ │ ├── wikimedia.png │ │ │ │ │ ├── wikimedia@2x.png │ │ │ │ │ └── wikimedia@3x.png │ │ │ │ └── placeholders │ │ │ │ │ ├── author.png │ │ │ │ │ ├── dataset.png │ │ │ │ │ ├── news.png │ │ │ │ │ ├── organization.png │ │ │ │ │ └── reuse.png │ │ │ ├── js │ │ │ │ ├── Introduction.mdx │ │ │ │ ├── admin.ts │ │ │ │ ├── api │ │ │ │ │ ├── dataservices.ts │ │ │ │ │ ├── datasets.ts │ │ │ │ │ ├── discussions.ts │ │ │ │ │ ├── harvesters.ts │ │ │ │ │ ├── licenses.ts │ │ │ │ │ ├── me.ts │ │ │ │ │ ├── organizations.ts │ │ │ │ │ ├── posts.ts │ │ │ │ │ ├── reports.ts │ │ │ │ │ ├── resources.ts │ │ │ │ │ ├── reuses.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── users.ts │ │ │ │ ├── components │ │ │ │ │ ├── Accordion │ │ │ │ │ │ ├── Accordion.mdx │ │ │ │ │ │ ├── Accordion.stories.ts │ │ │ │ │ │ ├── Accordion.vue │ │ │ │ │ │ ├── AccordionGroup.mdx │ │ │ │ │ │ ├── AccordionGroup.stories.ts │ │ │ │ │ │ └── AccordionGroup.vue │ │ │ │ │ ├── AdminAddMember │ │ │ │ │ │ ├── AdminAddMemberButton.vue │ │ │ │ │ │ └── AdminAddMemberModal.vue │ │ │ │ │ ├── AdminBadge │ │ │ │ │ │ ├── AdminBadge.mdx │ │ │ │ │ │ ├── AdminBadge.stories.ts │ │ │ │ │ │ └── AdminBadge.vue │ │ │ │ │ ├── AdminContentWithTooltip │ │ │ │ │ │ ├── AdminContentWithTooltip.mdx │ │ │ │ │ │ ├── AdminContentWithTooltip.stories.ts │ │ │ │ │ │ └── AdminContentWithTooltip.vue │ │ │ │ │ ├── AdminDangerZone │ │ │ │ │ │ ├── AdminDangerZone.mdx │ │ │ │ │ │ ├── AdminDangerZone.stories.ts │ │ │ │ │ │ └── AdminDangerZone.vue │ │ │ │ │ ├── AdminEditMember │ │ │ │ │ │ ├── AdminEditMemberButton.vue │ │ │ │ │ │ └── AdminEditMemberModal.vue │ │ │ │ │ ├── AdminEmail │ │ │ │ │ │ └── AdminEmail.vue │ │ │ │ │ ├── AdminLoader │ │ │ │ │ │ ├── AdminLoader.stories.ts │ │ │ │ │ │ └── AdminLoader.vue │ │ │ │ │ ├── AdminMembershipRequest │ │ │ │ │ │ ├── AdminMembershipRequest.mdx │ │ │ │ │ │ ├── AdminMembershipRequest.stories.ts │ │ │ │ │ │ └── AdminMembershipRequest.vue │ │ │ │ │ ├── AdminSidebar │ │ │ │ │ │ ├── AdminSidebarLink │ │ │ │ │ │ │ ├── AdminSidebarLink.mdx │ │ │ │ │ │ │ ├── AdminSidebarLink.stories.ts │ │ │ │ │ │ │ └── AdminSidebarLink.vue │ │ │ │ │ │ └── AdminSidebarMenu │ │ │ │ │ │ │ ├── AdminSidebarMenu.mdx │ │ │ │ │ │ │ ├── AdminSidebarMenu.stories.ts │ │ │ │ │ │ │ └── AdminSidebarMenu.vue │ │ │ │ │ ├── AdminTable │ │ │ │ │ │ ├── AdminCommunityResourcesTable │ │ │ │ │ │ │ ├── AdminCommunityResourcesTable.stories.ts │ │ │ │ │ │ │ └── AdminCommunityResourcesTable.vue │ │ │ │ │ │ ├── AdminDatasetsTable │ │ │ │ │ │ │ ├── AdminDatasetsTable.stories.ts │ │ │ │ │ │ │ └── AdminDatasetsTable.vue │ │ │ │ │ │ ├── AdminDiscussionsTable │ │ │ │ │ │ │ └── AdminDiscussionsTable.vue │ │ │ │ │ │ ├── AdminReusesTable │ │ │ │ │ │ │ ├── AdminReusesTable.stories.ts │ │ │ │ │ │ │ └── AdminReusesTable.vue │ │ │ │ │ │ ├── AdminTable.mdx │ │ │ │ │ │ └── Table │ │ │ │ │ │ │ ├── AdminTable.stories.ts │ │ │ │ │ │ │ ├── AdminTable.vue │ │ │ │ │ │ │ └── AdminTableTh.vue │ │ │ │ │ ├── Alert │ │ │ │ │ │ ├── Alert.stories.js │ │ │ │ │ │ └── Alert.vue │ │ │ │ │ ├── Breadcrumb │ │ │ │ │ │ └── Breadcrumb.vue │ │ │ │ │ ├── ContactPointSelector │ │ │ │ │ │ ├── ContactPointSelector.stories.ts │ │ │ │ │ │ └── ContactPointSelector.vue │ │ │ │ │ ├── DataservicesSearch │ │ │ │ │ │ ├── DataservicesSearch.stories.ts │ │ │ │ │ │ └── DataservicesSearch.vue │ │ │ │ │ ├── Form │ │ │ │ │ │ ├── ActionCard │ │ │ │ │ │ │ ├── ActionCard.mdx │ │ │ │ │ │ │ ├── ActionCard.stories.js │ │ │ │ │ │ │ └── ActionCard.vue │ │ │ │ │ │ ├── ButtonLoader.vue │ │ │ │ │ │ ├── FileCard │ │ │ │ │ │ │ ├── FileCard.mdx │ │ │ │ │ │ │ ├── FileCard.stories.js │ │ │ │ │ │ │ ├── FileCard.vue │ │ │ │ │ │ │ └── FileLoader.vue │ │ │ │ │ │ ├── InputGroup │ │ │ │ │ │ │ ├── InputGroup.mdx │ │ │ │ │ │ │ ├── InputGroup.stories.ts │ │ │ │ │ │ │ └── InputGroup.vue │ │ │ │ │ │ ├── LinkedToAccordion │ │ │ │ │ │ │ ├── LinkedToAccordion.mdx │ │ │ │ │ │ │ ├── LinkedToAccordion.stories.js │ │ │ │ │ │ │ └── LinkedToAccordion.vue │ │ │ │ │ │ ├── NoSearchResults.vue │ │ │ │ │ │ ├── SelectGroup │ │ │ │ │ │ │ ├── SelectGroup.mdx │ │ │ │ │ │ │ ├── SelectGroup.stories.ts │ │ │ │ │ │ │ └── SelectGroup.vue │ │ │ │ │ │ ├── Stepper │ │ │ │ │ │ │ ├── Stepper.mdx │ │ │ │ │ │ │ ├── Stepper.stories.ts │ │ │ │ │ │ │ └── Stepper.vue │ │ │ │ │ │ └── UploadGroup │ │ │ │ │ │ │ ├── UploadGroup.mdx │ │ │ │ │ │ │ ├── UploadGroup.stories.js │ │ │ │ │ │ │ ├── UploadGroup.vue │ │ │ │ │ │ │ ├── UploadModal.vue │ │ │ │ │ │ │ ├── UploadModalButton.mdx │ │ │ │ │ │ │ ├── UploadModalButton.stories.ts │ │ │ │ │ │ │ └── UploadModalButton.vue │ │ │ │ │ ├── MarkAsNoSpam │ │ │ │ │ │ ├── MarkAsNoSpam.mdx │ │ │ │ │ │ ├── MarkAsNoSpam.stories.ts │ │ │ │ │ │ └── MarkAsNoSpam.vue │ │ │ │ │ ├── MarkdownEditor │ │ │ │ │ │ ├── EditorButton.vue │ │ │ │ │ │ ├── ImageModal │ │ │ │ │ │ │ ├── ImageModal.vue │ │ │ │ │ │ │ ├── ImageModalButton.mdx │ │ │ │ │ │ │ ├── ImageModalButton.stories.ts │ │ │ │ │ │ │ └── ImageModalButton.vue │ │ │ │ │ │ ├── InternalEditor.mdx │ │ │ │ │ │ ├── InternalEditor.stories.ts │ │ │ │ │ │ ├── InternalEditor.vue │ │ │ │ │ │ ├── MarkdownEditor.mdx │ │ │ │ │ │ ├── MarkdownEditor.stories.ts │ │ │ │ │ │ ├── MarkdownEditor.vue │ │ │ │ │ │ ├── Milkdown │ │ │ │ │ │ │ ├── LinkEdit │ │ │ │ │ │ │ │ ├── LinkEditTooltip.vue │ │ │ │ │ │ │ │ ├── configureEditTooltip.ts │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── insertLink.ts │ │ │ │ │ │ │ │ └── linkEditTooltip.ts │ │ │ │ │ │ │ ├── LinkPreview │ │ │ │ │ │ │ │ ├── LinkPreviewTooltip.vue │ │ │ │ │ │ │ │ ├── configurePreviewTooltip.ts │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── linkPreviewTooltip.ts │ │ │ │ │ │ │ │ ├── shouldShowPreview.ts │ │ │ │ │ │ │ │ └── useLinkPreview.ts │ │ │ │ │ │ │ ├── TableSelector │ │ │ │ │ │ │ │ ├── TableSelectorWidget.vue │ │ │ │ │ │ │ │ └── tableSelectorPlugin.ts │ │ │ │ │ │ │ ├── TableTooltip │ │ │ │ │ │ │ │ ├── TableTooltip.vue │ │ │ │ │ │ │ │ ├── TooltipButton.vue │ │ │ │ │ │ │ │ └── tableTooltip.ts │ │ │ │ │ │ │ ├── Tooltip │ │ │ │ │ │ │ │ ├── EditorTooltip.vue │ │ │ │ │ │ │ │ └── useTooltipProvider.ts │ │ │ │ │ │ │ └── dsfrColumnResizingPlugin.ts │ │ │ │ │ │ ├── ProseMirror │ │ │ │ │ │ │ ├── DSFRTableView.ts │ │ │ │ │ │ │ ├── findMarkPosition.ts │ │ │ │ │ │ │ ├── getMarkInNode.ts │ │ │ │ │ │ │ ├── getNodeAtCoords.ts │ │ │ │ │ │ │ └── handleLink.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── MultiSelect │ │ │ │ │ │ ├── MultiSelect.mdx │ │ │ │ │ │ ├── MultiSelect.stories.js │ │ │ │ │ │ └── MultiSelect.vue │ │ │ │ │ ├── ProducerSelector │ │ │ │ │ │ ├── ProducerSelector.stories.ts │ │ │ │ │ │ └── ProducerSelector.vue │ │ │ │ │ ├── RangePicker │ │ │ │ │ │ ├── RangePicker.mdx │ │ │ │ │ │ ├── RangePicker.stories.js │ │ │ │ │ │ └── RangePicker.vue │ │ │ │ │ ├── Report │ │ │ │ │ │ ├── ReportModal.vue │ │ │ │ │ │ ├── ReportModalButton.stories.ts │ │ │ │ │ │ ├── ReportModalButton.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Reuse │ │ │ │ │ │ ├── NewReuseLoader.vue │ │ │ │ │ │ ├── Reuse.mdx │ │ │ │ │ │ ├── Reuse.stories.ts │ │ │ │ │ │ ├── Reuse.vue │ │ │ │ │ │ ├── ReuseList.mdx │ │ │ │ │ │ ├── ReuseList.stories.ts │ │ │ │ │ │ ├── ReuseList.vue │ │ │ │ │ │ ├── ReuseLoader.vue │ │ │ │ │ │ └── loader.vue │ │ │ │ │ ├── SchemaSelect │ │ │ │ │ │ ├── SchemaSelect.mdx │ │ │ │ │ │ ├── SchemaSelect.stories.js │ │ │ │ │ │ └── SchemaSelect.vue │ │ │ │ │ ├── Sidemenu │ │ │ │ │ │ ├── Sidemenu.mdx │ │ │ │ │ │ ├── Sidemenu.stories.js │ │ │ │ │ │ └── Sidemenu.vue │ │ │ │ │ ├── Tooltip │ │ │ │ │ │ ├── Tooltip.stories.ts │ │ │ │ │ │ └── Tooltip.vue │ │ │ │ │ ├── Ui │ │ │ │ │ │ ├── Container │ │ │ │ │ │ │ ├── Container.mdx │ │ │ │ │ │ │ ├── Container.stories.js │ │ │ │ │ │ │ └── Container.vue │ │ │ │ │ │ ├── Required │ │ │ │ │ │ │ ├── Required.mdx │ │ │ │ │ │ │ ├── Required.stories.ts │ │ │ │ │ │ │ └── Required.vue │ │ │ │ │ │ └── RequiredExplanation │ │ │ │ │ │ │ ├── RequiredExplanation.mdx │ │ │ │ │ │ │ ├── RequiredExplanation.stories.ts │ │ │ │ │ │ │ └── RequiredExplanation.vue │ │ │ │ │ ├── UserDatasetList │ │ │ │ │ │ └── UserDatasetList.vue │ │ │ │ │ ├── UserReuseList │ │ │ │ │ │ └── UserReuseList.vue │ │ │ │ │ ├── charts │ │ │ │ │ │ └── chart.vue │ │ │ │ │ ├── dataset │ │ │ │ │ │ ├── CardLG.mdx │ │ │ │ │ │ ├── CardLG.stories.ts │ │ │ │ │ │ ├── CardList.mdx │ │ │ │ │ │ ├── CardList.stories.ts │ │ │ │ │ │ ├── CardList.vue │ │ │ │ │ │ ├── card-lg.vue │ │ │ │ │ │ ├── loader.vue │ │ │ │ │ │ └── resource │ │ │ │ │ │ │ ├── resourceFromHash.vue │ │ │ │ │ │ │ └── resources.vue │ │ │ │ │ ├── discussions │ │ │ │ │ │ ├── Author │ │ │ │ │ │ │ ├── Author.mdx │ │ │ │ │ │ │ ├── Author.stories.js │ │ │ │ │ │ │ └── Author.vue │ │ │ │ │ │ ├── Thread │ │ │ │ │ │ │ ├── Loader.vue │ │ │ │ │ │ │ ├── Thread.mdx │ │ │ │ │ │ │ ├── Thread.stories.ts │ │ │ │ │ │ │ └── Thread.vue │ │ │ │ │ │ ├── ThreadCreate │ │ │ │ │ │ │ ├── ThreadCreate.mdx │ │ │ │ │ │ │ ├── ThreadCreate.stories.js │ │ │ │ │ │ │ ├── ThreadCreate.vue │ │ │ │ │ │ │ ├── ThreadCreateButton.mdx │ │ │ │ │ │ │ ├── ThreadCreateButton.stories.js │ │ │ │ │ │ │ └── ThreadCreateButton.vue │ │ │ │ │ │ ├── ThreadReply │ │ │ │ │ │ │ ├── ThreadReply.mdx │ │ │ │ │ │ │ ├── ThreadReply.stories.js │ │ │ │ │ │ │ └── ThreadReply.vue │ │ │ │ │ │ ├── Threads.mdx │ │ │ │ │ │ ├── Threads.stories.ts │ │ │ │ │ │ └── Threads.vue │ │ │ │ │ ├── organization │ │ │ │ │ │ └── request-membership.vue │ │ │ │ │ ├── search │ │ │ │ │ │ ├── MenuSearch │ │ │ │ │ │ │ ├── MenuSearch.mdx │ │ │ │ │ │ │ ├── MenuSearch.stories.ts │ │ │ │ │ │ │ ├── MenuSearch.vue │ │ │ │ │ │ │ └── MenuSearchOption.vue │ │ │ │ │ │ ├── OrganizationSearch │ │ │ │ │ │ │ ├── OrganizationSearch.stories.ts │ │ │ │ │ │ │ ├── OrganizationSearch.vue │ │ │ │ │ │ │ ├── OrganizationSearchOption.stories.ts │ │ │ │ │ │ │ └── OrganizationSearchOption.vue │ │ │ │ │ │ ├── Search │ │ │ │ │ │ │ ├── Search.mdx │ │ │ │ │ │ │ ├── Search.stories.ts │ │ │ │ │ │ │ └── Search.vue │ │ │ │ │ │ └── search-input.vue │ │ │ │ │ ├── utils │ │ │ │ │ │ ├── DeleteButton │ │ │ │ │ │ │ ├── DeleteButton.mdx │ │ │ │ │ │ │ ├── DeleteButton.stories.ts │ │ │ │ │ │ │ ├── DeleteButton.vue │ │ │ │ │ │ │ ├── DeleteUserButton.stories.ts │ │ │ │ │ │ │ └── DeleteUserButton.vue │ │ │ │ │ │ ├── featured.vue │ │ │ │ │ │ ├── follow-button.vue │ │ │ │ │ │ ├── placeholder.vue │ │ │ │ │ │ └── search-bar.vue │ │ │ │ │ └── vanilla │ │ │ │ │ │ ├── accordion.ts │ │ │ │ │ │ ├── clipboard.js │ │ │ │ │ │ ├── dialog.js │ │ │ │ │ │ ├── fixup-tabs-on-startup.js │ │ │ │ │ │ ├── sort-search.js │ │ │ │ │ │ └── tabs.js │ │ │ │ ├── composables │ │ │ │ │ ├── admin │ │ │ │ │ │ └── useCurrentOrganization.ts │ │ │ │ │ ├── form │ │ │ │ │ │ ├── useFileValidation.js │ │ │ │ │ │ ├── useFileValidation.mdx │ │ │ │ │ │ ├── useFileValidation.stories.js │ │ │ │ │ │ ├── useFilesUpload.ts │ │ │ │ │ │ └── useFunctionalState.js │ │ │ │ │ ├── useActiveDescendant.ts │ │ │ │ │ ├── useCollapse.ts │ │ │ │ │ ├── useDebouncedRef.js │ │ │ │ │ ├── useDropdown.ts │ │ │ │ │ ├── useHash.ts │ │ │ │ │ ├── useIdFromHash.js │ │ │ │ │ ├── useLicense.ts │ │ │ │ │ ├── useSearchUrl.ts │ │ │ │ │ ├── useToast.js │ │ │ │ │ └── useUid.js │ │ │ │ ├── config.ts │ │ │ │ ├── dsfr.ts │ │ │ │ ├── helpers.ts │ │ │ │ ├── i18n.ts │ │ │ │ ├── index.ts │ │ │ │ ├── locales │ │ │ │ │ ├── de.json │ │ │ │ │ ├── en.json │ │ │ │ │ ├── es.json │ │ │ │ │ ├── fr.json │ │ │ │ │ ├── it.json │ │ │ │ │ ├── pt.json │ │ │ │ │ └── sr.json │ │ │ │ ├── plugins │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── auth.ts │ │ │ │ │ └── eventbus.ts │ │ │ │ ├── sentry.ts │ │ │ │ └── types.ts │ │ │ └── less │ │ │ │ ├── components │ │ │ │ ├── accordion.less │ │ │ │ ├── alert.less │ │ │ │ ├── animations.less │ │ │ │ ├── badge.less │ │ │ │ ├── borders.less │ │ │ │ ├── breadcrumbs.less │ │ │ │ ├── buttons.less │ │ │ │ ├── callout.less │ │ │ │ ├── card.less │ │ │ │ ├── dataset.less │ │ │ │ ├── discussions.less │ │ │ │ ├── embed.less │ │ │ │ ├── follow-button.less │ │ │ │ ├── forms.less │ │ │ │ ├── highlight.less │ │ │ │ ├── logo.less │ │ │ │ ├── markdown-editor.less │ │ │ │ ├── markdown.less │ │ │ │ ├── multiselect.less │ │ │ │ ├── notice.less │ │ │ │ ├── organization-search.less │ │ │ │ ├── pagination.less │ │ │ │ ├── quality-score.less │ │ │ │ ├── quote.less │ │ │ │ ├── rangepicker.less │ │ │ │ ├── read-more.less │ │ │ │ ├── search-input.less │ │ │ │ ├── segmented-control.less │ │ │ │ ├── sidemenu.less │ │ │ │ ├── stepper.less │ │ │ │ ├── summary.less │ │ │ │ ├── table.less │ │ │ │ ├── tabs-full-page.less │ │ │ │ ├── tabs-home.less │ │ │ │ ├── tabs-no-js.less │ │ │ │ ├── tabs.less │ │ │ │ ├── tags.less │ │ │ │ ├── tile.less │ │ │ │ ├── toast.less │ │ │ │ ├── tooltip.less │ │ │ │ └── well.less │ │ │ │ ├── content │ │ │ │ ├── colors.less │ │ │ │ ├── hero-image.less │ │ │ │ ├── links.less │ │ │ │ ├── nav-link.less │ │ │ │ ├── not-enlarged-links.less │ │ │ │ ├── typography.less │ │ │ │ └── visibility.less │ │ │ │ ├── examples.css │ │ │ │ ├── font.less │ │ │ │ ├── icons.less │ │ │ │ ├── images │ │ │ │ ├── chevron.svg │ │ │ │ └── logo.png │ │ │ │ ├── layout │ │ │ │ ├── grid.less │ │ │ │ ├── responsive.less │ │ │ │ └── rhythm.less │ │ │ │ ├── override.less │ │ │ │ ├── specific │ │ │ │ ├── buttons-venti.less │ │ │ │ ├── footer.less │ │ │ │ ├── header.less │ │ │ │ ├── hero.less │ │ │ │ ├── metrics-bar.less │ │ │ │ ├── oauth.less │ │ │ │ ├── oembed.less │ │ │ │ ├── search.less │ │ │ │ └── translate.less │ │ │ │ ├── style.less │ │ │ │ ├── theme.css │ │ │ │ └── variables.less │ │ ├── babel.cfg │ │ ├── datagouv-components │ │ │ ├── .env │ │ │ ├── .gitignore │ │ │ ├── .npmrc │ │ │ ├── .nvmrc │ │ │ ├── .storybook │ │ │ │ ├── main.ts │ │ │ │ ├── manager.ts │ │ │ │ ├── msw-requests.ts │ │ │ │ ├── msw │ │ │ │ │ └── mockServiceWorker.js │ │ │ │ ├── preview.tsx │ │ │ │ ├── previewBody.ts │ │ │ │ └── theme.ts │ │ │ ├── CHANGELOG.md │ │ │ ├── README.md │ │ │ ├── demo-vue-router │ │ │ │ ├── Details.vue │ │ │ │ ├── View.vue │ │ │ │ ├── index.html │ │ │ │ └── index.ts │ │ │ ├── demo │ │ │ │ ├── App.vue │ │ │ │ └── index.ts │ │ │ ├── index.html │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── postcss.config.js │ │ │ ├── src │ │ │ │ ├── api │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── frequency.ts │ │ │ │ │ ├── granularity.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── licenses.ts │ │ │ │ │ ├── reuses.ts │ │ │ │ │ ├── schemas.ts │ │ │ │ │ ├── tabularApi.ts │ │ │ │ │ └── zones.ts │ │ │ │ ├── assets │ │ │ │ │ └── img │ │ │ │ │ │ └── placeholders │ │ │ │ │ │ ├── author.png │ │ │ │ │ │ ├── dataset.png │ │ │ │ │ │ ├── news.png │ │ │ │ │ │ ├── organization.png │ │ │ │ │ │ └── reuse.png │ │ │ │ ├── components │ │ │ │ │ ├── AppLink │ │ │ │ │ │ ├── AppLink.stories.ts │ │ │ │ │ │ ├── AppLink.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AsyncTextClamp │ │ │ │ │ │ └── AsyncTextClamp.vue │ │ │ │ │ ├── Avatar │ │ │ │ │ │ ├── Avatar.stories.ts │ │ │ │ │ │ ├── Avatar.vue │ │ │ │ │ │ ├── AvatarWithName.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── CopyButton │ │ │ │ │ │ ├── CopyButton.stories.ts │ │ │ │ │ │ ├── CopyButton.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── DataserviceCard │ │ │ │ │ │ ├── DataserviceCard.stories.ts │ │ │ │ │ │ ├── DataserviceCard.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── DataserviceLinks │ │ │ │ │ │ ├── DataserviceLinks.stories.ts │ │ │ │ │ │ ├── DataserviceLinks.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── DatasetCard │ │ │ │ │ │ ├── DatasetCard.stories.ts │ │ │ │ │ │ ├── DatasetCard.vue │ │ │ │ │ │ ├── TestComponent.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── DescriptionList │ │ │ │ │ │ ├── DescriptionDetails.stories.ts │ │ │ │ │ │ ├── DescriptionDetails.vue │ │ │ │ │ │ ├── DescriptionList.stories.ts │ │ │ │ │ │ ├── DescriptionList.vue │ │ │ │ │ │ ├── DescriptionTerm.stories.ts │ │ │ │ │ │ └── DescriptionTerm.vue │ │ │ │ │ ├── ExtraAccordion │ │ │ │ │ │ ├── ExtraAccordion.stories.ts │ │ │ │ │ │ ├── ExtraAccordion.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── InformationPanel │ │ │ │ │ │ ├── InformationPanel.stories.ts │ │ │ │ │ │ ├── InformationPanel.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Organization │ │ │ │ │ │ ├── OrganizationNameWithCertificate.stories.ts │ │ │ │ │ │ ├── OrganizationNameWithCertificate.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Owner │ │ │ │ │ │ ├── OwnerType.stories.ts │ │ │ │ │ │ ├── OwnerType.vue │ │ │ │ │ │ ├── OwnerTypeIcon.stories.ts │ │ │ │ │ │ ├── OwnerTypeIcon.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Pagination │ │ │ │ │ │ ├── Pagination.stories.ts │ │ │ │ │ │ ├── Pagination.vue │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── paginate.ts │ │ │ │ │ ├── Placeholder │ │ │ │ │ │ ├── Placeholder.stories.ts │ │ │ │ │ │ ├── Placeholder.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── QualityComponent │ │ │ │ │ │ ├── QualityComponent.stories.ts │ │ │ │ │ │ ├── QualityComponent.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── QualityComponentInline │ │ │ │ │ │ ├── QualityComponentInline.stories.ts │ │ │ │ │ │ ├── QualityComponentInline.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── QualityItem │ │ │ │ │ │ ├── QualityItem.stories.ts │ │ │ │ │ │ ├── QualityItem.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── QualityItemWarning │ │ │ │ │ │ ├── QualityItemWarning.stories.ts │ │ │ │ │ │ ├── QualityItemWarning.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── QualityScore │ │ │ │ │ │ ├── QualityScore.stories.ts │ │ │ │ │ │ ├── QualityScore.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ReadMore │ │ │ │ │ │ ├── ReadMore.stories.ts │ │ │ │ │ │ ├── ReadMore.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ResourceAccordion │ │ │ │ │ │ ├── DataStructure │ │ │ │ │ │ │ ├── DataStructure.stories.ts │ │ │ │ │ │ │ ├── DataStructure.vue │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── EditButton.stories.ts │ │ │ │ │ │ ├── EditButton.vue │ │ │ │ │ │ ├── Loader.stories.ts │ │ │ │ │ │ ├── Loader.vue │ │ │ │ │ │ ├── Metadata.vue │ │ │ │ │ │ ├── Preview │ │ │ │ │ │ │ ├── Loader.vue │ │ │ │ │ │ │ ├── Preview.stories.ts │ │ │ │ │ │ │ ├── Preview.vue │ │ │ │ │ │ │ ├── france.svg │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ResourceAccordion.stories.ts │ │ │ │ │ │ ├── ResourceAccordion.vue │ │ │ │ │ │ ├── ResourceIcon.vue │ │ │ │ │ │ ├── SchemaBadge.vue │ │ │ │ │ │ ├── SchemaLoader.stories.ts │ │ │ │ │ │ ├── SchemaLoader.vue │ │ │ │ │ │ ├── Swagger.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ReuseCard │ │ │ │ │ │ ├── ReuseCard.stories.ts │ │ │ │ │ │ ├── ReuseCard.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SmallChart │ │ │ │ │ │ ├── SmallChart.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── StatBox │ │ │ │ │ │ ├── StatBox.stories.ts │ │ │ │ │ │ ├── StatBox.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Tabs │ │ │ │ │ │ ├── Tab.vue │ │ │ │ │ │ ├── TabGroup.vue │ │ │ │ │ │ ├── TabList.vue │ │ │ │ │ │ ├── TabPanel.vue │ │ │ │ │ │ ├── TabPanels.vue │ │ │ │ │ │ └── Tabs.stories.ts │ │ │ │ │ ├── Toggletip │ │ │ │ │ │ ├── Toggletip.mdx │ │ │ │ │ │ ├── Toggletip.stories.ts │ │ │ │ │ │ ├── Toggletip.vue │ │ │ │ │ │ ├── ToggletipButton.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Well │ │ │ │ │ │ ├── Well.stories.ts │ │ │ │ │ │ ├── Well.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── accordion.less │ │ │ │ │ ├── badge.less │ │ │ │ │ ├── base.less │ │ │ │ │ ├── border.less │ │ │ │ │ ├── button.less │ │ │ │ │ ├── dataset.less │ │ │ │ │ ├── embed.less │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── links.less │ │ │ │ │ ├── logo.less │ │ │ │ │ ├── pagination.less │ │ │ │ │ ├── quality-score.less │ │ │ │ │ ├── read-more.less │ │ │ │ │ ├── reuse.less │ │ │ │ │ ├── segmented-control.less │ │ │ │ │ ├── table.less │ │ │ │ │ ├── tabs.less │ │ │ │ │ ├── toggletip.less │ │ │ │ │ ├── visibility.less │ │ │ │ │ └── well.less │ │ │ │ ├── composables │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── organizations │ │ │ │ │ │ ├── useOrganizationCertified.ts │ │ │ │ │ │ ├── useOrganizationType.ts │ │ │ │ │ │ └── useOwnerName.ts │ │ │ │ │ ├── useAccordion.ts │ │ │ │ │ ├── useLicense.ts │ │ │ │ │ ├── useOEmbed.ts │ │ │ │ │ ├── useReuseType.ts │ │ │ │ │ ├── useTabs.ts │ │ │ │ │ └── useToast.ts │ │ │ │ ├── config.ts │ │ │ │ ├── helpers │ │ │ │ │ ├── getUserAvatar.ts │ │ │ │ │ ├── i18n.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── markdown.ts │ │ │ │ │ ├── matomo.ts │ │ │ │ │ ├── resources.ts │ │ │ │ │ ├── throwOnNever.ts │ │ │ │ │ └── toggleAccordion.ts │ │ │ │ ├── index.ts │ │ │ │ ├── locales │ │ │ │ │ ├── de.json │ │ │ │ │ ├── en.json │ │ │ │ │ ├── es.json │ │ │ │ │ ├── fr.json │ │ │ │ │ ├── it.json │ │ │ │ │ ├── pt.json │ │ │ │ │ └── sr.json │ │ │ │ ├── types │ │ │ │ │ ├── badges.ts │ │ │ │ │ ├── contact_point.ts │ │ │ │ │ ├── dataservices.ts │ │ │ │ │ ├── datasets.ts │ │ │ │ │ ├── frequency.ts │ │ │ │ │ ├── granularity.ts │ │ │ │ │ ├── harvest.ts │ │ │ │ │ ├── licenses.ts │ │ │ │ │ ├── organizations.ts │ │ │ │ │ ├── owned.ts │ │ │ │ │ ├── resources.ts │ │ │ │ │ ├── reuses.ts │ │ │ │ │ ├── ui.ts │ │ │ │ │ └── users.ts │ │ │ │ └── vite-env.d.ts │ │ │ ├── test-runner-jest.config.js │ │ │ ├── tsconfig.json │ │ │ └── vite.config.ts │ │ ├── info.json │ │ ├── templates │ │ │ ├── api │ │ │ │ ├── admin.html │ │ │ │ ├── card.html │ │ │ │ ├── oauth_authorize.html │ │ │ │ └── oauth_error.html │ │ │ ├── banners │ │ │ │ ├── feedback.html │ │ │ │ ├── generic.html │ │ │ │ └── read-only.html │ │ │ ├── base.html │ │ │ ├── carousel.html │ │ │ ├── comments │ │ │ │ └── dataset_archived.txt │ │ │ ├── contact_point.html │ │ │ ├── dataservice │ │ │ │ ├── card.html │ │ │ │ ├── display.html │ │ │ │ ├── feed_item.html │ │ │ │ └── list.html │ │ │ ├── dataset-apis.html │ │ │ ├── dataset │ │ │ │ ├── card-lg.html │ │ │ │ ├── card-sm.html │ │ │ │ ├── card-xs.html │ │ │ │ ├── display.html │ │ │ │ ├── feed_item.html │ │ │ │ ├── followers.html │ │ │ │ ├── list.html │ │ │ │ ├── oembed.html │ │ │ │ ├── resource │ │ │ │ │ └── card.html │ │ │ │ └── search-results.html │ │ │ ├── embed-dataset.html │ │ │ ├── errors │ │ │ │ ├── 400.html │ │ │ │ ├── 403.html │ │ │ │ ├── 404.html │ │ │ │ ├── 410.html │ │ │ │ ├── 500.html │ │ │ │ └── base.html │ │ │ ├── follow │ │ │ │ └── follower-card.html │ │ │ ├── footer.html │ │ │ ├── header.html │ │ │ ├── home.html │ │ │ ├── layouts │ │ │ │ ├── 1-column.html │ │ │ │ ├── 2-columns.html │ │ │ │ └── center-panel.html │ │ │ ├── macros │ │ │ │ ├── banner_info.html │ │ │ │ ├── banner_warning.html │ │ │ │ ├── breadcrumb.html │ │ │ │ ├── certified.html │ │ │ │ ├── dataset_information.html │ │ │ │ ├── delete.html │ │ │ │ ├── description_list.html │ │ │ │ ├── follow.html │ │ │ │ ├── forms.html │ │ │ │ ├── integrate.html │ │ │ │ ├── leaflet.html │ │ │ │ ├── metadata.html │ │ │ │ ├── organization_name_with_certificate.html │ │ │ │ ├── paginator.html │ │ │ │ ├── quality_item.html │ │ │ │ ├── quality_item_warning.html │ │ │ │ ├── quality_score.html │ │ │ │ ├── quality_score_inline.html │ │ │ │ ├── quality_score_toggletip.html │ │ │ │ ├── quality_score_with_warning_below.html │ │ │ │ ├── report.html │ │ │ │ ├── search.html │ │ │ │ ├── sort_search.html │ │ │ │ ├── toggletip.html │ │ │ │ ├── tooltip.html │ │ │ │ └── uploader.html │ │ │ ├── mail │ │ │ │ ├── account_deleted.html │ │ │ │ ├── account_deleted.txt │ │ │ │ ├── badge_added_certified.html │ │ │ │ ├── badge_added_certified.txt │ │ │ │ ├── badge_added_public_service.html │ │ │ │ ├── badge_added_public_service.txt │ │ │ │ ├── base.html │ │ │ │ ├── base.txt │ │ │ │ ├── button.html │ │ │ │ ├── discussion_closed.html │ │ │ │ ├── discussion_closed.txt │ │ │ │ ├── frequency_reminder.html │ │ │ │ ├── frequency_reminder.txt │ │ │ │ ├── layouts │ │ │ │ │ ├── 1-column.html │ │ │ │ │ ├── 2-columns.html │ │ │ │ │ └── center-panel.html │ │ │ │ ├── membership_refused.html │ │ │ │ ├── membership_refused.txt │ │ │ │ ├── membership_request.html │ │ │ │ ├── membership_request.txt │ │ │ │ ├── new_discussion.html │ │ │ │ ├── new_discussion.txt │ │ │ │ ├── new_discussion_comment.html │ │ │ │ ├── new_discussion_comment.txt │ │ │ │ ├── new_follower.html │ │ │ │ ├── new_follower.txt │ │ │ │ ├── new_follower_org.html │ │ │ │ ├── new_follower_org.txt │ │ │ │ ├── new_member.html │ │ │ │ ├── new_member.txt │ │ │ │ ├── new_reuse.html │ │ │ │ ├── new_reuse.txt │ │ │ │ ├── security │ │ │ │ │ ├── change_notice.html │ │ │ │ │ ├── change_notice.txt │ │ │ │ │ ├── confirmation_instructions.html │ │ │ │ │ ├── confirmation_instructions.txt │ │ │ │ │ ├── login_instructions.html │ │ │ │ │ ├── login_instructions.txt │ │ │ │ │ ├── reset_instructions.html │ │ │ │ │ ├── reset_instructions.txt │ │ │ │ │ ├── reset_notice.html │ │ │ │ │ ├── reset_notice.txt │ │ │ │ │ ├── welcome.html │ │ │ │ │ └── welcome.txt │ │ │ │ ├── test.html │ │ │ │ └── test.txt │ │ │ ├── metrics.html │ │ │ ├── newsletter.html │ │ │ ├── oembed.html │ │ │ ├── organization │ │ │ │ ├── card.html │ │ │ │ ├── display.html │ │ │ │ ├── list.html │ │ │ │ ├── member-card.html │ │ │ │ ├── oembed.html │ │ │ │ └── producer-name-with-logo.html │ │ │ ├── page.html │ │ │ ├── post │ │ │ │ ├── display.html │ │ │ │ ├── list.html │ │ │ │ ├── search-result.html │ │ │ │ └── subnav.html │ │ │ ├── raw.html │ │ │ ├── reuse │ │ │ │ ├── card.html │ │ │ │ ├── display.html │ │ │ │ ├── feed_item.html │ │ │ │ ├── list.html │ │ │ │ ├── mail_card.html │ │ │ │ └── oembed.html │ │ │ ├── security │ │ │ │ ├── change_email.html │ │ │ │ ├── change_password.html │ │ │ │ ├── forgot_password.html │ │ │ │ ├── login_user.html │ │ │ │ ├── register_user.html │ │ │ │ ├── reset_password.html │ │ │ │ └── send_confirmation.html │ │ │ ├── site │ │ │ │ └── dashboard.html │ │ │ ├── subnav-community.html │ │ │ ├── suivi.html │ │ │ ├── svg │ │ │ │ ├── administration.svg │ │ │ │ ├── arrow-right.svg │ │ │ │ ├── blank_state │ │ │ │ │ ├── discussion.svg │ │ │ │ │ ├── harvester.svg │ │ │ │ │ ├── resource.svg │ │ │ │ │ └── reuse.svg │ │ │ │ ├── burger-menu.svg │ │ │ │ ├── copy.svg │ │ │ │ ├── edit.svg │ │ │ │ ├── filter.svg │ │ │ │ ├── illustrations │ │ │ │ │ ├── dataservice.svg │ │ │ │ │ ├── dataset.svg │ │ │ │ │ ├── draggable.svg │ │ │ │ │ ├── edit.svg │ │ │ │ │ ├── france_with_magnifying_glass.svg │ │ │ │ │ ├── magnifying_glass.svg │ │ │ │ │ ├── newspaper.svg │ │ │ │ │ ├── organization.svg │ │ │ │ │ ├── reuse.svg │ │ │ │ │ ├── schema.svg │ │ │ │ │ ├── search.svg │ │ │ │ │ ├── search2.svg │ │ │ │ │ └── success.svg │ │ │ │ ├── logotype-white.svg │ │ │ │ ├── logotype.svg │ │ │ │ ├── marianne.svg │ │ │ │ ├── preview.svg │ │ │ │ ├── private.svg │ │ │ │ ├── resources │ │ │ │ │ ├── archive.svg │ │ │ │ │ ├── code.svg │ │ │ │ │ ├── documentation.svg │ │ │ │ │ ├── file.svg │ │ │ │ │ ├── globe.svg │ │ │ │ │ ├── link.svg │ │ │ │ │ ├── map.svg │ │ │ │ │ └── table.svg │ │ │ │ ├── search.svg │ │ │ │ ├── search │ │ │ │ │ ├── dataset.svg │ │ │ │ │ ├── empty.svg │ │ │ │ │ ├── organization.svg │ │ │ │ │ └── reuse.svg │ │ │ │ ├── socials │ │ │ │ │ ├── bluesky.svg │ │ │ │ │ ├── github.svg │ │ │ │ │ ├── linkedin.svg │ │ │ │ │ └── twitter.svg │ │ │ │ └── triangle.svg │ │ │ ├── terms.html │ │ │ ├── territories │ │ │ │ ├── commune.html │ │ │ │ ├── departement.html │ │ │ │ ├── home.html │ │ │ │ ├── region.html │ │ │ │ ├── search-result.html │ │ │ │ └── territory.html │ │ │ ├── topic │ │ │ │ ├── browse.html │ │ │ │ ├── datasets.html │ │ │ │ ├── display.html │ │ │ │ └── reuses.html │ │ │ └── user │ │ │ │ ├── activity.html │ │ │ │ ├── base.html │ │ │ │ ├── card.html │ │ │ │ ├── datasets.html │ │ │ │ ├── followers.html │ │ │ │ ├── following.html │ │ │ │ ├── list.html │ │ │ │ ├── mail_card.html │ │ │ │ └── reuses.html │ │ └── translations │ │ │ ├── de │ │ │ └── LC_MESSAGES │ │ │ │ └── gouvfr.po │ │ │ ├── es │ │ │ └── LC_MESSAGES │ │ │ │ └── gouvfr.po │ │ │ ├── fr │ │ │ └── LC_MESSAGES │ │ │ │ └── gouvfr.po │ │ │ ├── gouvfr.pot │ │ │ ├── it │ │ │ └── LC_MESSAGES │ │ │ │ └── gouvfr.po │ │ │ ├── pt │ │ │ └── LC_MESSAGES │ │ │ │ └── gouvfr.po │ │ │ └── sr │ │ │ └── LC_MESSAGES │ │ │ └── gouvfr.po │ └── license.txt └── views │ ├── __init__.py │ ├── base.py │ ├── dataservice.py │ ├── dataset.py │ ├── follower.py │ ├── gouvfr.py │ ├── oembed.py │ ├── organization.py │ ├── post.py │ ├── proconnect.py │ ├── reuse.py │ ├── site.py │ ├── territories.py │ ├── topic.py │ └── user.py ├── vite.config.dev.ts ├── vite.config.ts └── vue-i18n-extract.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | insert_final_newline = true 5 | charset = utf-8 6 | trim_trailing_whitespace = true 7 | end_of_line = lf 8 | 9 | [*.{js,json,ts,vue}] 10 | indent_style = space 11 | indent_size = 2 12 | 13 | [*.less] 14 | indent_style = space 15 | indent_size = 4 16 | -------------------------------------------------------------------------------- /.lighthouseci/front-plugin-udata.cfg: -------------------------------------------------------------------------------- 1 | PLUGINS = ['front'] 2 | THEME = 'gouvfr' 3 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.19.0 2 | -------------------------------------------------------------------------------- /.postcssrc: -------------------------------------------------------------------------------- 1 | { 2 | "modules": false, 3 | "plugins": { 4 | "postcss-normalize": {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/jazzband/pip-tools 3 | rev: 7.4.1 4 | hooks: 5 | - id: pip-compile 6 | name: pip-compile install.in 7 | args: [requirements/install.in, --output-file=requirements/install.pip] 8 | files: ^requirements/install\.(in|pip)$ 9 | - id: pip-compile 10 | name: pip-compile test.in 11 | args: [requirements/test.in, --output-file=requirements/test.pip] 12 | files: ^requirements/(install|test)\.(in|pip)$ 13 | - id: pip-compile 14 | name: pip-compile develop.in 15 | args: [requirements/develop.in, --output-file=requirements/develop.pip] 16 | files: ^requirements/(install|test|develop)\.(in|pip)$ 17 | -------------------------------------------------------------------------------- /.pyup.yml: -------------------------------------------------------------------------------- 1 | --- 2 | branch: master 3 | pin: False 4 | update: all 5 | label_prs: update 6 | -------------------------------------------------------------------------------- /.storybook/custom-runner.js: -------------------------------------------------------------------------------- 1 | const PlaywrightRunner = 2 | require('jest-playwright-preset/lib/PlaywrightRunner').default 3 | 4 | class SerialRunner extends PlaywrightRunner { 5 | constructor(...args) { 6 | super(...args) 7 | this.isSerial = true 8 | } 9 | } 10 | 11 | module.exports = SerialRunner 12 | -------------------------------------------------------------------------------- /.storybook/load-theme-preview-preset.ts: -------------------------------------------------------------------------------- 1 | import { getTheme } from "../vite.config"; 2 | 3 | export function previewAnnotations(entry = []) { 4 | const theme = getTheme(); 5 | return [...entry, require.resolve(`../udata_front/theme/${theme}/assets/js/.storybook/preview.ts`)]; 6 | } 7 | 8 | export function managerEntries(entry = []) { 9 | const theme = getTheme(); 10 | return [...entry, require.resolve(`../udata_front/theme/${theme}/assets/js/.storybook/manager.js`)]; 11 | } 12 | 13 | export default { managerEntries, previewAnnotations } 14 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE MANIFEST.in README.md CHANGELOG.md 2 | 3 | recursive-include udata_front * 4 | 5 | global-exclude *~ *.egg *.pyc 6 | -------------------------------------------------------------------------------- /babel.cfg: -------------------------------------------------------------------------------- 1 | [ignore: **/static/**] 2 | 3 | [python: **.py] 4 | 5 | [jinja2: **/theme/*/templates/**.html] 6 | encoding = utf-8 7 | silent = false 8 | extensions = flask_caching.jinja2ext.CacheExtension 9 | -------------------------------------------------------------------------------- /bumpr.rc: -------------------------------------------------------------------------------- 1 | [bumpr] 2 | file = udata_front/__init__.py 3 | vcs = git 4 | commit = true 5 | tag = true 6 | tag_format = v{version} 7 | push = true 8 | clean = inv clean 9 | tests = inv test 10 | publish = inv dist 11 | files = 12 | README.md 13 | 14 | [bump] 15 | unsuffix = true 16 | 17 | [prepare] 18 | part = patch 19 | suffix = dev 20 | 21 | [changelog] 22 | file = CHANGELOG.md 23 | bump = ## {version} ({date:%Y-%m-%d}) 24 | prepare = ## Current (in progress) 25 | separator = 26 | -------------------------------------------------------------------------------- /coverage.rc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = udata_front 3 | branch = True 4 | omit = 5 | udata_front/tests.py 6 | 7 | [report] 8 | # Regexes for lines to exclude from consideration 9 | exclude_lines = 10 | # Have to re-enable the standard pragma 11 | pragma: no cover 12 | 13 | # Don't complain about missing debug-only code: 14 | def __repr__ 15 | if self\.debug 16 | 17 | # Don't complain if tests don't hit defensive assertion code: 18 | raise AssertionError 19 | raise NotImplementedError 20 | 21 | # Don't complain if non-runnable code isn't run: 22 | if 0: 23 | if __name__ == .__main__.: 24 | 25 | ignore_errors = True 26 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /udata_front/theme/gouvfr/translations/gouvfr.pot 3 | translation: /udata_front/theme/gouvfr/translations/%two_letters_code%/LC_MESSAGES/%file_name%.po 4 | - source: /udata_front/theme/gouvfr/assets/js/locales/en.json 5 | translation: /udata_front/theme/gouvfr/assets/js/locales/%two_letters_code%.json 6 | - source: /udata_front/theme/gouvfr/datagouv-components/src/locales/en.json 7 | translation: /udata_front/theme/gouvfr/datagouv-components/src/locales/%two_letters_code%.json 8 | -------------------------------------------------------------------------------- /cypress.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require("./cypress/cypress.config"); 2 | -------------------------------------------------------------------------------- /cypress/e2e/datasets.cy.js: -------------------------------------------------------------------------------- 1 | describe("Testing datasets page", () => { 2 | beforeEach(() => { 3 | cy.visit("/datasets"); 4 | cy.injectAxe(); 5 | }); 6 | 7 | it("displays the page title", () => { 8 | cy.get("h1").should("be.visible"); 9 | }); 10 | 11 | it("has no detectable critical a11y violations on load", () => { 12 | cy.checkA11y(null, { 13 | includedImpacts: ["critical"], 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /cypress/e2e/discussions.cy.js: -------------------------------------------------------------------------------- 1 | import dataset from '../fixtures/dataset.json'; 2 | 3 | describe("Testing discussion links", () => { 4 | it("displays the dataset page without hash", () => { 5 | cy.visit("/datasets/" + dataset.id); 6 | cy.intercept('**/?(_themes)/**').as('script'); 7 | cy.wait(['@script']); 8 | cy.get("h1") 9 | .should("be.visible") 10 | .should("include.text", dataset.title); 11 | cy.get("#resources-panel") 12 | .should("be.visible") 13 | .should("have.class", "fr-tabs__panel--selected") 14 | .should("have.attr", "data-fr-js-tab-panel"); 15 | }); 16 | }); 17 | 18 | -------------------------------------------------------------------------------- /cypress/e2e/home.cy.js: -------------------------------------------------------------------------------- 1 | describe("Testing home page", () => { 2 | beforeEach(() => { 3 | cy.visit("/"); 4 | cy.injectAxe(); 5 | }); 6 | 7 | it("displays the home page title", () => { 8 | cy.get("h1").should("be.visible"); 9 | }); 10 | 11 | it("has no detectable critical a11y violations on load", () => { 12 | cy.checkA11y(null, { 13 | includedImpacts: ["critical"], 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /cypress/fixtures/dataset.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "5530fbacc751df5ff937dddb", 3 | "title": "Base Adresse Nationale", 4 | "slug": "base-adresse-nationale", 5 | "discussion_id": "660e7c24b50e8385cd601e8d" 6 | } 7 | -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /cypress/udata-front-e2e.cfg.example: -------------------------------------------------------------------------------- 1 | PLUGINS = ['front'] 2 | THEME = 'gouvfr' 3 | 4 | MONGODB_HOST = 'mongodb://localhost:27017/udata-front-e2e' 5 | POST_DISCUSSIONS_ENABLED = True 6 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./node_modules/cypress", "cypress/**/*.js"] 3 | } 4 | -------------------------------------------------------------------------------- /lighthouserc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ci: { 3 | collect: { 4 | startServerCommand: 'npm run serve', 5 | url: ['http://localhost:7000/en/'] 6 | }, 7 | assert: { 8 | "assertions": { 9 | "categories:performance": ["error", {"minScore": 0.4}], 10 | "categories:accessibility": ["error", {"minScore": 0.98}], 11 | "categories:best-practices": ["error", {"minScore": 0.92}], 12 | "categories:seo": ["error", {"minScore": 0.78}], 13 | } 14 | }, 15 | upload: { 16 | target: 'filesystem', 17 | outputDir: 'reports' 18 | }, 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /pep8.rc: -------------------------------------------------------------------------------- 1 | [pep8] 2 | ignore = E128,E122,E125 3 | max-line-length = 100 4 | -------------------------------------------------------------------------------- /requirements/develop.in: -------------------------------------------------------------------------------- 1 | -c test.pip 2 | -c udata.pip 3 | 4 | flake8 5 | invoke 6 | pytest-cov 7 | readme-renderer[md] 8 | -------------------------------------------------------------------------------- /requirements/install.in: -------------------------------------------------------------------------------- 1 | -c udata.pip 2 | 3 | feedparser 4 | python-frontmatter 5 | Flask-Themes2 6 | feedgenerator 7 | -------------------------------------------------------------------------------- /requirements/test.in: -------------------------------------------------------------------------------- 1 | -c install.pip 2 | -c udata.pip 3 | 4 | mock 5 | pytest 6 | pytest-flask 7 | pytest-mock 8 | requests-mock 9 | feedgen 10 | -------------------------------------------------------------------------------- /requirements/udata.in: -------------------------------------------------------------------------------- 1 | udata@git+https://github.com/opendatateam/udata.git 2 | -------------------------------------------------------------------------------- /svgo.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | { 4 | name: 'preset-default', 5 | params: { 6 | overrides: { 7 | removeViewBox: false, 8 | }, 9 | }, 10 | }, 11 | ], 12 | }; -------------------------------------------------------------------------------- /test-runner-jest.config.js: -------------------------------------------------------------------------------- 1 | const config = require('./udata_front/theme/gouvfr/datagouv-components/test-runner-jest.config.js'); 2 | 3 | /** 4 | * @type {import('@jest/types').Config.InitialOptions} 5 | */ 6 | module.exports = config 7 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | envlist = py37, doc 8 | 9 | [testenv] 10 | commands = 11 | python setup.py develop 12 | nosetests udata 13 | install_command = pip3 install --allow-external webassets --allow-unverified webassets --pre {opts} {packages} 14 | deps = 15 | -r{toxinidir}/requirements/install.pip 16 | -r{toxinidir}/requirements/test.pip 17 | 18 | [testenv:doc] 19 | changedir = doc 20 | deps = sphinx 21 | commands = sphinx-build -b html -d {envtmpdir}/doctrees . {envtmpdir}/html 22 | -------------------------------------------------------------------------------- /udata-front-plugins-helper/README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

5 | Udata-front helper for plugins 6 |

7 | 8 | This repository helps you integrate your [udata plugin](https://udata.readthedocs.io/en/stable/extending/) with udata-front when [hooks](https://udata.readthedocs.io/en/stable/extending/#hooks) aren't available. 9 | 10 | It allows you to register your own [Vue](https://vuejs.org/) components and [Vue-i18n](https://vue-i18n.intlify.dev/) translations. 11 | 12 | [udata-tabular-preview](https://github.com/opendatateam/udata-tabular-preview) is an example of a plugin using these helpers. 13 | -------------------------------------------------------------------------------- /udata-front-plugins-helper/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "modules": false, 3 | "plugins": {}, 4 | }; 5 | -------------------------------------------------------------------------------- /udata-front-plugins-helper/src/env.d.ts: -------------------------------------------------------------------------------- 1 | import type { UdataFrontNamespace } from "./index"; 2 | 3 | export declare global { 4 | var udata_front: ?UdataFrontNamespace; 5 | } 6 | -------------------------------------------------------------------------------- /udata-front-plugins-helper/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "checkJs": true, 5 | "target": "es2020", 6 | "useDefineForClassFields": true, 7 | "module": "es2020", 8 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 9 | "skipLibCheck": true, 10 | "types": ["vitest/globals", "vite/client"], 11 | 12 | /* Bundler mode */ 13 | "moduleResolution": "bundler", 14 | "allowImportingTsExtensions": true, 15 | "resolveJsonModule": true, 16 | "isolatedModules": true, 17 | "noEmit": true, 18 | "jsx": "preserve", 19 | 20 | /* Linting */ 21 | "strict": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "noFallthroughCasesInSwitch": true 25 | }, 26 | "include": [ 27 | "src", 28 | ], 29 | } 30 | -------------------------------------------------------------------------------- /udata_front/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | udata customizations for data.gouv.fr 3 | ''' 4 | 5 | __version__ = '6.2.5.dev' 6 | __description__ = 'udata customizations for data.gouv.fr' 7 | -------------------------------------------------------------------------------- /udata_front/frontend/markdown.py: -------------------------------------------------------------------------------- 1 | from udata.frontend.markdown import mistune, UDataMarkdown 2 | 3 | 4 | class UDataFrontMarkdown(UDataMarkdown): 5 | """Consistent with Flask's extensions signature.""" 6 | 7 | def __init__(self, app): 8 | app.jinja_env.filters['markdown'] = self.__call__ 9 | self.markdown = mistune.create_markdown( 10 | escape=False, hard_wrap=True, plugins=["table", "strikethrough"] 11 | ) 12 | 13 | 14 | def init_app(app): 15 | app.extensions['markdown'] = UDataFrontMarkdown(app) 16 | -------------------------------------------------------------------------------- /udata_front/migrations/2015-09-14-dataconnexions-6.js: -------------------------------------------------------------------------------- 1 | // Rename the dataconnexions badges to dataconnexions 5 2 | var result = db.reuse.update( 3 | {'badges.kind': 'dataconnexions-candidate'}, 4 | {$set: {'badges.$.kind': 'dataconnexions-5-candidate'}}, 5 | {multi: true} 6 | ); 7 | print(result.nModified, 'dataconnexions-candidate badges renamed.'); 8 | 9 | result = db.reuse.update( 10 | {'badges.kind': 'dataconnexions-laureate'}, 11 | {$set: {'badges.$.kind': 'dataconnexions-5-laureate'}}, 12 | {multi: true} 13 | ); 14 | print(result.nModified, 'dataconnexions-laureate badges renamed.'); 15 | -------------------------------------------------------------------------------- /udata_front/migrations/2016-04-05-deactivate-datapublica.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Deactivate all datasets linking to data-publica 3 | */ 4 | 5 | var eurostatId = ObjectId('534fff76a3a7292c64a77ded'); 6 | var banqueMondialeId = ObjectId('534fff59a3a7292c64a77cff'); 7 | 8 | var result = db.dataset.update({ 9 | $or: [ 10 | {organization: eurostatId}, 11 | {organization: banqueMondialeId } 12 | ] 13 | }, { 14 | $set: {deleted: new Date()} 15 | }, { 16 | multi: true 17 | }); 18 | 19 | print(result.nModified, 'datasets deleted'); 20 | -------------------------------------------------------------------------------- /udata_front/migrations/2017-01-05-geozones-admin-levels-fr.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Affect admin levels to french levels 3 | */ 4 | 5 | const ADMIN_LEVELS = { 6 | 'fr/region': 40, 7 | 'fr/county': 60, 8 | 'fr/epci': 68, 9 | 'fr/district': 70, 10 | 'fr/town': 80, 11 | 'fr/canton': 98, 12 | 'fr/iris': 98, 13 | }; 14 | 15 | var nb = 0; 16 | 17 | for (var key in ADMIN_LEVELS) { 18 | const result = db.geo_level.update( 19 | {_id: key}, 20 | {$set: {admin_level: ADMIN_LEVELS[key]}} 21 | ); 22 | nb += result.nModified; 23 | } 24 | print(`Affected admin level to ${nb} geospatial level`); 25 | -------------------------------------------------------------------------------- /udata_front/migrations/2018-04-18-migrate-active-users.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Ensure active users have a confirmed_at date set. 3 | */ 4 | 5 | const result = db.user.update( 6 | {active: true, confirmed_at: null}, 7 | {$set: {confirmed_at: new Date()}}, 8 | {multi: true} 9 | ); 10 | print(`${result.nModified} users migrated.`); 11 | -------------------------------------------------------------------------------- /udata_front/static/c3/logo-c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/c3/logo-c3.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/dataconnexions6-logo-couleur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/dataconnexions6-logo-couleur.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/logo-blanc-rouge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/logo-blanc-rouge.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/logo-blanc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/logo-blanc.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/logo-couleur-rouge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/logo-couleur-rouge.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/logo-couleur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/logo-couleur.png -------------------------------------------------------------------------------- /udata_front/static/dataconnexions/logo-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/dataconnexions/logo-transparent.png -------------------------------------------------------------------------------- /udata_front/static/faq/integration/exemple-integration-blog-etalab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/integration/exemple-integration-blog-etalab.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-CartePOI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-CartePOI.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-Evolutionbio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-Evolutionbio.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-Inventaire_du_patrimoine_Poitou-Chatrentes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-Inventaire_du_patrimoine_Poitou-Chatrentes.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-Inventaire_du_patrimoine_vecteurs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-Inventaire_du_patrimoine_vecteurs.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-OSM-cadastre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-OSM-cadastre.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/800px-TileMill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/800px-TileMill.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/Alluvial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/Alluvial.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/Dependencies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/Dependencies.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/Heatmap-salons-coiffure-paris-opendatasoft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/Heatmap-salons-coiffure-paris-opendatasoft.png -------------------------------------------------------------------------------- /udata_front/static/faq/outils/PAC2012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/faq/outils/PAC2012.jpg -------------------------------------------------------------------------------- /udata_front/static/licences/ETALAB-Licence-Ouverte-v2.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/ETALAB-Licence-Ouverte-v2.0.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/description-contenu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/description-contenu.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/homologation-licences-2017-05-05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/homologation-licences-2017-05-05.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/homologation-licences-2017-09-26.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/homologation-licences-2017-09-26.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/homologation-licences-2017-09-29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/homologation-licences-2017-09-29.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/homologation-licences-2019-04-17.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/homologation-licences-2019-04-17.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/homologation-licences-2019-05-29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/homologation-licences-2019-05-29.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/licence-d-utilisation-a-titre-gratuit-de-l-IGN-2017-05-05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/licence-d-utilisation-a-titre-gratuit-de-l-IGN-2017-05-05.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-de-PI-2019-04-17.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-de-PI-2019-04-17.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-du-RNCS-2019-04-17.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/licence-de-reutilisation-des-informations-de-l-INPI-pour-les-donnees-du-RNCS-2019-04-17.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2017-05-05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2017-05-05.pdf -------------------------------------------------------------------------------- /udata_front/static/licences/licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2019-05-29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/licences/licence-du-produit-gratuit-issu-de-la-Base-Adresse-Nationale-2019-05-29.pdf -------------------------------------------------------------------------------- /udata_front/static/nec_mergitur/logo_nec_mergitur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/nec_mergitur/logo_nec_mergitur.png -------------------------------------------------------------------------------- /udata_front/static/openfield16/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/static/openfield16/logo.jpg -------------------------------------------------------------------------------- /udata_front/tests/__init__.py: -------------------------------------------------------------------------------- 1 | from udata.settings import Testing 2 | 3 | 4 | class GouvFrSettings(Testing): 5 | TEST_WITH_THEME = True 6 | TEST_WITH_PLUGINS = True 7 | PLUGINS = ['front'] 8 | THEME = 'gouvfr' 9 | WP_ATOM_URL = None # Only activated on specific tests 10 | -------------------------------------------------------------------------------- /udata_front/tests/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/tests/views/__init__.py -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/fonts/Marianne-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/fonts/Marianne-ExtraBold.woff -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/fonts/Marianne-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/fonts/Marianne-ExtraBold.woff2 -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/fonts/Spectral-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/fonts/Spectral-Italic.woff -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/fonts/Spectral-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/fonts/Spectral-Italic.woff2 -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/favicon.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/annuaire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/annuaire.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/annuaire@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/annuaire@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/datasets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/datasets.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/datasets@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/datasets@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/datasets@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/datasets@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/dvf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/dvf.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/dvf@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/dvf@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/hero-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/hero-background.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/reuses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/reuses.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/reuses@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/reuses@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/homepage/reuses@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/homepage/reuses@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/logo-social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/logo-social.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/cnil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/cnil.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/cnil@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/cnil@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/cnil@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/cnil@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/googlemaps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/googlemaps.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/googlemaps@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/googlemaps@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/googlemaps@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/googlemaps@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/insee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/insee.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/insee@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/insee@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/insee@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/insee@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/lemonde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/lemonde.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/lemonde@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/lemonde@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/lemonde@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/lemonde@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/liberation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/liberation.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/liberation@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/liberation@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/liberation@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/liberation@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/minedu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/minedu.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/minedu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/minedu@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/minedu@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/minedu@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/spf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/spf.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/spf@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/spf@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/spf@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/spf@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/wikimedia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/wikimedia.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/wikimedia@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/wikimedia@2x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/organizations/wikimedia@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/organizations/wikimedia@3x.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/placeholders/author.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/placeholders/author.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/placeholders/dataset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/placeholders/dataset.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/placeholders/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/placeholders/news.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/placeholders/organization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/placeholders/organization.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/img/placeholders/reuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/img/placeholders/reuse.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/harvesters.ts: -------------------------------------------------------------------------------- 1 | import { api } from "@datagouv/components/ts"; 2 | import { getLocalizedUrl } from "../i18n"; 3 | 4 | export async function getOrganizationHarvesters(oid: string, page: number, pageSize: number) { 5 | const resp = await api.get(getLocalizedUrl('harvest/sources/'), { 6 | params: { owner: oid, deleted: true, page, page_size: pageSize } 7 | }); 8 | return resp.data; 9 | } 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/licenses.ts: -------------------------------------------------------------------------------- 1 | import type { License } from "@datagouv/components/ts"; 2 | import { getLocalizedUrl } from "../i18n"; 3 | import { api } from "../plugins/api"; 4 | 5 | let licensesRequest: Promise> | null = null; 6 | 7 | export function getLicensesUrl() { 8 | return getLocalizedUrl("datasets/licenses/"); 9 | } 10 | 11 | export default function fetchLicenses() { 12 | if (licensesRequest) { 13 | return licensesRequest; 14 | } 15 | return licensesRequest = api.get>(getLicensesUrl()) 16 | .then((resp) => resp.data); 17 | } 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/me.ts: -------------------------------------------------------------------------------- 1 | import { onMounted, ref, type Ref } from "vue"; 2 | import { getLocalizedUrl } from "../i18n"; 3 | import { api } from "../plugins/api"; 4 | import { auth } from "../plugins/auth"; 5 | import type { Me } from "../types"; 6 | 7 | let innerMe = ref(null); 8 | let me: Promise; 9 | 10 | export function fetchMe(): Promise { 11 | auth(); 12 | if(me) { 13 | return me; 14 | } 15 | return me = api.get(getLocalizedUrl("me/")).then(resp => resp.data); 16 | } 17 | 18 | export function useMe(): Ref { 19 | onMounted(async () => { 20 | innerMe.value = await fetchMe(); 21 | }) 22 | 23 | return innerMe; 24 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/posts.ts: -------------------------------------------------------------------------------- 1 | import { api } from "@datagouv/components/ts"; 2 | import type { Post } from "../types"; 3 | 4 | export async function getPost(id: string) { 5 | const res = await api.get(`posts/${id}/`); 6 | return res.data; 7 | }; 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/types.ts: -------------------------------------------------------------------------------- 1 | export type PaginatedArray = { 2 | data: Array; 3 | next_page: string | null; 4 | page: number; 5 | page_size: number; 6 | previous_page: string | null; 7 | total: number; 8 | }; -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/api/users.ts: -------------------------------------------------------------------------------- 1 | import { api } from "../plugins/api"; 2 | 3 | export function deleteUser(oid: string) { 4 | return api.delete(`users/${oid}/`); 5 | }; 6 | 7 | export function deleteUserAsSpam(oid: string) { 8 | // Don't notify user of its deletion and delete its comments 9 | return api.delete(`users/${oid}/?no_mail=true&delete_comments=true`); 10 | }; 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Accordion/Accordion.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AccordionStories from './Accordion.stories'; 4 | 5 | 6 | 7 | # Accordion 8 | 9 | A single accordion component following DSFR specification. 10 | See [Accordion Group](?path=/docs/components-acordiongroup--docs) if you want multiple accordions together. 11 | 12 | 13 | 14 | ## Props 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Accordion/AccordionGroup.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AccordionGroupStories from './AccordionGroup.stories'; 4 | 5 | 6 | 7 | # Accordion Group 8 | 9 | A group of accordions following DSFR specification. 10 | See [Accordion](?path=/docs/components-acordion--docs) if you want a single accordion. 11 | 12 | 13 | 14 | ## Props 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Accordion/AccordionGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminBadge/AdminBadge.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminBadgeStories from './AdminBadge.stories'; 4 | 5 | 6 | 7 | # Badge 8 | 9 | A badge to show some information. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminBadge/AdminBadge.vue: -------------------------------------------------------------------------------- 1 | 11 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminContentWithTooltip/AdminContentWithTooltip.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminContentWithTooltipStories from './AdminContentWithTooltip.stories'; 4 | 5 | 6 | 7 | # Content With Tooltip 8 | 9 | In size-constrained container, we may have text hidden due to clamping or text overflowing. 10 | To work around this issue, the content is also shown in a tooltip on screen size below XL (< 1100px). 11 | 12 | 13 | 14 | Note : Tooltip position is odd on doc page (due to iframe). Check story for a real example. 15 | 16 | ## Props 17 | 18 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminDangerZone/AdminDangerZone.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminDangerZoneStories from './AdminDangerZone.stories'; 4 | 5 | 6 | 7 | # Danger Zone 8 | 9 | A well to show an irreversible action. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminDangerZone/AdminDangerZone.vue: -------------------------------------------------------------------------------- 1 | 12 | 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminEmail/AdminEmail.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminLoader/AdminLoader.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from "@storybook/vue3"; 2 | import AdminLoader from "./AdminLoader.vue"; 3 | 4 | const meta = { 5 | title: "Admin/AdminLoader", 6 | component: AdminLoader, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | const args = {}; 12 | 13 | export const DefaultLoader: StoryObj = { 14 | render: (args) => ({ 15 | components: { AdminLoader }, 16 | setup() { 17 | return { args }; 18 | }, 19 | template: `
20 | 21 |
`, 22 | }), 23 | args, 24 | }; 25 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminLoader/AdminLoader.vue: -------------------------------------------------------------------------------- 1 | 4 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminMembershipRequest/AdminMembershipRequest.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Description, Meta } from '@storybook/blocks'; 2 | 3 | import * as MembershipRequestStories from './AdminMembershipRequest.stories'; 4 | 5 | 6 | 7 | # Membership Request 8 | 9 | A membership request sent to your organization. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminSidebar/AdminSidebarLink/AdminSidebarLink.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminSidebarLinkStories from './AdminSidebarLink.stories'; 4 | 5 | 6 | 7 | # Sidebar Link 8 | 9 | A link to a page in the administration sidebar. 10 | See [Admin Sidebar collapse](?path=/docs/components-acordiongroup--docs) if you want the parent component. 11 | 12 | 13 | 14 | ## Props 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminSidebar/AdminSidebarMenu/AdminSidebarMenu.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminSidebarMenu from './AdminSidebarMenu.stories'; 4 | 5 | 6 | 7 | # Sidebar Menu 8 | 9 | This is a menu with links to all the available content about a given organization or the current user in the new administration. 10 | See [Admin](?path=/docs/pages-admin--docs) if you want the full admin page. 11 | 12 | 13 | 14 | ## Props 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/AdminTable/AdminTable.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AdminTableStories from './Table/AdminTable.stories'; 4 | 5 | 6 | 7 | # Table 8 | 9 | A table with sortable column and content limited to 2 lines. 10 | 11 | 12 | 13 | Note: tooltips aren't shown at the correct place on the canvas above but you can test them on the individual story. 14 | 15 | ## Props 16 | 17 | 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Breadcrumb/Breadcrumb.vue: -------------------------------------------------------------------------------- 1 | 12 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/DataservicesSearch/DataservicesSearch.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/vue3'; 2 | import DataservicesSearch from './DataservicesSearch.vue'; 3 | 4 | const meta = { 5 | title: 'Components/DataservicesSearch', 6 | component: DataservicesSearch, 7 | args: {}, 8 | } satisfies Meta; 9 | 10 | export default meta; 11 | 12 | export const DataservicesSearchExample: StoryObj = { 13 | render: (args) => ({ 14 | components: { DataservicesSearch }, 15 | setup() { 16 | return { args }; 17 | }, 18 | template: '', 19 | }), 20 | args: {}, 21 | }; 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/ActionCard/ActionCard.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ActionCardStories from './ActionCard.stories'; 4 | 5 | 6 | 7 | # Action Card 8 | 9 | A card with a button, a link or any other action on it. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/ButtonLoader.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 27 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/FileCard/FileCard.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as FileCardStories from './FileCard.stories'; 4 | 5 | 6 | 7 | # FileCard 8 | 9 | A card presenting a file before sending it. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/FileCard/FileLoader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/InputGroup/InputGroup.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as InputGroupStories from './InputGroup.stories'; 4 | 5 | 6 | 7 | # InputGroup 8 | 9 | A full featured Input Group component following DSFR specification. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/LinkedToAccordion/LinkedToAccordion.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as LinkedToAccordion from './LinkedToAccordion.stories'; 4 | 5 | 6 | 7 | # Linked To Accordion 8 | 9 | This component allows an input (or any other element) to open an accordion component on focus. 10 | 11 | 12 | 13 | 14 | ## Accessibility 15 | 16 | You must provide the accordion `id` as `aria-describedby` for users of assistive technologies. 17 | They will read the content, even if the accordion is closed. 18 | 19 | ## Props 20 | 21 | 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/SelectGroup/SelectGroup.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as SelectGroupStories from './SelectGroup.stories'; 4 | 5 | 6 | 7 | # SelectGroup 8 | 9 | A full featured Select Group component following DSFR specification. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/Stepper/Stepper.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as StepperStories from './Stepper.stories'; 4 | 5 | 6 | 7 | # Stepper 8 | 9 | Simple Stepper following DSFR specification. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/UploadGroup/UploadGroup.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as UploadGroupStories from './UploadGroup.stories'; 4 | 5 | 6 | 7 | # UploadGroup 8 | 9 | A full featured Upload Group component following System U specification. 10 | 11 | It allows both drag & drop and file browsing. 12 | 13 | 14 | 15 | ## Props 16 | 17 | 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Form/UploadGroup/UploadModalButton.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as UploadModalButtonStories from './UploadModalButton.stories'; 4 | 5 | 6 | 7 | # UploadModalButton 8 | 9 | A simple button that launch a full featured upload modal. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkAsNoSpam/MarkAsNoSpam.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Description, Meta } from '@storybook/blocks'; 2 | 3 | import * as MarkAsNoSpamStories from './MarkAsNoSpam.stories'; 4 | 5 | 6 | 7 | # Mark As No Spam 8 | 9 | A button to mark an element as no spam. The button is only shown if the element has a `spam` object with the status `potential_spam`. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkAsNoSpam/MarkAsNoSpam.stories.ts: -------------------------------------------------------------------------------- 1 | import MarkAsNoSpam, { type MarkAsNoSpamProps } from './MarkAsNoSpam.vue'; 2 | import type { Meta, StoryObj } from "@storybook/vue3"; 3 | 4 | const meta = { 5 | title: 'Components/MarkAsNoSpam', 6 | component: MarkAsNoSpam, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | const args: MarkAsNoSpamProps = { 12 | spam: { 13 | status: "potential_spam", 14 | }, 15 | url: "http://dev.local:7000/dataset/123/spam", 16 | }; 17 | 18 | export const MarkAsNoSpamShown: StoryObj = { 19 | render: (args) => ({ 20 | components: { MarkAsNoSpam }, 21 | setup() { 22 | return { args }; 23 | }, 24 | template: '', 25 | }), 26 | args, 27 | }; 28 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/EditorButton.vue: -------------------------------------------------------------------------------- 1 | 10 | 18 | 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ImageModal/ImageModalButton.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ImageModalButtonStories from './ImageModalButton.stories'; 4 | 5 | 6 | 7 | # Image Modal Button 8 | 9 | A simple button that launch an image modal. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/MarkdownEditor.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as MarkdownEditorStories from './MarkdownEditor.stories'; 4 | 5 | 6 | 7 | # Markdown Editor 8 | 9 | A full fledged Markdown editor with WYSIWYG for ease of use and GFM for added capabilities. 10 | 11 | It allows : 12 | - basic text formatting (titles, **bold** and *italic*) 13 | - table and table management (add / move / align / remove row, add / move / align / remove column) 14 | - adding link on text 15 | - adding image 16 | - lists 17 | - code block 18 | - quote 19 | 20 | 21 | 22 | ## Props 23 | 24 | 25 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkEdit/configureEditTooltip.ts: -------------------------------------------------------------------------------- 1 | import type { Ctx } from "@milkdown/ctx"; 2 | import { usePluginViewFactory } from "@prosemirror-adapter/vue"; 3 | import { linkEditTooltip } from "./linkEditTooltip"; 4 | import LinkEditTooltip from "./LinkEditTooltip.vue"; 5 | 6 | export function configureEditTooltip(ctx: Ctx) { 7 | const pluginViewFactory = usePluginViewFactory(); 8 | 9 | ctx.set(linkEditTooltip.key, { 10 | view: pluginViewFactory({ 11 | component: LinkEditTooltip, 12 | }), 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkEdit/index.ts: -------------------------------------------------------------------------------- 1 | import { insertLinkCommand } from "./insertLink"; 2 | import { linkEditTooltip, linkTooltipState, linkEditTooltipCtx } from "./linkEditTooltip"; 3 | 4 | export const linkEditPlugins = [ 5 | linkEditTooltipCtx, 6 | linkEditTooltip, 7 | linkTooltipState, 8 | insertLinkCommand, 9 | ].flat(); 10 | 11 | export { insertLinkCommand }; 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkEdit/linkEditTooltip.ts: -------------------------------------------------------------------------------- 1 | import { TooltipProvider, tooltipFactory } from "@milkdown/plugin-tooltip"; 2 | import type { Mark } from 'prosemirror-model'; 3 | import { $ctx } from "@milkdown/utils"; 4 | 5 | export const linkEditTooltipCtx = $ctx( 6 | null, 7 | "linkEditTooltip" 8 | ); 9 | 10 | export type LinkTooltip = { 11 | from: number, 12 | to: number, 13 | mark: Mark | null, 14 | }; 15 | 16 | export const linkTooltipState = $ctx({ 17 | from: -1, 18 | to: -1, 19 | mark: null, 20 | }, 'linkTooltipStateCtx'); 21 | 22 | export const linkEditTooltip = tooltipFactory("LINK_EDIT"); 23 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkPreview/index.ts: -------------------------------------------------------------------------------- 1 | import { linkPreviewTooltip, linkPreviewTooltipCtx } from "./linkPreviewTooltip"; 2 | 3 | export const linkPreviewPlugins = [ 4 | linkPreviewTooltipCtx, 5 | linkPreviewTooltip, 6 | ].flat(); 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkPreview/linkPreviewTooltip.ts: -------------------------------------------------------------------------------- 1 | import { TooltipProvider, tooltipFactory } from "@milkdown/plugin-tooltip"; 2 | import { $ctx } from "@milkdown/utils"; 3 | 4 | export const linkPreviewTooltipCtx = $ctx( 5 | null, 6 | "linkPreviewTooltip" 7 | ); 8 | 9 | export const linkPreviewTooltip = tooltipFactory("LINK_PREVIEW"); 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/LinkPreview/useLinkPreview.ts: -------------------------------------------------------------------------------- 1 | import { inject, readonly } from "vue"; 2 | import { type InjectionKey, type Ref, provide, ref } from "vue"; 3 | 4 | export function useLinkPreviewProvider() { 5 | const link = ref(""); 6 | provide(linkPreviewLinkKey, link); 7 | } 8 | 9 | export function useLinkPreview() { 10 | const link = inject(linkPreviewLinkKey) as Ref; 11 | 12 | return { 13 | link: readonly(link), 14 | updateLink(newLink: string) { 15 | link.value = newLink; 16 | }, 17 | } 18 | } 19 | 20 | export const linkPreviewLinkKey = Symbol() as InjectionKey>; 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/TableTooltip/TooltipButton.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 30 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/TableTooltip/tableTooltip.ts: -------------------------------------------------------------------------------- 1 | import { TooltipProvider, tooltipFactory } from "@milkdown/plugin-tooltip"; 2 | import { $ctx } from "@milkdown/utils"; 3 | 4 | export const tableTooltipCtx = $ctx( 5 | null, 6 | "tableTooltip" 7 | ); 8 | 9 | export const tableTooltip = tooltipFactory("TABLE"); 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/Tooltip/EditorTooltip.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/Milkdown/dsfrColumnResizingPlugin.ts: -------------------------------------------------------------------------------- 1 | import { $prose } from '@milkdown/utils'; 2 | import { columnResizing } from 'prosemirror-tables'; 3 | import { TableView } from '../ProseMirror/DSFRTableView'; 4 | 5 | export const dsfrColumnResizingPlugin = $prose(() => columnResizing({View: TableView})); 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ProseMirror/DSFRTableView.ts: -------------------------------------------------------------------------------- 1 | import type { Node } from 'prosemirror-model'; 2 | import { TableView as ProseTableView } from "prosemirror-tables"; 3 | 4 | /** 5 | * This extended class is necessary to customize the `className` of the table wrapper 6 | * It's set to `.tableWrapper` in the Prose Mirror but we want it to be the DSFR class 7 | */ 8 | export class TableView extends ProseTableView { 9 | constructor(node: Node, cellMinWidth: number) { 10 | super(node, cellMinWidth); 11 | this.dom.className = 'fr-table fr-table--no-caption fr-table--layout-fixed'; 12 | } 13 | 14 | ignoreMutation(record: MutationRecord): boolean { 15 | return super.ignoreMutation(record) || (record.type === "attributes" && record.target === this.dom); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ProseMirror/findMarkPosition.ts: -------------------------------------------------------------------------------- 1 | import type { Mark, Node } from "prosemirror-model"; 2 | 3 | export function findMarkPosition(mark: Mark, doc: Node, from: number, to: number) { 4 | let markPos = { start: -1, end: -1 }; 5 | doc.nodesBetween(from, to, (node, pos) => { 6 | // stop recursive finding if result is found 7 | if (markPos.start > -1) 8 | return false; 9 | 10 | if (markPos.start === -1 && mark.isInSet(node.marks)) { 11 | markPos = { 12 | start: pos, 13 | end: pos + Math.max(node.textContent.length, 1), 14 | }; 15 | } 16 | 17 | return undefined; 18 | }); 19 | 20 | return markPos; 21 | } 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ProseMirror/getMarkInNode.ts: -------------------------------------------------------------------------------- 1 | import type { MarkType, Node } from "prosemirror-model"; 2 | 3 | export function getMarkInNode(node: Node, markType: MarkType) { 4 | return node.marks.find(mark => mark.type === markType); 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ProseMirror/getNodeAtCoords.ts: -------------------------------------------------------------------------------- 1 | import { EditorView } from "prosemirror-view"; 2 | 3 | export function getNodeAtCoords(coords: {left: number, top: number}, view: EditorView) { 4 | const $pos = view.posAtCoords(coords); 5 | if (!$pos) 6 | return { 7 | node: null, 8 | pos: null, 9 | }; 10 | 11 | const { pos } = $pos; 12 | return { 13 | node: view.state.doc.nodeAt(pos), 14 | pos, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/ProseMirror/handleLink.ts: -------------------------------------------------------------------------------- 1 | import type { Mark } from "prosemirror-model"; 2 | import { EditorView } from "prosemirror-view"; 3 | 4 | export function addLink(view: EditorView, mark: Mark, previousMark?: Mark | null) { 5 | const tr = view.state.tr; 6 | if (previousMark) { 7 | tr.removeMark(view.state.selection.from, view.state.selection.to, previousMark); 8 | } 9 | 10 | tr.addMark(view.state.selection.from, view.state.selection.to, mark); 11 | view.dispatch(tr); 12 | } 13 | 14 | export function removeLink(view: EditorView, from: number, to: number, mark: Mark) { 15 | const tr = view.state.tr; 16 | if (mark) { 17 | tr.removeMark(from, to, mark); 18 | } 19 | view.dispatch(tr); 20 | } 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/MarkdownEditor/types.ts: -------------------------------------------------------------------------------- 1 | export type MarkdownEditorProps = { 2 | ariaLabel?: string, 3 | ariaLabelledBy?: string, 4 | id: string, 5 | disabled?: boolean, 6 | value: string | undefined, 7 | }; 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/RangePicker/RangePicker.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as RangePickerStories from './RangePicker.stories'; 4 | 5 | 6 | 7 | # Range Picker 8 | 9 | Used to pick dates for temporal coverage selection. 10 | 11 | It supports getting a default value with the `value` prop and will emit `@change` event. 12 | 13 | Value is a string composed of the two dates forming a range as such : `YYYY-MM-DD-YYYY-MM-DD` 14 | 15 | 16 | 17 | ## Props 18 | 19 | 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/RangePicker/RangePicker.stories.js: -------------------------------------------------------------------------------- 1 | import RangePicker from './RangePicker.vue'; 2 | 3 | export default { 4 | title: 'Components/RangePicker', 5 | component: RangePicker, 6 | }; 7 | 8 | const args = { 9 | value: null, 10 | }; 11 | 12 | export const SimpleRangePicker = { 13 | render: (args) => ({ 14 | components: { RangePicker }, 15 | setup() { 16 | return { args }; 17 | }, 18 | template: ` 19 | `, 20 | }), 21 | args, 22 | }; 23 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Report/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/js/components/Report/index.ts -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Reuse/NewReuseLoader.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Reuse/Reuse.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ReuseStories from './Reuse.stories'; 4 | 5 | 6 | 7 | # Reuse Card 8 | 9 | A reuse card. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Reuse/Reuse.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Reuse/ReuseList.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ReuseListStories from './ReuseList.stories'; 4 | 5 | 6 | 7 | # Reuse List 8 | 9 | A list of reuses. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Reuse/ReuseLoader.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/SchemaSelect/SchemaSelect.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as SchemaSelectStories from './SchemaSelect.stories'; 4 | 5 | 6 | 7 | # SchemaSelect 8 | 9 | A schema select component. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Sidemenu/Sidemenu.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as SidemenuStories from './Sidemenu.stories'; 4 | 5 | 6 | 7 | # Sidemenu 8 | 9 | A sidemenu matching DSFR specifications. It can be shown on the left or right of your content. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Tooltip/Tooltip.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from "@storybook/vue3"; 2 | import Tooltip from "./Tooltip.vue"; 3 | 4 | const meta = { 5 | title: "Components/Tooltip", 6 | component: Tooltip, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | export const SimpleTooltip: StoryObj = { 12 | render: (args) => ({ 13 | components: { Tooltip }, 14 | setup() { 15 | return { args }; 16 | }, 17 | template: ` 18 | Some text with a tooltip shown. The tooltip is placed in the middle of the line because it's a p tag. 19 | 20 | `, 21 | }), 22 | args: {}, 23 | }; 24 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Tooltip/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/Container/Container.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as Container from './Container.stories'; 4 | 5 | 6 | 7 | # Container 8 | 9 | This component is a simple container with a white background and some padding. 10 | Useful when the page background is a light grey. 11 | 12 | 13 | 14 | 15 | ## Props 16 | 17 | 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/Container/Container.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/Required/Required.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Meta } from '@storybook/blocks'; 2 | 3 | import * as RequiredStories from './Required.stories'; 4 | 5 | 6 | 7 | # Required 8 | 9 | A simple component that show a branded `*`. 10 | In most cases, you should use the ready-made group components instead : 11 | - [Input Group](?path=/docs/components-inputgroup--docs) 12 | - [Select Group](?path=/docs/components-selectgroup--docs) 13 | 14 | 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/Required/Required.vue: -------------------------------------------------------------------------------- 1 | 7 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/RequiredExplanation/RequiredExplanation.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/vue3'; 2 | import RequiredExplanation from './RequiredExplanation.vue'; 3 | 4 | const meta = { 5 | title: 'Ui/RequiredExplanation', 6 | component: RequiredExplanation, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | export const RequiredExplanationStory: StoryObj = { 12 | render: (args) => ({ 13 | components: { RequiredExplanation }, 14 | setup() { 15 | return { args }; 16 | }, 17 | template: '', 18 | }), 19 | args: {}, 20 | }; 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/Ui/RequiredExplanation/RequiredExplanation.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/dataset/CardList.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as CardListStories from './CardList.stories'; 4 | 5 | 6 | 7 | # Dataset Card List 8 | 9 | A paginated list of dataset cards. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/dataset/card-lg.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/Author/Author.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as AuthorStories from './Author.stories'; 4 | 5 | 6 | 7 | # Author 8 | 9 | The author of a discussion or reply. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/Author/Author.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/Thread/Thread.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ThreadStories from './Thread.stories'; 4 | 5 | 6 | 7 | # Thread 8 | 9 | A discussion thread. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/ThreadCreate/ThreadCreate.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ThreadCreateStories from './ThreadCreate.stories'; 4 | 5 | 6 | 7 | # Thread Creation form 8 | 9 | A form to create a new discussion thread. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/ThreadCreate/ThreadCreateButton.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ThreadCreateButtonStories from './ThreadCreateButton.stories'; 4 | 5 | 6 | 7 | # Thread Create Button 8 | 9 | A simple button to create new thread. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/ThreadCreate/ThreadCreateButton.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/ThreadReply/ThreadReply.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ThreadReplyStories from './ThreadReply.stories'; 4 | 5 | 6 | 7 | # Thread Reply 8 | 9 | The thread reply form. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/discussions/Threads.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as ThreadsStories from './Threads.stories'; 4 | 5 | 6 | 7 | # Discussions 8 | 9 | List of discussions or specified discussion view. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/search/MenuSearch/MenuSearch.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as MenuSearchStories from './MenuSearch.stories'; 4 | 5 | 6 | 7 | # Menu Search 8 | 9 | The menu search component. 10 | 11 | It's an input working like a [combobox](https://www.w3.org/TR/wai-aria-practices/#combobox) and based on a [WAI-ARIA Authoring Practices 1.2 example](https://www.w3.org/TR/wai-aria-practices/examples/combobox/combobox-autocomplete-list.html). 12 | 13 | 14 | 15 | ## Props 16 | 17 | 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/search/MenuSearch/MenuSearch.stories.ts: -------------------------------------------------------------------------------- 1 | import { Meta, StoryObj } from "@storybook/vue3"; 2 | import MenuSearch from "./MenuSearch.vue"; 3 | 4 | const meta = { 5 | title: 'Components/MenuSearch', 6 | component: MenuSearch, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | export const DefaultMenuSearch: StoryObj = { 12 | render: (args) => ({ 13 | components: { MenuSearch }, 14 | setup() { 15 | return { args }; 16 | }, 17 | template: `
18 | 19 |
`, 20 | }), 21 | args: {}, 22 | }; 23 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/search/OrganizationSearch/OrganizationSearchOption.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/search/Search/Search.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as SearchStories from './Search.stories'; 4 | 5 | 6 | 7 | # Dataset Search 8 | 9 | The dataset search component. 10 | 11 | 12 | 13 | ## Props 14 | 15 | 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/utils/DeleteButton/DeleteButton.mdx: -------------------------------------------------------------------------------- 1 | import { Canvas, Controls, Meta } from '@storybook/blocks'; 2 | 3 | import * as DeleteButtonStories from './DeleteButton.stories'; 4 | 5 | 6 | 7 | # Delete button 8 | 9 | A simple button to delete various entities on the website. 10 | 11 | 12 | 13 | 14 | ## Props 15 | 16 | 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/vanilla/accordion.ts: -------------------------------------------------------------------------------- 1 | import { toggleAccordion } from "@datagouv/components/ts"; 2 | 3 | const togglers = document.querySelectorAll("[data-accordion-button]"); 4 | togglers.forEach((toggler) => { 5 | toggler.addEventListener("click", (ev) => { 6 | ev.preventDefault(); 7 | const button = ev.target; 8 | if (button instanceof HTMLElement) { 9 | // Toggling the aria-expanded attribute on the button 10 | button.toggleAttribute("aria-expanded"); 11 | 12 | const target: HTMLElement | null = document.querySelector("#" + button.getAttribute("aria-controls")); 13 | if (target) { 14 | target.classList.toggle("active"); 15 | toggleAccordion(target, button.hasAttribute("aria-expanded")); 16 | } 17 | } 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/components/vanilla/clipboard.js: -------------------------------------------------------------------------------- 1 | /* 2 | --- 3 | name: Clipboard 4 | category: 5 - Interactions 5 | --- 6 | 7 | # Interaction 8 | Copy to clipboard thanks to clipboardjs.com 9 | Just have an element with an `id` ending with `-copy` and use clipboardJS API for endless possibilities ! 10 | 11 | ```clipboard.html 12 | 13 | 16 | ``` 17 | */ 18 | 19 | import ClipboardJS from "clipboard"; 20 | 21 | new ClipboardJS('[id$="-copy"]'); 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/admin/useCurrentOrganization.ts: -------------------------------------------------------------------------------- 1 | import type { Organization } from "@datagouv/components/ts"; 2 | import { readonly, ref } from "vue"; 3 | 4 | const currentOrganization = ref(null); 5 | 6 | export function useCurrentOrganization() { 7 | const setCurrentOrganization = (organization: Organization) => { 8 | currentOrganization.value = organization; 9 | } 10 | 11 | return { 12 | currentOrganization: readonly(currentOrganization), 13 | setCurrentOrganization, 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/useHash.ts: -------------------------------------------------------------------------------- 1 | import { ref, onMounted, onUnmounted } from 'vue' 2 | 3 | export function useHash() { 4 | const hash = ref(window.location.hash); 5 | const update = () => hash.value = window.location.hash; 6 | 7 | onMounted(() => window.addEventListener('hashchange', update)); 8 | onUnmounted(() => window.removeEventListener('hashchange', update)); 9 | 10 | return { hash }; 11 | } 12 | 13 | export function resetHash() { 14 | history.pushState(null, "", " "); 15 | window.dispatchEvent(new HashChangeEvent('hashchange')); 16 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/useLicense.ts: -------------------------------------------------------------------------------- 1 | import type { License } from "@datagouv/components/ts"; 2 | import { MaybeRefOrGetter, ref, toValue, watchEffect } from "vue"; 3 | import fetchLicenses from "../api/licenses"; 4 | 5 | /** TODO : to be removed when the component moved to data.gouv.fr-components */ 6 | 7 | export default function useLicense(id: MaybeRefOrGetter) { 8 | const license = ref(null); 9 | watchEffect(() => { 10 | id = toValue(id); 11 | fetchLicenses().then(licenses => { 12 | const found = licenses.find((license: License) => license.id === id); 13 | if(found) { 14 | license.value = found; 15 | } 16 | }); 17 | }); 18 | return license; 19 | } 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/useSearchUrl.ts: -------------------------------------------------------------------------------- 1 | import { computed, MaybeRefOrGetter, toValue } from "vue"; 2 | import { dataservice_url, dataset_url, organization_url, reuse_url } from "../config"; 3 | 4 | export default function useSearchUrl(q: MaybeRefOrGetter) { 5 | const datasetUrl = computed(() => `${dataset_url}?q=${toValue(q)}`); 6 | const dataserviceUrl = computed(() => `${dataservice_url}?q=${toValue(q)}`); 7 | const organizationUrl = computed(() => `${organization_url}?q=${toValue(q)}`); 8 | const reuseUrl = computed(() => `${reuse_url}?q=${toValue(q)}`); 9 | return { 10 | dataserviceUrl, 11 | datasetUrl, 12 | organizationUrl, 13 | reuseUrl, 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/useToast.js: -------------------------------------------------------------------------------- 1 | import { createToaster } from "@conciergerie.dev/vue-toaster"; 2 | 3 | const toast = createToaster({ 4 | duration: false, 5 | dismissible: true, 6 | }); 7 | 8 | export function useToast() { 9 | return { toast }; 10 | } 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/composables/useUid.js: -------------------------------------------------------------------------------- 1 | import { readonly } from "vue"; 2 | 3 | let uid = 0; 4 | export default function useUid(prefix = 'id') { 5 | uid++; 6 | return readonly({ 7 | id: `${prefix}-${uid}`, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/js/plugins/api.ts: -------------------------------------------------------------------------------- 1 | import type { App } from "vue"; 2 | import { api_root_absolute, api_2_root_absolute, api, apiv2, generateCancelToken } from "@datagouv/components/ts"; 3 | 4 | export { api_root_absolute, api_2_root_absolute, api, apiv2, generateCancelToken }; 5 | 6 | export const install = (app: App) => { 7 | app.config.globalProperties.$api = api; 8 | app.config.globalProperties.$apiv2 = apiv2; 9 | }; 10 | 11 | export default install; 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/alert.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/alert/alert.css"; 2 | 3 | .fr-alert { 4 | &, &.fr-alert::before { 5 | line-height: 1.5rem; 6 | } 7 | p { 8 | margin: var(--text-spacing); 9 | } 10 | .fr-alert__title { 11 | margin: var(--title-spacing); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/badge.less: -------------------------------------------------------------------------------- 1 | /* 2 | --- 3 | name: Badges 4 | category: 3 - Components 5 | --- 6 | 7 | Merriam-Webster defines a badge as an emblem awarded for a particular accomplishment. 8 | Since we consider moderating and publishing data on this website an amazing feat, we decided to award badges for all the people involved. 9 | Additionally, it also allows regular-non-awarded people to quickly identify public servants and administrators. 10 | 11 | ```badge.html 12 | Admin 13 | Owner 14 | ``` 15 | */ 16 | 17 | .fr-badge { 18 | & > [class^="fr-icon-"], 19 | & > [class*=" fr-icon-"] { 20 | margin-right: 0.25rem; 21 | } 22 | } 23 | 24 | .fr-badge--mention-grey { 25 | color: @text-mention-grey; 26 | } 27 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/card.less: -------------------------------------------------------------------------------- 1 | .fr-card__title a[href] { 2 | color: var(--text-title-grey); 3 | } 4 | 5 | .fr-card__img img { 6 | object-fit: cover; 7 | } 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/follow-button.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/follow/follow.css"; 2 | 3 | .fr-follow { 4 | --background-alt-blue-france: var(--background-default-grey); 5 | --background-alt-blue-france-hover: var(--background-default-grey-hover); 6 | --background-alt-blue-france-active: var(--background-default-grey-active); 7 | --border-default-blue-france: @grey-125; 8 | } 9 | 10 | .follow-button { 11 | .justify-center; 12 | min-width: 2.5rem; 13 | } 14 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/organization-search.less: -------------------------------------------------------------------------------- 1 | .shadow { 2 | box-shadow: 0px 4px 4px var(--border-default-grey); 3 | } 4 | 5 | .border-bottom-rounded { 6 | border-bottom-left-radius: 0.25rem; 7 | border-bottom-right-radius: 0.25rem; 8 | } 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/pagination.less: -------------------------------------------------------------------------------- 1 | .fr-pagination { 2 | --background-active-blue-france: @blue-400; 3 | } 4 | 5 | .fr-pagination--centered { 6 | display: flex; 7 | justify-content: center; 8 | } 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/search-input.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/search/search.css"; 2 | 3 | .fr-input { 4 | --border-action-high-blue-france: @blue-400; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/segmented-control.less: -------------------------------------------------------------------------------- 1 | .fr-segmented__element { 2 | --text-active-blue-france: @blue-400; 3 | --border-active-blue-france: @blue-400; 4 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/stepper.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/stepper/stepper.css"; 2 | 3 | .fr-stepper { 4 | --background-active-blue-france: @blue-400; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/tabs-home.less: -------------------------------------------------------------------------------- 1 | [data-tabs] { 2 | [role=tab] { 3 | // Prevents children from taking the click events. 4 | // Might be dangerous, remove if needed 5 | > * { 6 | pointer-events: none; 7 | } 8 | 9 | &.active { 10 | pointer-events: none; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/tabs-no-js.less: -------------------------------------------------------------------------------- 1 | .fr-tabs { 2 | &:not([data-fr-js-tabs-group]) { 3 | display: block; 4 | } 5 | & > .fr-tabs__panel:not([data-fr-js-tab-panel]) { 6 | left: 0; 7 | &:not(.fr-tabs__panel--selected) { 8 | visibility: visible; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/tabs.less: -------------------------------------------------------------------------------- 1 | .fr-tabs { 2 | --text-active-blue-france: @blue-400; 3 | --border-active-blue-france: @blue-400; 4 | --background-action-low-blue-france: @background-action-low-blue-cumulus; 5 | --background-action-low-blue-france-hover: @background-action-low-blue-cumulus-hover; 6 | --background-action-low-blue-france-active: @background-action-low-blue-cumulus-active; 7 | z-index: 1; 8 | } 9 | 10 | .fr-tabs--no-border { 11 | &::before { 12 | margin: -1px; 13 | } 14 | } 15 | 16 | .fr-tabs__panel--no-padding { 17 | padding: 0.25rem; 18 | padding-bottom: 2.5rem; 19 | } 20 | 21 | .fr-tabs__panel--no-padding:focus, .fr-tabs__panel--no-padding:focus-visible { 22 | outline-offset: -2px; 23 | } 24 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/components/tile.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/tile/tile.css"; 2 | 3 | .fr-tile { 4 | --border-active-blue-france: @blue-400; 5 | } 6 | 7 | .fr-tile__title a::after { 8 | display: none; 9 | } 10 | 11 | .fr-tile__title a.fr-tile__link { 12 | color: inherit; 13 | } 14 | 15 | .fr-tile--left { 16 | .fr-tile__body { 17 | justify-content: start; 18 | align-items: flex-start; 19 | text-align: start; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/content/not-enlarged-links.less: -------------------------------------------------------------------------------- 1 | @import "../variables.less"; 2 | 3 | .not-enlarged { 4 | position: relative; 5 | z-index: 2; 6 | } 7 | 8 | .fr-enlarge-link .not-enlarged a { 9 | background-image: var(--underline-img), var(--underline-img); 10 | &:hover { 11 | @dsfr-hover(); 12 | } 13 | &::before { 14 | background: none; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/examples.css: -------------------------------------------------------------------------------- 1 | /* Special styling for grid blocks */ 2 | .fr-container [class^="fr-col"], 3 | .fr-container--fluid [class^="fr-col"] { 4 | padding: 30px; 5 | color: white; 6 | font-weight: bold; 7 | text-align: center; 8 | } 9 | 10 | /* Styles for displaying color chips */ 11 | .pill { 12 | display: inline-block; 13 | width: 25px; 14 | height: 25px; 15 | margin-right: 15px; 16 | vertical-align: middle; 17 | border-radius: 50%; 18 | } 19 | 20 | .pill.bg-white { 21 | border: 1px solid #eeeee8; 22 | } 23 | 24 | /* Styles for spacing blocks */ 25 | .block { 26 | width: 50%; 27 | text-align: center; 28 | background-color: #eeeee8; 29 | } 30 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/images/chevron.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/assets/less/images/logo.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/layout/responsive.less: -------------------------------------------------------------------------------- 1 | @breakpoint-sm: 36em; 2 | @breakpoint-md: 48em; 3 | @breakpoint-lg: 62em; 4 | @breakpoint-xl: 1100px; 5 | @breakpoint-hg: 1300px; 6 | @breakpoint-hhg: 1350px; 7 | 8 | @dsfr-query-sm: ~"(min-width: @{breakpoint-sm})"; 9 | @dsfr-query-md: ~"(min-width: @{breakpoint-md})"; 10 | @dsfr-query-lg: ~"(min-width: @{breakpoint-lg})"; 11 | @dsfr-query-xl: ~"(min-width: @{breakpoint-xl})"; 12 | @dsfr-query-hg: ~"(min-width: @{breakpoint-hg})"; 13 | 14 | @query-sm: ~"screen and (max-width: @{breakpoint-sm})"; 15 | @query-md: ~"screen and (max-width: @{breakpoint-md})"; 16 | 17 | @breakpoints: md, sm; 18 | @dsfr-breakpoints: sm, md, lg, xl, hg; 19 | 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/layout/rhythm.less: -------------------------------------------------------------------------------- 1 | /* 2 | --- 3 | name: Rhythm 4 | category: 1 - Layout 5 | --- 6 | 7 | ## Spacing 8 | Use a standardised spacing value for most of the general layout to ensure consistency across pages. 9 | Prefer setting your vertical rhythm using `margin-bottom` to avoid entering the collapsing margins hell. 10 | 11 | See DSFR spacing documentation. 12 | */ 13 | 14 | @spacing-xxs: 0.25rem; 15 | @spacing-xs: 0.5rem; 16 | @spacing-sm: 0.75rem; 17 | @spacing-md: 1rem; 18 | @spacing-lg: 1.5rem; 19 | @spacing-xl: 2.25rem; 20 | @spacing-hg: 3.5rem; 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/footer.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/footer/footer.css"; 2 | 3 | .fr-footer { 4 | --border-plain-blue-france: var(--border-action-high-grey); 5 | } 6 | 7 | .fr-footer__top-link { 8 | &:extend(a.unstyled); 9 | } 10 | 11 | .fr-footer__top { 12 | .etalab-logo svg { 13 | width: 130px; 14 | } 15 | } 16 | 17 | @media @dsfr-query-md { 18 | .fr-follow .fr-grid-row > *:not(:last-child) { 19 | padding-right: 6%; 20 | } 21 | 22 | .fr-follow .fr-grid-row > *:not(:first-child) { 23 | padding-left: 6%; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/metrics-bar.less: -------------------------------------------------------------------------------- 1 | .metrics-bar { 2 | position: relative; 3 | 4 | .bar { 5 | border-radius: 20px; 6 | border: 1px solid @grey-50; 7 | box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.05); 8 | background: white; 9 | 10 | &:after { 11 | content: " "; 12 | display: block; 13 | 14 | position: absolute; 15 | left: 0; 16 | top: 50%; 17 | 18 | z-index: -1; 19 | 20 | width: 100%; 21 | height: 50%; 22 | 23 | background: @grey-50; 24 | } 25 | 26 | @media @query-md { 27 | > div { 28 | flex-direction: column; 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/oauth.less: -------------------------------------------------------------------------------- 1 | .client-logo { 2 | max-height: 78px; 3 | object-fit: contain; 4 | object-position: left; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/oembed.less: -------------------------------------------------------------------------------- 1 | .fr-grid-row [data-udata-reuse] > * { 2 | height: 100%; 3 | } 4 | 5 | .udata-oembed--border-bottom > .border { 6 | .border-0; 7 | .border-bottom; 8 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/search.less: -------------------------------------------------------------------------------- 1 | // Big searchy boy 2 | 3 | .fr-container--search { 4 | .search-results { 5 | min-height: 450px; // This allow the different filter dropdowns to have enough space while loading 6 | } 7 | .fr-sidemenu__title { 8 | font-size: 1rem; 9 | } 10 | @media @dsfr-query-md { 11 | .fr-sidemenu__inner { 12 | padding-left: 0; 13 | } 14 | .fr-sidemenu__inner > .fr-collapse { 15 | padding-left: 0; 16 | padding-right: 0; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/specific/translate.less: -------------------------------------------------------------------------------- 1 | @import (less) "@gouvfr/dsfr/dist/component/translate/translate.css"; 2 | 3 | .fr-translate .fr-translate__btn[aria-expanded=true] { 4 | --text-active-blue-france: @blue-400; 5 | --background-open-blue-france: @background-action-low-blue-cumulus; 6 | --background-open-blue-france-hover: @background-action-low-blue-cumulus-hover; 7 | --background-open-blue-france-active: @background-action-low-blue-cumulus-active; 8 | } 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/assets/less/theme.css: -------------------------------------------------------------------------------- 1 | .theme-sidebar-header-title { 2 | display: block; 3 | margin-top: 15px; 4 | } 5 | 6 | .theme-sidebar-header { 7 | text-align: center; 8 | } 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/babel.cfg: -------------------------------------------------------------------------------- 1 | [ignore: static/**] 2 | 3 | [python: **.py] 4 | 5 | [jinja2: **/templates/**.html] 6 | encoding = utf-8 7 | silent = false 8 | extensions = flask_caching.jinja2ext.CacheExtension 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | !src/env.d.ts 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.npmrc: -------------------------------------------------------------------------------- 1 | access="public" 2 | tag-version-prefix="@datagouv/components@" 3 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.nvmrc: -------------------------------------------------------------------------------- 1 | 20.10.0 2 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.storybook/main.ts: -------------------------------------------------------------------------------- 1 | import type { StorybookConfig } from '@storybook/vue3-vite'; 2 | 3 | const config : StorybookConfig = { 4 | stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], 5 | addons: [ 6 | "@storybook/addon-links", 7 | "@storybook/addon-essentials", 8 | "@storybook/addon-interactions", 9 | ], 10 | framework: { 11 | name: "@storybook/vue3-vite", 12 | options: {}, 13 | }, 14 | staticDirs: ['./msw', '../../templates/svg'], 15 | docs: { 16 | autodocs: "tag", 17 | }, 18 | }; 19 | export default config; 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.storybook/manager.ts: -------------------------------------------------------------------------------- 1 | import { addons } from '@storybook/manager-api'; 2 | import gouvfrTheme from './theme'; 3 | 4 | addons.setConfig({ 5 | theme: gouvfrTheme, 6 | }); 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.storybook/previewBody.ts: -------------------------------------------------------------------------------- 1 | export default function (body: string) { return ` 2 |
3 | ${body} 4 |
5 | `}; 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/.storybook/theme.ts: -------------------------------------------------------------------------------- 1 | import { create } from '@storybook/theming/create'; 2 | import logo from '../../templates/svg/logotype.svg'; 3 | 4 | export default create({ 5 | base: 'light', 6 | // Typography 7 | fontBase: 'Marianne, sans-serif', 8 | fontCode: 'monospace', 9 | 10 | brandTitle: 'data.gouv.fr-components Storybook', 11 | brandUrl: 'https://www.data.gouv.fr', 12 | brandImage: logo, 13 | colorPrimary: '#161616', 14 | colorSecondary: '#3558a2' 15 | }); 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/demo-vue-router/Details.vue: -------------------------------------------------------------------------------- 1 | 4 | 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/demo-vue-router/View.vue: -------------------------------------------------------------------------------- 1 | 4 | 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/demo-vue-router/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue 8 | 9 | 10 |
11 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/demo/index.ts: -------------------------------------------------------------------------------- 1 | import "@gouvfr/dsfr/dist/dsfr.min.css"; 2 | import "@gouvfr/dsfr/dist/utility/utility.min.css"; 3 | 4 | import { setupI18n } from '../src'; 5 | 6 | import { createApp } from 'vue'; 7 | import App from './App.vue'; 8 | 9 | const i18n = setupI18n(); 10 | 11 | createApp(App) 12 | .use(i18n) 13 | .mount('#app'); 14 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue 8 | 9 | 10 | vue router 11 |
12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "modules": false, 3 | "plugins": {}, 4 | }; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./api"; 2 | export * from "./frequency"; 3 | export * from "./granularity"; 4 | export * from "./reuses"; 5 | export * from "./schemas"; 6 | export * from "./zones"; 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/api/licenses.ts: -------------------------------------------------------------------------------- 1 | import { getLocalizedUrl } from "../helpers/i18n"; 2 | import { type License } from "../types/licenses"; 3 | import { api } from "../api"; 4 | 5 | let licensesRequest: Promise; 6 | 7 | export function getLicensesUrl() { 8 | return getLocalizedUrl("datasets/licenses/"); 9 | } 10 | 11 | export default function fetchLicenses(): Promise { 12 | if (licensesRequest) { 13 | return licensesRequest; 14 | } 15 | return licensesRequest = api.get(getLicensesUrl()) 16 | .then((resp) => resp.data); 17 | } 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/api/zones.ts: -------------------------------------------------------------------------------- 1 | import { getLocalizedUrl } from "../helpers/i18n"; 2 | import { api } from "./api"; 3 | 4 | export function getZoneUrl(zoneId: string) { 5 | return getLocalizedUrl('spatial/zones/' + zoneId + '/'); 6 | } 7 | 8 | export function fetchZone(zoneId: string): Promise { 9 | return api.get(getZoneUrl(zoneId)) 10 | .then((resp) => resp.data.features[0].properties.name); 11 | } 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/author.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/author.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/dataset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/dataset.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/news.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/organization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/organization.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/reuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datagouv/udata-front/f00c4c138f3128a7af59039bbd945b7494bf85ef/udata_front/theme/gouvfr/datagouv-components/src/assets/img/placeholders/reuse.png -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/AppLink/index.ts: -------------------------------------------------------------------------------- 1 | import AppLink from "./AppLink.vue"; 2 | 3 | export { AppLink }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/AsyncTextClamp/AsyncTextClamp.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Avatar/Avatar.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 27 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Avatar/AvatarWithName.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Avatar/index.ts: -------------------------------------------------------------------------------- 1 | import Avatar from "./Avatar.vue"; 2 | import AvatarWithName from "./AvatarWithName.vue"; 3 | export { Avatar, AvatarWithName }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/CopyButton/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import "../button.less"; 3 | import CopyButton from "./CopyButton.vue"; 4 | 5 | export { CopyButton }; 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DataserviceCard/index.ts: -------------------------------------------------------------------------------- 1 | import "../badge.less"; 2 | import "../base.less"; 3 | import "../button.less"; 4 | import "../links.less"; 5 | import DataserviceCard from "./DataserviceCard.vue"; 6 | 7 | export { DataserviceCard }; 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DataserviceLinks/index.ts: -------------------------------------------------------------------------------- 1 | import DataserviceLinks from "./DataserviceLinks.vue"; 2 | 3 | export { DataserviceLinks }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DatasetCard/TestComponent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DatasetCard/index.ts: -------------------------------------------------------------------------------- 1 | import "../badge.less"; 2 | import "../base.less"; 3 | import "../button.less"; 4 | import "../dataset.less"; 5 | import "../logo.less"; 6 | import "../links.less"; 7 | import DatasetCard from "./DatasetCard.vue"; 8 | 9 | export { DatasetCard }; 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DescriptionList/DescriptionDetails.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DescriptionList/DescriptionList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/DescriptionList/DescriptionTerm.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ExtraAccordion/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import "../accordion.less"; 3 | import "../border.less"; 4 | import "../button.less"; 5 | import ExtraAccordion from "./ExtraAccordion.vue"; 6 | 7 | export default ExtraAccordion; 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/InformationPanel/index.ts: -------------------------------------------------------------------------------- 1 | import '../embed.less'; 2 | import InformationPanel from "./InformationPanel.vue"; 3 | 4 | export default InformationPanel; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Organization/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import OrganizationNameWithCertificate from "./OrganizationNameWithCertificate.vue"; 3 | 4 | export { OrganizationNameWithCertificate }; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Owner/index.ts: -------------------------------------------------------------------------------- 1 | import OwnerType from "./OwnerType.vue"; 2 | import OwnerTypeIcon from "./OwnerTypeIcon.vue"; 3 | 4 | export { OwnerType, OwnerTypeIcon }; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Pagination/index.ts: -------------------------------------------------------------------------------- 1 | import "../pagination.less"; 2 | import Pagination from "./Pagination.vue"; 3 | 4 | export default Pagination; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Placeholder/index.ts: -------------------------------------------------------------------------------- 1 | import Placeholder from "./Placeholder.vue"; 2 | 3 | export { Placeholder }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityComponent/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import "../button.less"; 3 | import "../quality-score.less"; 4 | import QualityComponent from "./QualityComponent.vue"; 5 | export { QualityComponent }; 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityComponentInline/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import "../button.less"; 3 | import "../quality-score.less"; 4 | import QualityComponentInline from "./QualityComponentInline.vue"; 5 | export { QualityComponentInline }; 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityItem/QualityItem.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityItem/index.ts: -------------------------------------------------------------------------------- 1 | import QualityItem from "./QualityItem.vue"; 2 | export { QualityItem }; 3 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityItemWarning/QualityItemWarning.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityItemWarning/index.ts: -------------------------------------------------------------------------------- 1 | import QualityItemWarning from "./QualityItemWarning.vue"; 2 | export { QualityItemWarning } 3 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/QualityScore/index.ts: -------------------------------------------------------------------------------- 1 | import "../quality-score.less"; 2 | import QualityScore from "./QualityScore.vue"; 3 | export { QualityScore }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ReadMore/index.ts: -------------------------------------------------------------------------------- 1 | import "../read-more.less"; 2 | import ReadMore from "./ReadMore.vue"; 3 | export { ReadMore }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/DataStructure/index.ts: -------------------------------------------------------------------------------- 1 | import DataStructure from "./DataStructure.vue"; 2 | import "../../base.less"; 3 | 4 | export default DataStructure; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/Loader.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/vue3'; 2 | import Loader from './Loader.vue'; 3 | 4 | const meta = { 5 | title: "Components/Resource/Internals/Loader", 6 | component: Loader, 7 | tags: ['autodocs'], 8 | parameters: { 9 | docs: { 10 | description: { 11 | component: "The Loader is shown while resources are loading." 12 | } 13 | } 14 | }, 15 | } satisfies Meta; 16 | 17 | export default meta; 18 | 19 | export const ResourceLoader: StoryObj = { 20 | render: (args) => ({ 21 | components: { Loader }, 22 | setup() { 23 | return { args }; 24 | }, 25 | template: '', 26 | }), 27 | args: {} 28 | }; 29 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/Loader.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/Preview/index.ts: -------------------------------------------------------------------------------- 1 | import Preview from "./Preview.vue"; 2 | import "../../base.less"; 3 | import "../../border.less"; 4 | import "../../button.less"; 5 | import "../../table.less"; 6 | import "../../visibility.less"; 7 | 8 | export default Preview; 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/ResourceIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/SchemaLoader.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ResourceAccordion/index.ts: -------------------------------------------------------------------------------- 1 | import "../base.less"; 2 | import "../accordion.less"; 3 | import "../border.less"; 4 | import "../button.less"; 5 | import "../tabs.less"; 6 | import "../links.less"; 7 | import "../segmented-control.less"; 8 | import ResourceAccordion from "./ResourceAccordion.vue"; 9 | import Loader from "./Loader.vue"; 10 | 11 | export { ResourceAccordion, Loader }; 12 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/ReuseCard/index.ts: -------------------------------------------------------------------------------- 1 | import "../badge.less"; 2 | import "../base.less"; 3 | import "../reuse.less"; 4 | import "../links.less"; 5 | import ReuseCard from "./ReuseCard.vue"; 6 | export { ReuseCard }; 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/SmallChart/index.ts: -------------------------------------------------------------------------------- 1 | import SmallChart from "./SmallChart.vue"; 2 | import "../base.less"; 3 | 4 | export { SmallChart }; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/StatBox/index.ts: -------------------------------------------------------------------------------- 1 | import StatBox from "./StatBox.vue"; 2 | import "../base.less"; 3 | 4 | export { StatBox }; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Tabs/TabGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Tabs/TabList.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Tabs/TabPanel.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Tabs/TabPanels.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Toggletip/Toggletip.stories.ts: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/vue3'; 2 | import { Toggletip } from '.'; 3 | 4 | const meta = { 5 | title: 'Components/Toggletip', 6 | component: Toggletip, 7 | } satisfies Meta; 8 | 9 | export default meta; 10 | 11 | export const SimpleToggletip: StoryObj = { 12 | render: (args) => ({ 13 | components: { Toggletip }, 14 | setup() { 15 | return { args }; 16 | }, 17 | template: ` 18 | Click on Me 19 | 20 | `, 21 | }), 22 | args: {}, 23 | }; 24 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Toggletip/ToggletipButton.vue: -------------------------------------------------------------------------------- 1 | 7 | 28 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Toggletip/index.ts: -------------------------------------------------------------------------------- 1 | import "../toggletip.less"; 2 | import Toggletip from "./Toggletip.vue"; 3 | export { Toggletip }; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/Well/index.ts: -------------------------------------------------------------------------------- 1 | import "../well.less"; 2 | import Well from "./Well.vue"; 3 | 4 | export default Well; 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/accordion.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/accordion.less"; 5 | } 6 | 7 | :root { 8 | @accordion-content-if-js(); 9 | } 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/badge.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/badge.less"; 5 | 6 | .fr-badge--sm { 7 | max-height: 1.25rem; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/base.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/icons.less"; 5 | @import "../../../assets/less/content/colors.less"; 6 | @import "../../../assets/less/content/typography.less"; 7 | @import "../../../assets/less/layout/responsive.less"; 8 | @import "../../../assets/less/layout/rhythm.less"; 9 | @import "../../../assets/less/layout/grid.less"; 10 | } 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/border.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/button.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/buttons.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/dataset.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/content/not-enlarged-links.less"; 5 | @import "../../../assets/less/content/visibility.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/embed.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/embed.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/links.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | @import "../../../assets/less/content/links.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/logo.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | @import "../../../assets/less/components/logo.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/pagination.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/pagination.less"; 5 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/quality-score.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | @import "../../../assets/less/components/quality-score.less"; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/read-more.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | @import "../../../assets/less/components/read-more.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/reuse.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/content/not-enlarged-links.less"; 5 | @import "../../../assets/less/components/card.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/segmented-control.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/segmented-control.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/table.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/table.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/tabs.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/borders.less"; 5 | @import "../../../assets/less/components/tabs.less"; 6 | } 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/toggletip.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | .datagouv-components { 3 | @import "../../../assets/less/components/tooltip.less"; 4 | } 5 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/visibility.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/content/visibility.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/components/well.less: -------------------------------------------------------------------------------- 1 | @import "../../../assets/less/variables.less"; 2 | 3 | .datagouv-components { 4 | @import "../../../assets/less/components/well.less"; 5 | } 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/organizations/useOwnerName.ts: -------------------------------------------------------------------------------- 1 | import { type MaybeRefOrGetter, toValue, computed } from 'vue'; 2 | import type { Owned } from "../../types/owned"; 3 | 4 | export default function useOwnerName(owned: MaybeRefOrGetter) { 5 | const owner = computed(() => { 6 | const ownedValue = toValue(owned); 7 | if(ownedValue) { 8 | if(ownedValue.organization) { 9 | return ownedValue.organization.name; 10 | } else { 11 | return ownedValue.owner.first_name + " " + ownedValue.owner.last_name; 12 | } 13 | } 14 | }); 15 | 16 | return owner; 17 | } 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/useAccordion.ts: -------------------------------------------------------------------------------- 1 | import { ref } from "vue"; 2 | import { toggleAccordion } from "../helpers"; 3 | 4 | export default function useAccordion(id: string) { 5 | const expanded = ref(false); 6 | function expand() { 7 | expanded.value = !expanded.value; 8 | const element = document.getElementById(id); 9 | if(element) { 10 | toggleAccordion(element, expanded.value); 11 | } 12 | }; 13 | return { 14 | expanded, 15 | expand, 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/useLicense.ts: -------------------------------------------------------------------------------- 1 | import {ref, unref} from "vue"; 2 | import fetchLicenses from "../api/licenses"; 3 | import { type License } from "../types/licenses"; 4 | 5 | export default function useLicense(id: string) { 6 | id = unref(id); 7 | const license = ref(null); 8 | fetchLicenses().then((licenses: License[]) => { 9 | const found = licenses.find(license => license.id === id); 10 | if(found) { 11 | license.value = found; 12 | } 13 | }); 14 | return license; 15 | } 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/useOEmbed.ts: -------------------------------------------------------------------------------- 1 | import { config } from ".."; 2 | 3 | function constructUrl(baseUrl: string, path: string): string { 4 | const url = new URL(baseUrl); 5 | url.pathname = `${url.pathname}${path}` 6 | return url.toString(); 7 | } 8 | 9 | export default function useOEmbed(type: string, id: string): string { 10 | const staticUrl = constructUrl(config.static_root, 'oembed.js'); 11 | return `
` + '<' + `script data-udata="${config.site_root}" src="${staticUrl}" async defer><` + '/script>'; 12 | } 13 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/useReuseType.ts: -------------------------------------------------------------------------------- 1 | import { type MaybeRefOrGetter, toValue } from "vue"; 2 | import { fetchReuseTypes, getType } from "../api/reuses"; 3 | import { computedAsync } from "@vueuse/core"; 4 | 5 | export default function useReuseType(id: MaybeRefOrGetter) { 6 | const label = computedAsync(async () => { 7 | const idValue = toValue(id); 8 | const types = await fetchReuseTypes(); 9 | return getType(types, idValue); 10 | }, ""); 11 | return { 12 | label, 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/composables/useToast.ts: -------------------------------------------------------------------------------- 1 | import { createToaster } from "@conciergerie.dev/vue-toaster"; 2 | 3 | const toast = createToaster({ 4 | duration: false, 5 | dismissible: true, 6 | }); 7 | 8 | export function useToast() { 9 | return { toast }; 10 | } 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/helpers/getUserAvatar.ts: -------------------------------------------------------------------------------- 1 | import { config } from "../config"; 2 | import type { User } from "../types/users"; 3 | 4 | /** 5 | * @deprecated use `getUserAvatar` instead, it isn't a composable so it shouldn't use the `use` convention 6 | */ 7 | export function useUserAvatar(user: User, size: number) { 8 | return getUserAvatar(user, size); 9 | } 10 | 11 | export default function getUserAvatar(user: User, size: number) { 12 | const getIdenticon = (id: string, size: number) => `${config.api_root}avatars/${id}/${size}`; 13 | return user.avatar_thumbnail || getIdenticon(user.id, size); 14 | } 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/helpers/matomo.ts: -------------------------------------------------------------------------------- 1 | export function trackEvent(values: Array): void { 2 | globalThis._paq?.push(['trackEvent', ...values]); 3 | } -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/helpers/throwOnNever.ts: -------------------------------------------------------------------------------- 1 | export function throwOnNever(_: never, message: string): never { 2 | throw new Error(message); 3 | } 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/badges.ts: -------------------------------------------------------------------------------- 1 | export type Badge = { 2 | kind: string; 3 | }; 4 | 5 | export type Badges = Array; 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/contact_point.ts: -------------------------------------------------------------------------------- 1 | export type ContactPoint = { 2 | id: string; 3 | name: string; 4 | contact_form?: string; 5 | email?: string; 6 | role: string; 7 | } 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/frequency.ts: -------------------------------------------------------------------------------- 1 | export type Frequency = { 2 | id: string; 3 | label: string; 4 | }; 5 | 6 | export type Frequencies = Array; 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/granularity.ts: -------------------------------------------------------------------------------- 1 | export type Granularity = { 2 | id: string; 3 | name: string; 4 | }; 5 | 6 | export type Granularities = Array; 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/harvest.ts: -------------------------------------------------------------------------------- 1 | export type Harvest = Record & { 2 | backend?: string; 3 | } | null; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/licenses.ts: -------------------------------------------------------------------------------- 1 | export type License = { 2 | alternate_titles: Array; 3 | alternate_urls: Array; 4 | flags: Array; 5 | id: string; 6 | maintainer: string | null; 7 | title: string; 8 | url: string; 9 | }; 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/owned.ts: -------------------------------------------------------------------------------- 1 | import { Organization } from "./organizations"; 2 | import { User } from "./users"; 3 | 4 | /** 5 | * A resource, dataset, reuse or any other object owned by an organization or a user. 6 | */ 7 | export type Owned = { organization: Organization, owner: never | null } | { organization: never | null, owner: User }; 8 | 9 | export type OwnedWithId = { organization: string, owner: never | null } | { organization: never | null, owner: string }; 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/ui.ts: -------------------------------------------------------------------------------- 1 | export type WellType = "primary" | "secondary"; 2 | 3 | export type Weight = "light" | "regular" | "semi-bold" | "bold" | "heavy"; 4 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/datagouv-components/src/types/users.ts: -------------------------------------------------------------------------------- 1 | export type User = { 2 | id: string; 3 | slug?: string; 4 | first_name: string; 5 | last_name: string; 6 | avatar?: string | null; 7 | page: string; 8 | avatar_thumbnail?: string | null; 9 | roles?: Array; 10 | } 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "application": "udata", 3 | "identifier": "gouvfr", 4 | "name": "Data.gouv.fr", 5 | "author": "Etalab", 6 | "description": "Data.gouv.fr theme", 7 | "website": "http://data.gouv.fr", 8 | "license": "AGPL", 9 | "version": "0.1.0", 10 | "doctype": "html5", 11 | "variants": ["deuil"], 12 | "github_faq_url_pattern": "https://github.com/etalab/udata-gouvfr/edit/master/udata_front/templates/faq/{page_name}.html" 13 | } 14 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/api/oauth_error.html: -------------------------------------------------------------------------------- 1 | {% extends theme("base.html") %} 2 | 3 | {% block content %} 4 |
5 |
6 |

{{ _('OAuth Authentication Error') }}

7 | {% if error %} 8 |

{{ error }}

9 | {% endif %} 10 |

11 | 12 | {{ _('Home') }} 13 | 14 |

15 |
16 |
17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/banners/feedback.html: -------------------------------------------------------------------------------- 1 | {% if config.DISCOVERABILITY_FORM_URL %} 2 |
3 |
4 |
5 | 9 | 12 |
13 |
14 |
15 | {% endif %} 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/banners/generic.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/banners/read-only.html: -------------------------------------------------------------------------------- 1 | {% from theme('macros/banner_warning.html') import banner_warning %} 2 | {{ banner_warning( 3 | "fr-icon-alert-line", 4 | _('Due to security reasons, the creation of new content is currently disabled.') 5 | )}} 6 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/comments/dataset_archived.txt: -------------------------------------------------------------------------------- 1 | {% trans %}This dataset has been archived by our administration team. 2 | 3 | An archived dataset is considered out of date by a combination of factors. 4 | It does not appear in the search results and has a special layout warning the site's users. 5 | 6 | If you think this is a mistake, you can contact the site administrator.{% endtrans %} 7 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataservice/card.html: -------------------------------------------------------------------------------- 1 |
2 | 9 |
-------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataservice/feed_item.html: -------------------------------------------------------------------------------- 1 | {{dataservice.description|markdown}} 2 | 3 | {% if dataservice.organization %} 4 | 6 | {{ dataservice.organization.title }} 8 | 9 | {% elif dataservice.owner %} 10 | 12 | {{ dataservice.owner.fullname }} 14 | 15 | {% endif %} 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataset-apis.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataset/feed_item.html: -------------------------------------------------------------------------------- 1 | {{dataset.description|markdown}} 2 | 3 | {% if dataset.organization %} 4 | 6 | {{ dataset.organization.title }} 8 | 9 | {% elif dataset.owner %} 10 | 12 | {{ dataset.owner.fullname }} 14 | 15 | {% endif %} 16 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataset/oembed.html: -------------------------------------------------------------------------------- 1 | {% include theme('dataset/card-xs.html') with context %} 2 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/dataset/search-results.html: -------------------------------------------------------------------------------- 1 |
    2 | {% for dataset in datasets %} 3 | {# FIXME: remove with loop when upgrading jinja. See https://github.com/pallets/jinja/pull/1242 #} 4 | {% with loop_ = loop %} 5 |
  • 6 | {% include theme('dataset/card-lg.html') %} 7 |
  • 8 | {% endwith %} 9 | {% endfor %} 10 |
11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/400.html: -------------------------------------------------------------------------------- 1 | {% extends theme("errors/base.html") %} 2 | 3 | {% set title = _('Bad request') %} 4 | 5 | {% block details %} 6 |

{{ error.message }}

7 | {% if sentry_event_id %} 8 |

{{ _('The error identifier is {id}').format(id=sentry_event_id) }}

9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/403.html: -------------------------------------------------------------------------------- 1 | {% extends theme("errors/base.html") %} 2 | 3 | {% set title = _('Forbidden') %} 4 | 5 | {% block details %} 6 |

{{ _("You are not allowed to display this page.") }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/404.html: -------------------------------------------------------------------------------- 1 | {% extends theme("errors/base.html") %} 2 | 3 | {% set title = _('Page Not Found') %} 4 | 5 | {% block details %} 6 |

{{ _("The page you're looking for could not be found.") }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/410.html: -------------------------------------------------------------------------------- 1 | {% extends theme("errors/base.html") %} 2 | 3 | {% set title = _('Page Not Found') %} 4 | 5 | {% block details %} 6 |

{{ _("The page you're looking has been deleted.") }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/500.html: -------------------------------------------------------------------------------- 1 | {% extends theme("errors/base.html") %} 2 | 3 | {% set title = _('Internal server error') %} 4 | 5 | {% block details %} 6 |

{{ _("The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.") }}

7 | {% if sentry_event_id %} 8 |

{{ _('The error identifier is {id}').format(id=sentry_event_id) }}

9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/errors/base.html: -------------------------------------------------------------------------------- 1 | {% extends theme("base.html") %} 2 | 3 | {% set title = title|default(error.name) %} 4 | 5 | {% block content %} 6 |
7 |
8 |

9 | {{ _('Error %(code)s', code=error.code) }} 10 | {{ title }} 11 |

12 | {% block details %}

{{ error.description }}

{% endblock %} 13 |

14 | 15 | {{ _('Home') }} 16 | 17 |

18 |
19 |
20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/follow/follower-card.html: -------------------------------------------------------------------------------- 1 | {% extends theme('user/card.html') %} 2 | 3 | {% set user = follow.follower %} 4 | 5 | {% block footer %} 6 |

{{ _('Following since %(date)s', date=follow.since|dateformat) }}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/layouts/1-column.html: -------------------------------------------------------------------------------- 1 | {% extends theme('base.html') %} 2 | {% from theme('macros/breadcrumb.html') import breadcrumb with context %} 3 | {% set section_class = section_class|default('default') %} 4 | 5 | {% block content %} 6 |
7 | {{ breadcrumb(self) }} 8 |
9 | {% block main_content %}{% endblock %} 10 |
11 |
12 | 13 | {% block extra_sections %}{% endblock %} 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/layouts/2-columns.html: -------------------------------------------------------------------------------- 1 | {% extends theme('base.html') %} 2 | {% from theme('macros/breadcrumb.html') import breadcrumb with context %} 3 | {% set section_class = section_class|default('default') %} 4 | 5 | {% block content %} 6 | {{ breadcrumb(self) }} 7 | 8 |
9 |
10 |
11 |
12 | {% block main_content %}{% endblock %} 13 |
14 | 17 |
18 |
19 |
20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/macros/banner_warning.html: -------------------------------------------------------------------------------- 1 | {% macro banner_warning(icon, text) %} 2 |
3 |
4 |

5 | 6 | {{ text }} 7 |

8 |
9 |
10 | {% endmacro %} 11 | -------------------------------------------------------------------------------- /udata_front/theme/gouvfr/templates/macros/certified.html: -------------------------------------------------------------------------------- 1 | {% macro badge_if_certified(org, size="sm") %} 2 | {% if org.certified %} 3 |