├── src ├── assets │ ├── .gitkeep │ ├── logo.png │ ├── icons │ │ ├── icon-72x72.png │ │ ├── icon-96x96.png │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192x192.png │ │ ├── icon-384x384.png │ │ ├── icon-512x512.png │ │ └── icon-192x192-full.png │ ├── images │ │ ├── igo-loading.gif │ │ ├── quebecPrint.gif │ │ ├── splash_screen.png │ │ └── styles │ │ │ └── fire-hydrant.svg │ ├── list-style.json │ └── mapboxStyleExample-vectortile.json ├── app │ ├── pages │ │ ├── index.ts │ │ ├── portal │ │ │ ├── index.ts │ │ │ ├── map-overlay │ │ │ │ ├── index.ts │ │ │ │ ├── map-overlay.enum.ts │ │ │ │ ├── map-overlay.component.scss │ │ │ │ ├── map-overlay.component.html │ │ │ │ ├── map-overlay.interface.ts │ │ │ │ └── map-overlay.component.ts │ │ │ ├── expansion-panel │ │ │ │ ├── expansion-panel-button │ │ │ │ │ ├── expansion-panel-button.component.scss │ │ │ │ │ ├── expansion-panel-button.component.html │ │ │ │ │ ├── expansion-panel-button.component.spec.ts │ │ │ │ │ └── expansion-panel-button.component.ts │ │ │ │ ├── expansion-panel-header.component.html │ │ │ │ ├── expansion-panel-header.component.scss │ │ │ │ ├── expansion-panel.component.html │ │ │ │ ├── expansion-panel.animations.ts │ │ │ │ ├── expansion-panel-header.component.ts │ │ │ │ ├── expansion-panel.component.ts │ │ │ │ └── expansion-panel.component.scss │ │ │ ├── toast-panel-for-expansion │ │ │ │ ├── toast-panel-for-expansion.component.html │ │ │ │ ├── toast-panel-for-expansion.animations.ts │ │ │ │ ├── toast-panel-for-expansion.component.scss │ │ │ │ └── toast-panel-for-expansion.component.ts │ │ │ ├── welcome-window │ │ │ │ ├── welcome-window.service.spec.ts │ │ │ │ ├── welcome-window.component.scss │ │ │ │ ├── welcome-window.component.html │ │ │ │ └── welcome-window.service.ts │ │ │ ├── portal.module.ts │ │ │ ├── toast-panel │ │ │ │ └── toast-panel.animations.ts │ │ │ ├── sidenav │ │ │ │ ├── sidenav.component.html │ │ │ │ ├── sidenav.component.scss │ │ │ │ └── sidenav-import.ts │ │ │ └── portal.variables.scss │ │ ├── header │ │ │ ├── header.interface.ts │ │ │ ├── header.component.ts │ │ │ └── header.component.html │ │ └── footer │ │ │ ├── footer.component.ts │ │ │ ├── footer.component.scss │ │ │ └── footer.component.html │ ├── app.component.spec.ts │ ├── app.utils.ts │ ├── app.component.html │ ├── app.component.scss │ └── services │ │ └── pwa.service.ts ├── environments │ ├── index.ts │ ├── environment.pwa.ts │ ├── version.ts │ └── environnement.interface.ts ├── favicon.ico ├── tsconfig.app.json ├── tsconfig.spec.json ├── contexts │ ├── homeExtent.json │ ├── keepCurrentViewFalse.json │ ├── geolocation.json │ ├── addLayerFromIndex.json │ ├── _default.json │ ├── simple2.json │ ├── _contexts.json │ ├── timeFilter.json │ ├── messages.json │ ├── mapOverlay.json │ └── legends.json ├── style │ ├── theme.scss │ ├── reset.scss │ ├── partial │ │ └── variables.scss │ └── breakpoints.scss ├── main.ts ├── test.ts ├── data │ └── geoDataToIDB.json ├── karma.conf.js ├── test.config.ts ├── styles.scss ├── manifest.webmanifest ├── config │ ├── github.webmanifest │ └── config.json └── index.html ├── .gitattributes ├── .prettierignore ├── docs ├── .rstcheck.cfg ├── _tables │ ├── fr │ │ ├── properties │ │ │ ├── sources │ │ │ │ ├── wms-wfs-params.csv │ │ │ │ ├── osm.csv │ │ │ │ ├── tms.csv │ │ │ │ ├── websocket.csv │ │ │ │ ├── cluster.csv │ │ │ │ ├── wmts.csv │ │ │ │ ├── mvt.csv │ │ │ │ └── wms-params.csv │ │ │ ├── search │ │ │ │ ├── cadastre.csv │ │ │ │ ├── nominatim.csv │ │ │ │ ├── iChercheReverse.csv │ │ │ │ ├── iCherche.csv │ │ │ │ ├── coord.csv │ │ │ │ ├── storedQueriesReverse.csv │ │ │ │ ├── iLayer.csv │ │ │ │ ├── common.csv │ │ │ │ └── storedQueries.csv │ │ │ ├── filter │ │ │ │ ├── buttons-selectorType.csv │ │ │ │ ├── igoOgcFilterFiltersObject - Copie.csv │ │ │ │ ├── buttons-groups.csv │ │ │ │ ├── buttons-bundles-selector.csv │ │ │ │ ├── igoOgcFilterFiltersObject.csv │ │ │ │ ├── igoogcfilterduringoptions.csv │ │ │ │ ├── timeFilter.csv │ │ │ │ ├── igoOgcFilterDuring.csv │ │ │ │ ├── buttons-bundles.csv │ │ │ │ └── ogcFilters.csv │ │ │ ├── tools │ │ │ │ ├── searchResultsOptions.csv │ │ │ │ ├── aboutOptions.csv │ │ │ │ ├── catalogBrowserOptions.csv │ │ │ │ ├── contextManagerOptions.csv │ │ │ │ ├── catalogOptions.csv │ │ │ │ ├── mapTool.csv │ │ │ │ ├── draw.csv │ │ │ │ ├── mapDetails.csv │ │ │ │ ├── mapTools.csv │ │ │ │ ├── print.csv │ │ │ │ ├── measurer.csv │ │ │ │ ├── ogcFilter.csv │ │ │ │ ├── shareMap.csv │ │ │ │ ├── directions.csv │ │ │ │ ├── timeFilter.csv │ │ │ │ ├── about.csv │ │ │ │ ├── catalog.csv │ │ │ │ ├── contextManager.csv │ │ │ │ ├── importExport.csv │ │ │ │ ├── mapLegend.csv │ │ │ │ ├── searchResults.csv │ │ │ │ ├── catalogBrowser.csv │ │ │ │ ├── spatialFilter.csv │ │ │ │ ├── spatialFilterOptions.csv │ │ │ │ ├── mapLegendOptions.csv │ │ │ │ ├── importExportOptions.csv │ │ │ │ ├── mapToolOptions.csv │ │ │ │ ├── mapDetailsOptions.csv │ │ │ │ └── mapToolsOptions.csv │ │ │ ├── relations.csv │ │ │ ├── linkedLayersOptions.csv │ │ │ ├── sourceOptions-common.csv │ │ │ ├── layersLinkProperties.csv │ │ │ ├── legendOptions.csv │ │ │ ├── edition.csv │ │ │ ├── map-view.csv │ │ │ ├── workspaceOptions.csv │ │ │ └── sourceFields.csv │ │ ├── config │ │ │ ├── catalog-src.csv │ │ │ ├── depot-api.csv │ │ │ ├── locale.csv │ │ │ ├── context-api.csv │ │ │ ├── directions-profile-auth.csv │ │ │ ├── search-bar.csv │ │ │ ├── theme.csv │ │ │ ├── catalog-composite.csv │ │ │ ├── directions-profile.csv │ │ │ ├── directions.csv │ │ │ ├── search-sources.csv │ │ │ ├── projection.csv │ │ │ ├── interactiveTour.csv │ │ │ ├── welcomeWindow.csv │ │ │ ├── search-sources-prop.csv │ │ │ ├── import-export.csv │ │ │ ├── context-summary.csv │ │ │ ├── auth.csv │ │ │ ├── tools.csv │ │ │ └── message.csv │ │ └── interactiveTour │ │ │ ├── interactiveTourOptions.csv │ │ │ └── interactiveTourStep.csv │ └── template.csv ├── images │ ├── CC-BY-SA.png │ └── 1b-logo_toutbleu_txtnoir.png ├── _static │ └── custom.css ├── global.rst ├── english.rst ├── conf.py ├── introduction.rst ├── todo.rst ├── index.rst ├── template.rst └── shortcut.rst ├── .vscode ├── extensions.json └── settings.json ├── e2e ├── fixtures │ └── example.json ├── tsconfig.json ├── tsconfig.e2e.json ├── .eslintrc.json ├── cypress.config.ts ├── support │ ├── component-index.html │ ├── e2e.ts │ ├── component.ts │ └── commands.ts └── src │ └── app.spec.ts ├── .github ├── ISSUE_TEMPLATE.md ├── dependabot.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── pull-request.yml │ ├── deploy-demo.yml │ ├── release.yml │ └── codeql-analysis.yml ├── scripts ├── src │ ├── utils │ │ ├── performance.utils.mts │ │ ├── executor.mts │ │ ├── log.mts │ │ ├── color.mts │ │ └── file-system.utils.mts │ ├── core │ │ └── paths.mts │ └── update-version.mts └── tsconfig.json ├── .browserslistrc ├── .editorconfig ├── .prettierrc ├── .readthedocs.yml ├── tsconfig.json ├── proxy.conf.json ├── .gitignore ├── release.config.js ├── ngsw-config.json └── eslint.config.mjs /src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | text eol=lf -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /src/test.ts -------------------------------------------------------------------------------- /docs/.rstcheck.cfg: -------------------------------------------------------------------------------- 1 | [rstcheck] 2 | report=error -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/wms-wfs-params.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/pages/index.ts: -------------------------------------------------------------------------------- 1 | export * from './portal'; 2 | -------------------------------------------------------------------------------- /src/environments/index.ts: -------------------------------------------------------------------------------- 1 | export * from './environment'; 2 | -------------------------------------------------------------------------------- /src/app/pages/portal/index.ts: -------------------------------------------------------------------------------- 1 | export * from './portal.module'; 2 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map-overlay.interface'; 2 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/favicon.ico -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /docs/images/CC-BY-SA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/docs/images/CC-BY-SA.png -------------------------------------------------------------------------------- /src/app/pages/header/header.interface.ts: -------------------------------------------------------------------------------- 1 | export interface headerOptions { 2 | title?: string; 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /e2e/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-72x72.png -------------------------------------------------------------------------------- /src/assets/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-96x96.png -------------------------------------------------------------------------------- /src/assets/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-128x128.png -------------------------------------------------------------------------------- /src/assets/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-144x144.png -------------------------------------------------------------------------------- /src/assets/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-152x152.png -------------------------------------------------------------------------------- /src/assets/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-192x192.png -------------------------------------------------------------------------------- /src/assets/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-384x384.png -------------------------------------------------------------------------------- /src/assets/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-512x512.png -------------------------------------------------------------------------------- /src/assets/images/igo-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/images/igo-loading.gif -------------------------------------------------------------------------------- /src/assets/images/quebecPrint.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/images/quebecPrint.gif -------------------------------------------------------------------------------- /src/assets/images/splash_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/images/splash_screen.png -------------------------------------------------------------------------------- /docs/_tables/template.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | ,,"| 1ere ligne 3 | | 2ieme ligne",, 4 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/osm.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **type*** ,String ,,osm,osm 3 | -------------------------------------------------------------------------------- /docs/images/1b-logo_toutbleu_txtnoir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/docs/images/1b-logo_toutbleu_txtnoir.png -------------------------------------------------------------------------------- /src/assets/icons/icon-192x192-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infra-geo-ouverte/igo2/HEAD/src/assets/icons/icon-192x192-full.png -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | describe('AppComponent', () => { 2 | it('should create the app', () => { 3 | expect(true).toBeTruthy(); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Please tell us about your environment:** 2 | 3 | 4 | * **Igo Version:** 5 | 6 | * **Node:** 7 | 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/cadastre.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeur défaut 2 | searchUrl ,String,URL du service. ,https://carto.cptaq.gouv.qc.ca/php/find_lot_v1.php? 3 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/catalog-src.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | sources ,:ref:`Catalog ` [] ,Liste des catalogues qui sera présenté à l'usager. ,, 3 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/buttons-selectorType.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | title ,String ,Le type de sélecteur. ,"pushButton, checkbox, radioButton, select ", 3 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-button/expansion-panel-button.component.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/common/partial/common-utils'; 2 | 3 | :host { 4 | @include common-utils.square-button(); 5 | } 6 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/igoOgcFilterFiltersObject - Copie.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | title ,String ,Le type de sélecteur. ,"pushButton, checkbox, radioButton, select ", 3 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "sourceMap": false, 5 | "types": ["cypress"] 6 | }, 7 | "include": ["**/*.ts"], 8 | "exclude": [] 9 | } 10 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/depot-api.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description 2 | url,String,Définit l'url d'appel du service de dépôt de fichier 3 | trainingGuides ,String[] ,Nom ou identifiant des guides d'autoformation à accéder. 4 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/locale.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **prefix*** ,String [],"| Définir le dossier contenant les fichiers de traduction 3 | | de l'appplication. ",,[‘./locale/’ ] 4 | -------------------------------------------------------------------------------- /scripts/src/utils/performance.utils.mts: -------------------------------------------------------------------------------- 1 | /** Duration in ms */ 2 | export function getDuration(startTime: number): string { 3 | const duration = Math.round(performance.now() - startTime); 4 | return `${duration}ms`; 5 | } 6 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /docs/_static/custom.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .wy-nav-content { 4 | padding: 1.618em 3.236em; 5 | height: 100%; 6 | max-width: 100%; 7 | margin: auto; 8 | } 9 | 10 | .highlight .err { 11 | border: inherit; 12 | box-sizing: inherit; 13 | } -------------------------------------------------------------------------------- /src/app/pages/portal/toast-panel-for-expansion/toast-panel-for-expansion.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |
6 | -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "types": ["jasmine", "jasminewd2", "node"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/context-api.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | url,String,Définit l'url d'appel du service de contexte ,, 3 | **defaultContextUri*** ,String ,Nom ou identifiant du contexte cartographique par défaut. ,,_default 4 | -------------------------------------------------------------------------------- /src/contexts/homeExtent.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "homeExtent", 3 | "base": "_base", 4 | "map": { 5 | "view": { 6 | "projection": "EPSG:3857", 7 | "homeExtent": { 8 | "center": [-68.796, 51.32676], 9 | "zoom": 10 10 | } 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /e2e/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.eslintrc.json", 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "extends": "plugin:cypress/recommended", 7 | "plugins": ["cypress"], 8 | "files": ["*.ts"], 9 | "rules": {} 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /src/style/theme.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/themes' as igo-themes; 2 | @use '@igo2/sdg-core' as sdg; 3 | 4 | html { 5 | @include igo-themes.theme( 6 | igo-themes.$blue-theme, 7 | igo-themes.$blue-defined-theme, 8 | 'blue' 9 | ); 10 | 11 | @include sdg.typo-base(); 12 | } 13 | -------------------------------------------------------------------------------- /docs/global.rst: -------------------------------------------------------------------------------- 1 | 2 | .. |date| date:: %d-%m-%Y 3 | 4 | .. |time| date:: %H:%M 5 | 6 | 7 | .. |CC| image:: images/CC-BY-SA.png 8 | 9 | .. |openlayers| replace:: `OpenLayers` 10 | 11 | .. |ang2| replace:: `Angular` 12 | 13 | .. |igo-logo| image:: images/1b-logo_toutbleu_txtnoir.png 14 | 15 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/nominatim.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Valeur défaut 2 | searchUrl ,https://nominatim.openstreetmap.org/search 3 | settings ,`Ligne 44 `__ 4 | title ,Nominatim (OSM) 5 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/buttons-groups.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | ids ,String [],"| Liste des identifiants pour le classement des paquets 3 | | (""bundles"") de boutons dans les groupes. ",, 4 | title ,String ,Le titre du groupe qui apparaitra à l'utilisateur. ,, 5 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/directions-profile-auth.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur par défaut 2 | url ,String ,URL permettant de vérifier l'accessibilité d'un profil à un utilisateur. | Utilisé pour un profil protégé.,, 3 | property ,String ,Propriété utilisée pour la vérification de l'accessibilité.,, -------------------------------------------------------------------------------- /docs/_tables/fr/config/search-bar.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | showSearchBar,Boolean,Permet de définir si la barre de recherche est affichée ou non.,true | false,true 3 | showSearchButton,Boolean,Permet de définir si un bouton de recherche est visible ou non.,true | false,false 4 | -------------------------------------------------------------------------------- /src/app/app.utils.ts: -------------------------------------------------------------------------------- 1 | import { ConfigService, version } from '@igo2/core/config'; 2 | 3 | export function getAppVersion(configService: ConfigService): string { 4 | return ( 5 | configService.getConfig('version.app') || 6 | configService.getConfig('version.lib') || 7 | version.lib 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # adjust as needed 5 | defaults and fully supports es6-module 6 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/iChercheReverse.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Valeur défaut 2 | searchUrl ,https://geoegl.msp.gouv.qc.ca/apis/terrapi 3 | settings ,`Ligne 427 `__ 4 | title ,Recherche par coordonnées 5 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/iCherche.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Valeur défaut 2 | searchUrl ,https://geoegl.msp.gouv.qc.ca/apis/icherche 3 | settings ,`Ligne 79  `_ 4 | title ,iCherche 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_style = space 8 | indent_size = 2 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | max_line_length = off 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /e2e/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4201', 6 | specPattern: 'e2e/src/*.spec.ts', 7 | supportFile: 'e2e/support/e2e.ts', 8 | videosFolder: 'e2e/dist/videos', 9 | screenshotsFolder: 'e2e/dist/screenshots' 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/theme.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **theme*** ,String ,Thème à utiliser pour la présente application configurée. ,"| - blue-theme 3 | | - qcca.theme 4 | | - bluegrey.theme 5 | | - dark.theme 6 | | - deeppurple.theme 7 | | - indigo.theme 8 | | - orange.theme 9 | | - teal.theme",blue-theme 10 | 11 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/searchResultsOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | showIcons ,Boolean ,Permet de faire afficher ou non des icônes pour chacun des résultats de recherche. ,true / false ,true 3 | topPanelStateDefault ,String ,Permet de définir l'état par défaut du panneau de détails. ,'expanded'/ 'collapsed' ,'expanded' 4 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-header.component.html: -------------------------------------------------------------------------------- 1 |
2 | 6 |
7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/catalog-composite.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description 2 | **id*** ,String ,Identifiant unique permettant de différencier les catalogues entre eux. 3 | **title*** ,String ,Titre pour la source du catalogue qui sera utilisé dans l'outil Catalog. 4 | composite ,:ref:`Catalog ` [] ,Liste des catalogues utilisés dans un catalogue composé. 5 | -------------------------------------------------------------------------------- /docs/english.rst: -------------------------------------------------------------------------------- 1 | .. include:: global.rst 2 | 3 | .. meta:: 4 | 5 | :DC.creator: Gouvernement du Québec 6 | :DC.language: en 7 | 8 | -------------------- 9 | English 10 | -------------------- 11 | 12 | ---------- 13 | 14 | .. toctree:: 15 | :maxdepth: 4 16 | 17 | config_json_en 18 | 19 | .. note:: 20 | 21 | This documentation is under construction. 22 | -------------------------------------------------------------------------------- /e2e/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/aboutOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | html ,String ou String[] ,Configure le html qui sera présenté dans l'outil.,"| ""

Contenu html

"" 3 | | ou sous forme de liste (pour les changement de lignes) 4 | | [""

Contenu html de la première ligne

"",""

Contenu de la seconde ligne

""]",igo.integration.about.html 5 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/catalogBrowserOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | toggleCollapsedGroup ,Boolean ,"| Force l'usager à entrer dans le groupe et d'y visualiser 3 | | les couches disponible avant de pouvoir ajouter le groupe 4 | | à la carte. **false** = le groupe doit être ouvert avant 5 | | de pouvoir l'ajouter à la carte ",true | false,false 6 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/contextManagerOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | toolToOpenOnContextChange ,String,Nom de l'outil a ouvrir suite au changement de contexte ,Voir le nom des divers outils de cette section ,"Dans l'ordre 3 | | `mapTools`_', 4 | | `mapTool`_, 5 | | `mapDetails`_ 6 | | `mapLegend`_ 7 | | si ces outils sont 8 | | disponibles." 9 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-button/expansion-panel-button.component.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/map-overlay.enum.ts: -------------------------------------------------------------------------------- 1 | export enum MapOverlayCssClass { 2 | TopLeft = 'top-left', 3 | CenterLeft = 'center-left', 4 | BottomLeft = 'bottom-left', 5 | TopCenter = 'top-center', 6 | CenterCenter = 'center-center', 7 | BottomCenter = 'bottom-center', 8 | TopRight = 'top-right', 9 | CenterRight = 'center-right', 10 | BottoMRight = 'bottom-right' 11 | } 12 | -------------------------------------------------------------------------------- /src/style/reset.scss: -------------------------------------------------------------------------------- 1 | /*** Reset ***/ 2 | 3 | html, 4 | body, 5 | div { 6 | border: 0; 7 | margin: 0; 8 | padding: 0; 9 | } 10 | 11 | html, 12 | body { 13 | width: 100%; 14 | height: 100%; 15 | } 16 | 17 | * { 18 | box-sizing: border-box; 19 | } 20 | 21 | body { 22 | margin: 0; 23 | overflow: hidden; 24 | } 25 | 26 | /* IE10+ */ 27 | ::-ms-clear { 28 | display: none; 29 | } 30 | -------------------------------------------------------------------------------- /src/environments/environment.pwa.ts: -------------------------------------------------------------------------------- 1 | import { environment as prodEnv } from './environment.github'; 2 | 3 | if (!prodEnv.igo.app.pwa) { 4 | prodEnv.igo.app.pwa = {}; 5 | } 6 | prodEnv.igo.app.pwa.enabled = true; 7 | prodEnv.igo.app.install.enabled = true; 8 | prodEnv.igo.app.install.promote = true; 9 | prodEnv.igo.app.install.manifestPath = undefined; 10 | 11 | export const environment = prodEnv; 12 | -------------------------------------------------------------------------------- /src/contexts/keepCurrentViewFalse.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "keepCurrentViewFalse", 3 | "title": "Le contexte impose sa vue", 4 | "base": "_base", 5 | "map": { 6 | "view": { 7 | "projection": "EPSG:3857", 8 | "center": [-69.72594, 48.131546], 9 | "zoom": 14, 10 | "geolocate": false, 11 | "maxZoomOnExtent": 19, 12 | "keepCurrentView": false 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "none", 4 | "endOfLine": "lf", 5 | "importOrder": ["^@angular/(.*)$", "^@igo2/(.*)$", "^ol/(.*)$", "", "^[./]"], 6 | "importOrderSeparation": true, 7 | "importOrderSortSpecifiers": true, 8 | "importOrderParserPlugins": ["typescript", "decorators-legacy"], 9 | "plugins": ["@trivago/prettier-plugin-sort-imports"] 10 | } 11 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/tms.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **type*** ,String ,,xyz,xyz 3 | **url*** ,String ,"| L'URL du service de données tuilées en spécifiant la position 4 | | des tuiles en déclarant les balises de remplacement: 5 | | - {x} 6 | | - {-y} 7 | | - {z} 8 | | X et Y représentent la position de la tuile appelée 9 | | tandis que le Z, le zoom. ",, 10 | -------------------------------------------------------------------------------- /e2e/src/app.spec.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | const url = 'http://localhost:4201'; 3 | it('Check the config file', () => { 4 | cy.visit('/'); 5 | cy.request('GET', `${url}/config/config.json`).then((response) => { 6 | expect(response.body).to.have.property('title', 'IGO'); // true 7 | expect(response.body).to.have.property('theme', 'blue-theme'); // true 8 | }); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /src/environments/version.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * THIS FILE IS AUTOGENERATED PARTIALLY 3 | * DO NOT EDIT THE APP VERSION OR RELEASE DATE 4 | * IF YOU CHANGE ANY KEY NAME BE SURE TO REFLECT THIS CHANGE IN OUR AUTOMATION SCRIPT 5 | */ 6 | import { Version, version as libVersion } from '@igo2/core/config'; 7 | 8 | export const version: Version = { 9 | ...libVersion, 10 | app: '20.0.1', 11 | releaseDateApp: 1760119270005 12 | }; 13 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { bootstrapApplication } from '@angular/platform-browser'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | import { appConfig } from './app/app.config'; 6 | import { environment } from './environments/environment'; 7 | 8 | if (environment.production) { 9 | enableProdMode(); 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)); 13 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/websocket.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **onmessage*** ,String ,"| Action déclenchée lors de la réception 3 | | de la donnée par le websocket ",update | delete | add ,add 4 | **onopen** ,String ,Action déclenchée lors de l'ouverture du websocket. ,, 5 | **onclose** ,String ,Action déclenchée lors de la fermeture du websocket. ,, 6 | **onerror** ,String ,Action déclenchée lors d'une erreur du websocket. ,, 7 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/coord.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Valeur défaut 2 | title ,"| Basé sur la traduction de 2 fichiers. 3 | | Propriété igo.geo.search.coordinates.name dans 4 | |       - `en.geo.json  `__ 5 | |       - `fr.geo.json  `__ " 6 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/catalogOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | addCatalogAllowed ,Boolean ,"| Définit  si le formulaire d'ajout de catalogue est disponible ou non.  3 | | Les catalogues ajoutés sont enregistrés dans la mémoire du fureteur. ",true | false,false 4 | predefinedCatalogs ,:ref:`Catalog[] `. ,"| Liste prédéfinie de catalogues permettant de pré-remplir un 5 | | menu de sélection, afin d'ajouter des catalogues.",, 6 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-header.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | height: 48px; 3 | border-bottom: 2px solid aliceblue; 4 | display: flex; 5 | align-items: center; 6 | background-color: white; 7 | 8 | ::ng-deep .workspace-actions { 9 | margin-left: 8px; 10 | } 11 | 12 | app-expansion-panel-button { 13 | margin-right: 4px; 14 | } 15 | } 16 | 17 | .app-expansion-panel-trigger-container, 18 | .app-expansion-panel-content { 19 | display: flex; 20 | } 21 | -------------------------------------------------------------------------------- /src/app/pages/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, inject } from '@angular/core'; 2 | 3 | import { LanguageService } from '@igo2/core/language'; 4 | 5 | import { TranslateModule } from '@ngx-translate/core'; 6 | 7 | @Component({ 8 | selector: 'app-footer', 9 | templateUrl: './footer.component.html', 10 | styleUrls: ['./footer.component.scss'], 11 | imports: [TranslateModule] 12 | }) 13 | export class FooterComponent { 14 | protected languageService = inject(LanguageService); 15 | } 16 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapTool.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,map 3 | **name*** ,String ,,map , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.map 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/draw.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,pencil 3 | **name*** ,String ,,draw , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.draw 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapDetails.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,map 3 | **name*** ,String ,,map , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.map 8 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | ## conf.py 2 | 3 | # These folders are copied to the documentation's HTML output 4 | html_static_path = ['_static'] 5 | 6 | # These paths are either relative to html_static_path 7 | # or fully qualified paths (eg. https://...) 8 | html_css_files = [ 9 | 'custom.css', 10 | ] 11 | 12 | # source_suffix = ['.rst', '.md'] 13 | source_suffix = '.rst' 14 | 15 | # The encoding of source files. 16 | # 17 | # source_encoding = 'utf-8-sig' 18 | 19 | # The master toctree document. 20 | master_doc = 'index' -------------------------------------------------------------------------------- /docs/_tables/fr/config/directions-profile.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur par défaut 2 | enabled ,Boolean ,Permet d'activer un profil spécifique au lancement de l'application. | Un seul doit être activé dans les configurations. ,true | false ,Le premier profil est activé par défaut. 3 | name ,String ,Nom du profil. | Le nom est ajouté à baseURL afin de créer la route finale,, 4 | authorization ,BaseDirectionsSourceOptionsProfileAuthorization ,Objet permettant de gérer l'accessibilité à un profil protégé. ,, -------------------------------------------------------------------------------- /docs/_tables/fr/properties/relations.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **name*** ,String,Nom de l'attribut ,, 3 | name ,String,nom de la relation. 4 | alias ,String,Alias de la relation. 5 | title ,String ,Titre du workspace à faire le lien avec. 6 | icon ,String ,Icône du bouton permettant de faire la liaison (https://materialdesignicons.com/). 7 | table ,Boolean ,Indique si le champ doit être visible ou non dans la table d'édition. ,true/false ,true 8 | parent ,String ,Indique la table parent. 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/cluster.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **type*** ,String ,,cluster ,cluster 3 | **url*** ,String ,L'URL du fichier contenant les entités. ,, 4 | excludeAttribute ,String[],Liste des attributs exclus du getInfo lorsque l'application est en ligne. ,, 5 | excludeAttributeOffline ,String[],Liste des attributs exclus du getInfo lorsque l'application est en hors-ligne. ,, 6 | distance ,Number,Distance en pixel entre les entités afin d’être agrégées en grappe.,,20 7 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapTools.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,map 3 | **name*** ,String ,,mapTools , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.map 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/print.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,printer 3 | **name*** ,String ,,print , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.print 8 | -------------------------------------------------------------------------------- /scripts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es2022"], 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "target": "es2022", 7 | "rootDir": "./", 8 | "isolatedModules": true, 9 | "sourceMap": true, 10 | "strict": true, 11 | "esModuleInterop": true, 12 | "skipLibCheck": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "noEmit": true, 15 | "allowImportingTsExtensions": true 16 | }, 17 | "exclude": ["node_modules"] 18 | } 19 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/measurer.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,ruler 3 | **name*** ,String ,,measurer , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.measurer 8 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec 2 | // and framework files 3 | import { getTestBed } from '@angular/core/testing'; 4 | import { 5 | BrowserTestingModule, 6 | platformBrowserTesting 7 | } from '@angular/platform-browser/testing'; 8 | 9 | // First, initialize the Angular testing environment. 10 | getTestBed().initTestEnvironment( 11 | BrowserTestingModule, 12 | platformBrowserTesting(), 13 | { 14 | teardown: { destroyAfterEach: false } 15 | } 16 | ); 17 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/ogcFilter.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,filter 3 | **name*** ,String ,,ogcFilter , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.ogcFilter 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/shareMap.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,share-variant 3 | **name*** ,String ,,shareMap , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.shareMap 8 | -------------------------------------------------------------------------------- /docs/introduction.rst: -------------------------------------------------------------------------------- 1 | .. include:: global.rst 2 | 3 | .. meta:: 4 | 5 | :DC.creator: Gouvernement du Québec 6 | :DC.language: fr 7 | 8 | ------------- 9 | Introduction 10 | ------------- 11 | 12 | Sommaire 13 | ======== 14 | 15 | |igo2|_ fourni un navigateur géographique qui supporte les standards OGC. 16 | |igo2|_ est basé sur |openlayers|_ et |ang2|_ . 17 | 18 | Plus d'information disponible à : https://www.igouverte.org/documentation/. 19 | 20 | .. note:: 21 | 22 | Cette documentation est en construction. 23 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/directions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,directions 3 | **name*** ,String ,,directions , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.directions 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/timeFilter.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,history 3 | **name*** ,String ,,timeFilter , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.timeFilter 8 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/directions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | name ,String ,Nom de la source,, 3 | baseUrl ,String ,URL du service retournant l'itinéraire. ,,`https://geoegl.msp.gouv.qc.ca/apis/itineraire/route/v1/driving/ ` 4 | profiles , BaseDirectionsSourceOptionsProfile[] , Liste de profils à utiliser. , 5 | authorizationUrl ,String ,URL permettant de vérifier l'accessibilité d'une source à un utilisateur. | Utilisé pour une source privée.,, -------------------------------------------------------------------------------- /docs/_tables/fr/config/search-sources.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | showResultsCount ,boolean,Permet d'afficher ou non le nombre de résultats de chaque source, true/false, true 3 | cadastre ,,Permet de définir la recherche par cadastre (numéro de lot),, 4 | nominatim ,,Permet de définir l'utilisation de la recherche nominatim,, 5 | ilayer ,,Permet d'activer icherche pour les couches de données,, 6 | icherche ,,Permet d'activer icherche (géocodage),, 7 | icherchereverse ,,Permet d'activer icherche reverse (géocodage inversé),, 8 | 9 | -------------------------------------------------------------------------------- /src/app/pages/portal/welcome-window/welcome-window.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { mergeTestConfig } from 'src/test.config'; 4 | 5 | import { WelcomeWindowService } from './welcome-window.service'; 6 | 7 | describe('WelcomeWindowService', () => { 8 | beforeEach(() => TestBed.configureTestingModule(mergeTestConfig({}))); 9 | 10 | it('should be created', () => { 11 | const service: WelcomeWindowService = TestBed.inject(WelcomeWindowService); 12 | expect(service).toBeTruthy(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/about.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,help-circle 3 | **name*** ,String ,,about , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.about 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /src/contexts/geolocation.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "geolocation", 3 | "base": "_base", 4 | "map": { 5 | "view": { 6 | "projection": "EPSG:3857", 7 | "center": [-71.938087, 48.446975], 8 | "zoom": 6, 9 | "maxZoom": 19, 10 | "maxZoomOnExtent": 17, 11 | "geolocate": true, 12 | "alwaysTracking": true, 13 | 14 | "buffer": { 15 | "bufferRadius": 100, 16 | "bufferStroke": [0, 0, 255, 1], 17 | "bufferFill": [0, 0, 255, 0.15], 18 | "showBufferRadius": true 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/catalog.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,layers-plus 3 | **name*** ,String ,,catalog , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.catalog 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/projection.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description 2 | alias ,String,"| Nom d'affichage que vous voulez donner \à la 3 | | projection ajoutée. " 4 | **code*** ,String,"| Code de la projection/ système de coordonnées 5 | | à ajouter à l'application. " 6 | **def*** ,String,"| Paramètres associés à la définition de votre 7 | | projection / système de coordonnées. 8 | | voir epsg.io" 9 | **extent*** ,Liste de nombre ,"| Liste de nombre définissant 10 | | les limites d'application 11 | | de la projection. L'ordre à 12 | | respecter est: 13 | | [Xmin,YMin,XMax,YMax]." 14 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/contextManager.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,star 3 | **name*** ,String ,,contextManager , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.contexts 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/importExport.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,file-move 3 | **name*** ,String ,,importExport , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.importExport 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapLegend.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,format-list-bulleted-type 3 | **name*** ,String ,,mapLegend , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.legend 8 | options,Objet,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/searchResults.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,magnify 3 | **name*** ,String ,,searchResults , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.searchResults 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/catalogBrowser.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,photo-browser 3 | **name*** ,String ,,catalogBrowser , 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.catalog 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/spatialFilter.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | icon ,String ,Icône dans la barre d'outil ,`MDI `__ ,selection-marker 3 | **name*** ,String ,,spatialFilter, 4 | title ,String ,"| Le titre affiché dans l'application. Sujet aux traduction. 5 | | Si vous modifiez le titre par défaut, vous devez ajouter 6 | | ce titre dans les langues supportées par IGO2 (fr-en). 7 | |       - fichiers dans :ref:`Language `. ",,igo.integration.tools.spatialFilter 8 | options ,Object ,Voir les options ici-bas. ,, 9 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
14 | 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | @if (authConfig && authConfig.url) { 4 | 5 | } 6 | 7 | @if (hasHeader) { 8 | 9 | } 10 | 11 | 23 | 24 | @if (hasFooter) { 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/assets/images/styles/fire-hydrant.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yaml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | # Required 6 | version: 2 7 | 8 | # Build documentation in the docs/ directory with Sphinx 9 | sphinx: 10 | configuration: docs/conf.py 11 | ###fail_on_warning: true 12 | # Optionally build your docs in additional formats such as PDF 13 | formats: 14 | - pdf 15 | 16 | # Optionally set the version of Python and requirements required to build your docs 17 | python: 18 | version: 3.7 19 | #install: 20 | #- requirements: docs/requirements.txt -------------------------------------------------------------------------------- /docs/_tables/fr/properties/linkedLayersOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **linkId**,String,"| Identifiant de liaison de la présente couche.| Diffère du ID de la couche car cet ID doit être| connu au pilotage, pas seulement lors l'éxécution du code.",,, 3 | showInMiniBaseMap,Boolean,"| Définit si la couche est visible dans l'aperçu| de la couche parent du Base Layer Switcher.",true | false,true, 4 | links,:ref:`LayersLinkProperties[] `,"| Définit la liste des couches ""enfants"" liées| ainsi que leurs propriétés qui sont synchronisées.| Obligatoire pour les couches parents.",,, 5 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/interactiveTour.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | activateInteractiveTour ,Boolean ,Indique si le tour interactif de présentation de l'application est activé. ,true | false ,true 3 | pathToConfigFile ,String ,"| Indique ou ce retrouve le fichier de configuration des tours dans l'application. 4 | | Voir la documentation plus loin sur les détails de la configurations des tours. 5 | | Référez vous à :ref:`Tour interactif configuration `. ",,"""./config/interactiveTour.json"" " 6 | tourInMobile ,Boolean ,Indique si les tours interactifs sont aussi disponible en mode mobile. ,true/false , 7 | -------------------------------------------------------------------------------- /scripts/src/utils/executor.mts: -------------------------------------------------------------------------------- 1 | import * as log from '../utils/log.mts'; 2 | import { getDuration } from '../utils/performance.utils.mts'; 3 | 4 | export const executor = async ( 5 | title: string, 6 | fn: () => Promise 7 | ): Promise => { 8 | const startTime = performance.now(); 9 | log.startMsg(title); 10 | 11 | try { 12 | const result = await fn(); 13 | const duration = getDuration(startTime); 14 | log.info(`${title} in ${duration}`); 15 | return result; 16 | } catch (error) { 17 | const duration = getDuration(startTime); 18 | log.error(`${title} failed in ${duration}`); 19 | throw error; 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/buttons-bundles-selector.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | color ,String ,La couleur du bouton lorsque celui-ci sera activé.,"valeur ""R,G,B"" ","""224, 224, 224"" " 3 | enabled ,Boolean ,Indique si le bouton est actif ou non. ,true | false ,false 4 | filters ,"| IgoLogicalArrayOptions 5 | | AnyBaseOgcFilterOptions","| Configuration de l'expression filtrante appliquée sur l'activation du bouton.  6 | | Voir :ref:`filters `. ",, 7 | title ,String ,Indique ce qu'il y aura d'inscrit sur le bouton. ,, 8 | tooltip ,String ,Indique ce qu'il y aura d'inscrit dans l'info-bulle sur le bouton. ,, 9 | -------------------------------------------------------------------------------- /src/contexts/addLayerFromIndex.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "addLayerFromIndex", 3 | "base": "_base", 4 | "layers": [ 5 | { 6 | "title": "Index", 7 | "id": "wmsIndex", 8 | "sourceOptions": { 9 | "type": "vector", 10 | "url": "./data/wmsIndex.geojson", 11 | "queryable": true, 12 | "queryTitle": "Nom de la couche: ${name}" 13 | }, 14 | "messages": [ 15 | { 16 | "text": "messages.addLayerFromIndex", 17 | "type": "success", 18 | "options": { 19 | "tapToDismiss": false, 20 | "timeOut": 0 21 | } 22 | } 23 | ] 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sourceOptions-common.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | attributions ,String ,Les droits d'auteurs liés à la couche. ,, 3 | crossOrigin ,String ,"| Permet de définir l'entête de l'appel faite au serveur. 4 | | Permet entre autres, d'éviter les problématiques de CORS. 5 | | De manière plus commune, définir ""crossOrigin"": ""anonymous"". ",anonymous | use-credentials | null , 6 | download ,Object{} ,Les options de téléchargement. |Attention si vous avez un wms avec un| fichier en URL vous ne devez pas permettre |les formats géometriques,"allowedFormats" : ["URL", "GeoJSON", "GML", "GPX", "KML", "Shapefile", "CSVcomma", "CSVsemicolon"], 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | target-branch: "next" 13 | # Labels on pull requests for security and version updates 14 | labels: 15 | - "npm dependencies" 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "moduleResolution": "bundler", 7 | "module": "ES2022", 8 | "target": "ES2022", 9 | "esModuleInterop": true, 10 | "lib": [ 11 | "ES2022", 12 | "dom" 13 | ], 14 | "declaration": false, 15 | "emitDecoratorMetadata": true, 16 | "experimentalDecorators": true, 17 | "skipLibCheck": true, 18 | "sourceMap": true, 19 | "paths": { 20 | "@igo2/*": [ 21 | "node_modules/@igo2/*", 22 | "../../packages/*/src/public_api" 23 | ] 24 | } 25 | }, 26 | "exclude": ["dist", "scripts", "e2e/**/*"] 27 | } 28 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/igoOgcFilterFiltersObject.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | expression ,String ,Valeur,, 3 | operator ,String ,"| Opérateurs à appliquer.  4 | | ** Certains opérateurs sont disponibles uniquement sur certain type de filtre. 5 | | Par exemple, l'opérateur during est disponible uniquement sur le filtre de type time ","| PropertyIsEqualTo, PropertyIsNotEqualTo, 6 | | PropertyIsGreaterThan, PropertyIsGreaterThanOrEqualTo, 7 | | PropertyIsLessThan, PropertyIsLessThanOrEqualTo, 8 | | Intersects, Within 9 | | :ref:`During `", 10 | propertyName ,String ,Nom de la propriété sur laquelle appliquer le filtre (nom de la colonne) ,, 11 | -------------------------------------------------------------------------------- /proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/ws/": { 3 | "target": "https://testgeoegl.msp.gouv.qc.ca", 4 | "secure": false, 5 | "changeOrigin": true 6 | }, 7 | "/carto/": { 8 | "target": "https://testgeoegl.msp.gouv.qc.ca", 9 | "secure": false, 10 | "changeOrigin": true 11 | }, 12 | "/apis/": { 13 | "target": "https://testgeoegl.msp.gouv.qc.ca", 14 | "secure": false, 15 | "changeOrigin": true 16 | }, 17 | "/services/": { 18 | "target": "https://testgeoegl.msp.gouv.qc.ca", 19 | "secure": false, 20 | "changeOrigin": true 21 | }, 22 | "/swtq": { 23 | "target": "https://ws.mapserver.transports.gouv.qc.ca", 24 | "secure": false, 25 | "changeOrigin": true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /e2e/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /src/app/pages/portal/welcome-window/welcome-window.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | 4 | .spacer { 5 | flex: 1 1 auto; 6 | } 7 | 8 | #doNotShowCheck { 9 | margin-right: 5px; 10 | } 11 | 12 | mat-toolbar { 13 | color: var(--mat-sys-on-primary); 14 | background-color: var(--mat-sys-on-primary-container); 15 | 16 | h1 { 17 | color: var(--mat-sys-on-primary); 18 | } 19 | } 20 | 21 | label { 22 | margin-bottom: 0; 23 | } 24 | 25 | .mat-mdc-dialog-container { 26 | z-index: 1000; 27 | box-shadow: 0 0 0 1000em rgba(0, 0, 0, 0.6); 28 | transform: translate(-50%, 0); 29 | } 30 | 31 | ::ng-deep .custom-html { 32 | padding: 0 !important; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/wmts.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **type*** ,String ,,wmts,wmts 3 | format ,String ,"| Format d'image demandé au serveur.  4 | | Dépend des capacités du serveur (wmts Getcapabilities) ","Dépends des capacités du serveur 5 | ",image/jpeg 6 | **layer*** ,String ,Nom de la couche demandée ,, 7 | **matrixSet*** ,String ,Le nom du matrix set demandé au serveur ,, 8 | projection,String ,La projection de l'appel de tuile ,EPSG:3857 ,La projection de la carte 9 | style ,,"| Le nom du style demandé tel que présenté dans le  10 | | GetCapabilities du service ",, 11 | **url*** ,String ,L'URL du service de données tuilées ,, 12 | version,String ,La version WMTS du service demandé ,1.0.0 ,1.0.0 13 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel.animations.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnimationTriggerMetadata, 3 | animate, 4 | state, 5 | style, 6 | transition, 7 | trigger 8 | } from '@angular/animations'; 9 | 10 | export function showContent( 11 | duration = '150ms', 12 | delay = '300ms', 13 | easing = 'ease-in-out' 14 | ): AnimationTriggerMetadata { 15 | return trigger('showContent', [ 16 | state( 17 | 'true', 18 | style({ 19 | opacity: 1 20 | }) 21 | ), 22 | state( 23 | 'false', 24 | style({ 25 | opacity: 0 26 | }) 27 | ), 28 | transition('false => true', animate(`${duration} ${delay} ${easing}`)), 29 | transition('true => false', animate('0ms')) 30 | ]); 31 | } 32 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/welcomeWindow.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | nbVisitToShow ,Number ,"| Nombre de fois que sera présenté la fenêtre d'accueil. S'appliquera aussi après 3 | | être revenu par exemple lors d'une nouvelle version IGO. ",, 4 | nbVisitToShowAgain ,Number ,La fenêtre d'accueil reviendra après le nombre de visite indiqué par ce paramètre. ,, 5 | showAgainOnNewIGOVersion ,Boolean ,"| Lorsque l'utilisateur coche la case ne plus afficher, la fenêtre d'accueil reviendra 6 | | si la version IGO est différente de la version lors de sa visite précédente. ",,true 7 | discoverTitleInLocale ,string ,"| Permet de définir un titre pour le bouton lié au tour interactif. Si nul, 8 | | la clé IGO sera utilisé dans le fichier de traductiion. ",,IGO 9 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/storedQueriesReverse.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Description,Valeur défaut 2 | **latField*** ,Nom du champ à demander au server pour la latitude. , 3 | **longField*** ,Nom du champ à demander au server pour la longitude. , 4 | outputFormat ,"| Référer au GetCapabilities pour découvrir les formats supportés par votre serveur. 5 | | Vous ne pouvez définir de GML 3.2 + compte tenu d'un  6 | | `bug `__  connu d'Openlayers. ",text/xml; subtype=gml/3.1.1 7 | resultTitle ,Nom de l'attribut à utiliser pour le titre du résultat. , 8 | searchUrl ,Url du service ,https://ws.mapserver.transports.gouv.qc.ca/swtq 9 | srsname ,SRS demandé au serveur ,EPSG:4326 10 | **storedquery_id***,Nom de la requête à demander au serveur. , 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | /e2e/dist 4 | 5 | # bundled locale for the demo 6 | /src/locale/libs_locale 7 | 8 | # compiled output 9 | /dist 10 | /tmp 11 | /docs/_build 12 | # dependencies 13 | /node_modules 14 | 15 | 16 | # IDEs and editors 17 | /.idea 18 | .project 19 | .classpath 20 | .c9/ 21 | *.launch 22 | .settings/ 23 | 24 | # IDE - VSCode 25 | .vscode/* 26 | !.vscode/settings.json 27 | !.vscode/tasks.json 28 | !.vscode/launch.json 29 | !.vscode/extensions.json 30 | 31 | # misc 32 | /.angular/cache 33 | /.sass-cache 34 | /connect.lock 35 | /coverage/* 36 | /libpeerconnection.log 37 | npm-debug.log 38 | testem.log 39 | /typings 40 | 41 | #System Files 42 | .DS_Store 43 | Thumbs.db 44 | 45 | #Compodoc 46 | /documentation 47 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/layersLinkProperties.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **linkedIds** ,String[] ,"| Liste des identifiants de liaison. 3 | | C'est à dire, une liste des linkId des couches enfant. 4 | ",, 5 | syncedDelete ,Boolean ,"| Indique si les 2 couches doivent être supprimées 6 | | simultanément lorsque une ou l'autre des couches 7 | | est supprimée de la liste des couches. ",true | false,false 8 | **properties** ,String[] ,"| Indique les propriétés à maintenir entre les 2 couches liées. 9 | | - opacity 10 | | - visible 11 | | - :ref:`ogcFilters ` 12 | | - minResolution 13 | | - maxResolution 14 | | - zIndex 15 | | - timeFilter => `Configuration filtre temporel WMS-T (timeFilter)`_",, 16 | -------------------------------------------------------------------------------- /src/app/pages/portal/portal.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { 4 | IgoDirectionsModule, 5 | IgoQueryModule, 6 | IgoSearchModule, 7 | provideOptionsApi, 8 | provideStyleListOptions 9 | } from '@igo2/geo'; 10 | import { AnalyticsListenerService } from '@igo2/integration'; 11 | 12 | import { PortalComponent } from './portal.component'; 13 | 14 | @NgModule({ 15 | imports: [ 16 | IgoQueryModule.forRoot(), 17 | IgoSearchModule, 18 | IgoDirectionsModule, 19 | PortalComponent 20 | ], 21 | exports: [PortalComponent], 22 | providers: [ 23 | AnalyticsListenerService, 24 | provideOptionsApi(), 25 | provideStyleListOptions({ 26 | path: './assets/list-style.json' 27 | }) 28 | ] 29 | }) 30 | export class PortalModule {} 31 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Please check if the PR fulfills these requirements** 2 | - [ ] The commit message follows our guidelines:https://github.com/infra-geo-ouverte/igo2/blob/master/.github/CONTRIBUTING.md#git-commit-guidelines 3 | - [ ] Tests for the changes have been added (for bug fixes / features) 4 | - [ ] Docs have been added / updated (for bug fixes / features) 5 | 6 | 7 | **What is the current behavior?** (You can also link to an open issue here) 8 | 9 | 10 | 11 | **What is the new behavior?** 12 | 13 | 14 | 15 | **Does this PR introduce a breaking change?** (check one with "x") 16 | ``` 17 | [ ] Yes 18 | [ ] No 19 | ``` 20 | 21 | If this PR contains a breaking change, please describe the impact and migration path for existing applications: 22 | 23 | 24 | **Other information**: 25 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/spatialFilterOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | type ,SpatialFilterType ,"| Spécifie le type de zone sur lequel le filtrage sera appliqué 3 | | Predefined = Zone prédéfinie (Municipalités, Arrondissements, Région administratives...) 4 | | Polygon = Polygone dessinée par l'utilisateur 5 | | Point = Cercle dessinée par l'utilisateur","| Predefined 6 | | Polygon 7 | | Point", 8 | itemType ,SpatialFilterItemType ,"| Spécifie le type des éléments qui seront filtrés 9 | | Address = Adresses provenant de la couche d'Adresses Québec 10 | | Thematics = Données provenant de l'api terrAPI","| Address 11 | | Thematics",Address 12 | freehandDrawIsActive ,Boolean ,"Indique si le mode de dessin ""à main levée"" est actif ou non. ",True | false, 13 | -------------------------------------------------------------------------------- /src/app/pages/portal/toast-panel/toast-panel.animations.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnimationTriggerMetadata, 3 | animate, 4 | state, 5 | style, 6 | transition, 7 | trigger 8 | } from '@angular/animations'; 9 | 10 | export function showContent( 11 | duration = '50ms', 12 | delay = '280ms', 13 | easing = 'ease-in-out' 14 | ): AnimationTriggerMetadata { 15 | return trigger('showContent', [ 16 | state( 17 | 'true', 18 | style({ 19 | opacity: 1, 20 | display: 'block' 21 | }) 22 | ), 23 | state( 24 | 'false', 25 | style({ 26 | opacity: 0, 27 | display: 'none' 28 | }) 29 | ), 30 | transition('false => true', animate(`${duration} ${delay} ${easing}`)), 31 | transition('true => false', animate('0ms')) 32 | ]); 33 | } 34 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/iLayer.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Valeur défaut 2 | searchUrl ,https://geoegl.msp.gouv.qc.ca/apis/layers/search 3 | settings ,`Ligne 93 `__ 4 | title ,"| Basé sur la traduction de 2 fichiers. 5 | | Propriété igo.geo.search.layer.title dans 6 | | - `en.geo.json  `__  7 | | - `fr.geo.json  `__ " 8 | queryFormat ,Possibilité de définir le format par URL pour la présentation des informations lors de l’interrogation de la couche par clic. 9 | -------------------------------------------------------------------------------- /src/app/pages/portal/toast-panel-for-expansion/toast-panel-for-expansion.animations.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnimationTriggerMetadata, 3 | animate, 4 | state, 5 | style, 6 | transition, 7 | trigger 8 | } from '@angular/animations'; 9 | 10 | export function showContent( 11 | duration = '50ms', 12 | delay = '280ms', 13 | easing = 'ease-in-out' 14 | ): AnimationTriggerMetadata { 15 | return trigger('showContent', [ 16 | state( 17 | 'true', 18 | style({ 19 | opacity: 1, 20 | display: 'block' 21 | }) 22 | ), 23 | state( 24 | 'false', 25 | style({ 26 | opacity: 0, 27 | display: 'none' 28 | }) 29 | ), 30 | transition('false => true', animate(`${duration} ${delay} ${easing}`)), 31 | transition('true => false', animate('0ms')) 32 | ]); 33 | } 34 | -------------------------------------------------------------------------------- /src/assets/list-style.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "style": { 4 | "fill": { 5 | "color": "blue" 6 | }, 7 | "scale": 1.9, 8 | "stroke": { 9 | "color": "green", 10 | "width": 4 11 | }, 12 | "circle": { 13 | "fill": { 14 | "color": "pink" 15 | }, 16 | "stroke": { 17 | "color": "black" 18 | }, 19 | "radius": 8 20 | } 21 | } 22 | }, 23 | "LAYER_TITLE_YOU_WANT_TO_STYLE_WITH...": { 24 | "clusterStyle": { 25 | "circle": { 26 | "fill": { 27 | "color": "red" 28 | }, 29 | "stroke": { 30 | "color": "black" 31 | }, 32 | "radius": 4 33 | } 34 | }, 35 | "clusterParam": { 36 | "clusterRange": [2, 5] 37 | }, 38 | "distance": 70 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "angular.enable-strict-mode-prompt": false, 3 | "files.watcherExclude": { 4 | "**/.git/objects/**": true, 5 | "**/.git/subtree-cache/**": true, 6 | "**/node_modules/**": true, 7 | "**/dist/**": true 8 | }, 9 | "search.exclude": { 10 | "**/node_modules": true, 11 | "**/dist": true 12 | }, 13 | "[javascript]": { 14 | "editor.defaultFormatter": "esbenp.prettier-vscode", 15 | "editor.formatOnSave": true 16 | }, 17 | "[typescript]": { 18 | "editor.defaultFormatter": "esbenp.prettier-vscode", 19 | "editor.formatOnSave": true 20 | }, 21 | "[html]": { 22 | "editor.defaultFormatter": "esbenp.prettier-vscode", 23 | "editor.formatOnSave": true 24 | }, 25 | "[scss]": { 26 | "editor.defaultFormatter": "esbenp.prettier-vscode", 27 | "editor.formatOnSave": true 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/igoogcfilterduringoptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | begin ,String ,Valeur de début du filtre temporel ,,Valeur **minDate** de la couche 3 | end ,String ,Valeur de fin du filtre temporel ,,Valeur **maxDate** de la couche 4 | step ,String ,Pas de temps défini selon la norme ISO-8601 ,Voir `wiki `__ ,60000 millisecondes 5 | restrictedToStep ,Boolean,"| True si le filtre doit respecter le pas de temps depuis 6 | | l'attribut **minDate**. 7 | | 8 | | Sinon le pas de temps est respecté selon l'attribut **begin**",True | False ,False 9 | calendarModeYearBoolean,,"Lorsque true, l’interface présentera uniquement des 10 | | années et ajustera les requête aux service pour 11 | | que l’année de début et de fin soit incluse dans 12 | | le retour.",True | False ,False -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-button/expansion-panel-button.component.spec.ts: -------------------------------------------------------------------------------- 1 | // import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | // import { ExpansionPanelButtonComponent } from './expansion-panel-button.component'; 4 | 5 | // describe('ExpansionPanelButtonComponent', () => { 6 | // let component: ExpansionPanelButtonComponent; 7 | // let fixture: ComponentFixture; 8 | 9 | // beforeEach(() => { 10 | // TestBed.configureTestingModule({ 11 | // imports: [ExpansionPanelButtonComponent] 12 | // }); 13 | // fixture = TestBed.createComponent(ExpansionPanelButtonComponent); 14 | // component = fixture.componentInstance; 15 | // fixture.detectChanges(); 16 | // }); 17 | 18 | // it('should create', () => { 19 | // expect(component).toBeTruthy(); 20 | // }); 21 | // }); 22 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/legendOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | collapsed ,Boolean,Définir si la légende est ouverte. ,true | false , 3 | display ,Boolean,Indique si on affiche la légende. ,true | false ,true 4 | html ,String,Inscription html pour la légende. ,, 5 | stylesAvailable ,ItemStyleOptions[] ,"| Permet de modifier/contrôler la liste des styles provenant du 6 | | service web. Correspond aux styles disponible pour le layer 7 | | WMS tel que décrit dans le GetCapabilities WMS.","| Ex:  ""stylesAvailable"": [   8 | | { ""name"": ""raster"", ""title"": ""pixel"" }, 9 | | { ""name"": ""Contour"", ""title"": ""aucune couleur"" } 10 | | ] ", 11 | url ,String,"| URL imposé pour l'appel de la légende. 12 | | Exemple: ""/ws/mffpecofor.fcgi?&REQUEST=GetLegendGraphic&SERVICE=WMS&FORMAT=image/png&SLD_VERSION=1.1.0&VERSION=1.3.0&LAYER=lidar_index_extraction"" ",, 13 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/common.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | available ,Boolean ,Permet de préciser si le service est utilisable dans l'application. ,true | false ,true 3 | enabled ,Boolean ,"| Permet de préciser si le service est activé (coché) 4 | | à l'ouverture de l'application.",true | false ,true 5 | order ,Number ,"| Définit la position des résultats dans la liste 6 | | des résultats de recherche. Plus le nombre est élevé, 7 | | plus les résultats de cette source seront 8 | | au bas de la liste. ",,99 9 | params ,Object {} ,"| Paramètres supplémentaires à ajouter à la requête 10 | | faite au serveur associé. Spécifique selon la source.",, 11 | searchUrl ,String,URL du serveur à utiliser. ,,Spécifique selon la source. 12 | settings ,SearchSourceSettings [] ,En construction ,,Spécifique selon la source. 13 | **title*** ,String ,Titre du service de recherche ,,Spécifique selon la source. 14 | -------------------------------------------------------------------------------- /docs/todo.rst: -------------------------------------------------------------------------------- 1 | http://docutils.sourceforge.net/docs/ref/rst/directives.html#code 2 | https://livesphinx.herokuapp.com/ 3 | https://www.ericholscher.com/blog/2016/mar/15/dont-use-markdown-for-technical-docs/ 4 | 5 | 6 | CONFIG.JSON 7 | 8 | 9 | Auth 10 | 11 | - loginRoute?: string; 12 | - logoutRoute?: string; 13 | - homeRoute?: string; 14 | - intern?: AuthInternOptions; 15 | - facebook?: AuthFacebookOptions; 16 | - google?: AuthGoogleOptions; 17 | - trustHosts?: string[]; 18 | - profilsGuard?: string[]; 19 | 20 | context 21 | 22 | 23 | CONTEXT.JSON 24 | 25 | Le fichier context.json: 26 | .. warning:: 27 | 28 | Section context.json en cours de construction 29 | 30 | 31 | icherche 32 | Lien vers l'api? contenu a jour? 33 | https://gitlab.forge.gouv.qc.ca/geomatique/api/wikis/geocode ? 34 | 35 | SearchSourceSettings [] 36 | 37 | Coordonnées bug et partiellement complet pour les format bell et autres. 38 | 39 | -------------------------------------------------------------------------------- /src/data/geoDataToIDB.json: -------------------------------------------------------------------------------- 1 | { 2 | "geoDatas": [ 3 | { 4 | "triggerDate": "2022-11-01", 5 | "action": "delete", 6 | "urls": [ 7 | "https://ws.mapserver.transports.gouv.qc.ca/swtq?service=WFS&request=GetFeature&version=1.1.0&typename=chantiers_mtmdet&outputFormat=geojson" 8 | ] 9 | }, 10 | { 11 | "triggerDate": "2023-11-07", 12 | "action": "delete", 13 | "urls": [ 14 | "https://www.donneesquebec.ca/recherche/dataset/f647f5ed-a8f3-4a47-8ceb-977cbf090675/resource/68e0e20a-415d-44f5-af82-a90311784616/download/bornes-incendies.geojson" 15 | ] 16 | }, 17 | { 18 | "triggerDate": "2023-11-07", 19 | "action": "update", 20 | "urls": [ 21 | "https://www.donneesquebec.ca/recherche/dataset/527944ae-893d-41ac-8255-340fb1c2c83b/resource/d1b89d6a-8c31-4831-8895-95dc45120f79/download/borne-incendie.json" 22 | ], 23 | "source": "nov2022" 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapLegendOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | allowShowAllLegends ,Boolean ,"| Affiche un bouton permettant de montrer toutes les légendes de la carte, 3 | | même pour les couches non visible OU hors échelle d'affichage. ",true / false ,false 4 | showAllLegendsValue ,Boolean ,"| Si allowShowAllLegends est permis (true), définit la valeur à l'ouverture de l'application. 5 | | true = toutes les légendes sont affichées (même ceux non visibles à la carte) ",true / false ,false 6 | layerAdditionAllowed ,Boolean ,"| Identifie si l'ajout de couches à la carte sont permises. 7 | | Influence les messages d'aide à l'usager",true / false ,true 8 | updateLegendOnResolutionChange ,Boolean ,Permet de rafraichir la légende à chaque changement de résolution (zoom) ,true / false ,false 9 | layerListControls ,Objet,Divers contrôles effectués à la liste de couches affichées dans l'interface. ,,"{""excludeBaseLayers"": false} " 10 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-button/expansion-panel-button.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, Output } from '@angular/core'; 2 | import { MatButtonModule } from '@angular/material/button'; 3 | import { MatIconModule } from '@angular/material/icon'; 4 | import { MatTooltipModule } from '@angular/material/tooltip'; 5 | 6 | import { IgoLanguageModule } from '@igo2/core/language'; 7 | 8 | @Component({ 9 | selector: 'app-expansion-panel-button', 10 | imports: [ 11 | MatButtonModule, 12 | MatIconModule, 13 | MatTooltipModule, 14 | IgoLanguageModule 15 | ], 16 | templateUrl: './expansion-panel-button.component.html', 17 | styleUrls: ['./expansion-panel-button.component.scss'] 18 | }) 19 | export class ExpansionPanelButtonComponent { 20 | @Input() expanded: boolean; 21 | 22 | @Output() expand = new EventEmitter(); 23 | 24 | onToggleClick(): void { 25 | this.expand.emit(!this.expanded); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /scripts/src/core/paths.mts: -------------------------------------------------------------------------------- 1 | import { join, resolve } from 'node:path'; 2 | import { fileURLToPath } from 'node:url'; 3 | 4 | import { readFileContentSync } from '../utils/file-system.utils.mts'; 5 | 6 | export interface IPackageJson { 7 | name: string; 8 | version: string; 9 | exports: { [key: string]: string | { [key: string]: string } }; 10 | dependencies: { [key: string]: string }; 11 | peerDependencies: { [key: string]: string }; 12 | } 13 | 14 | const ROOT_LEVEL = '../../../../'; 15 | const ROOT = join(fileURLToPath(import.meta.url), ROOT_LEVEL); 16 | 17 | export const resolveRoot = (relativePath: string): string => { 18 | return resolve(ROOT, relativePath); 19 | }; 20 | 21 | export const PATHS = { 22 | dist: resolveRoot('dist'), 23 | nodeModules: resolveRoot('node_modules'), 24 | root: ROOT, 25 | packageJson: resolveRoot('package.json') 26 | }; 27 | 28 | export function getPackageJson(): IPackageJson { 29 | return readFileContentSync(PATHS.packageJson); 30 | } 31 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/map-overlay.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | height: 100%; 3 | top: 0; 4 | left: 0; 5 | right: 0; 6 | position: fixed; 7 | pointer-events: none; 8 | } 9 | 10 | .mapOverlayDefault { 11 | position: absolute; 12 | white-space: nowrap; 13 | pointer-events: auto; 14 | } 15 | 16 | .bottom-right { 17 | bottom: 0; 18 | right: 0; 19 | } 20 | 21 | .top-right { 22 | top: 0; 23 | right: 0; 24 | } 25 | 26 | .bottom-left { 27 | bottom: 0; 28 | left: 0; 29 | } 30 | 31 | .top-left { 32 | top: 0; 33 | left: 0; 34 | } 35 | 36 | .bottom-center { 37 | bottom: 0; 38 | left: 50%; 39 | transform: translate(-50%, 0); 40 | } 41 | 42 | .top-center { 43 | top: 0; 44 | left: 50%; 45 | transform: translate(-50%, 0); 46 | } 47 | 48 | .center-center { 49 | top: 50%; 50 | left: 50%; 51 | transform: translate(-50%, 0); 52 | } 53 | 54 | .center-right { 55 | top: 50%; 56 | right: 0; 57 | } 58 | 59 | .center-left { 60 | top: 50%; 61 | left: 0; 62 | } 63 | -------------------------------------------------------------------------------- /src/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage') 13 | ], 14 | client: { 15 | clearContext: false // leave Jasmine Spec Runner output visible in browser 16 | }, 17 | coverageReporters: { 18 | dir: require('path').join(__dirname, '../coverage'), 19 | reporters: ['html', 'lcovonly'], 20 | fixWebpackSourcePaths: true 21 | }, 22 | reporters: ['progress', 'kjhtml'], 23 | port: 9876, 24 | colors: true, 25 | logLevel: config.LOG_INFO, 26 | autoWatch: true, 27 | browsers: ['Chrome'], 28 | singleRun: false 29 | }); 30 | }; 31 | -------------------------------------------------------------------------------- /docs/_tables/fr/interactiveTour/interactiveTourOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | disableInteraction ,Boolean ,Permet ou non à l'utilisateur de cliquer sur les éléments en surbrillance ,true | false ,true 3 | highlightClass ,Boolean ,Définit la classe à appliquer aux éléments en surbrillance ,, 4 | position ,String ,Définit la position des boites aide ,"'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'right' | 'right-start' | 'right-end' | 'left' | 'left-start' | 'left-end'","| NB.: Si la propriété position n'est pas présente, 5 | | les boites seront disposées au centre de l'écran." 6 | scrollToElement ,Boolean ,Indique si on défile la page sur l'élément en surbrillance ,true | false , 7 | steps ,:ref:`InteractiveTourStep ` , Une liste de step (étapes du tour inteactif),, 8 | conditions ,String ,Les éléments HTML qui doivent être présents pour activer le bouton du tour ,, 9 | title ,String ,Le titre de toutes les boites aide ,, 10 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel-header.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | Component, 4 | EventEmitter, 5 | HostBinding, 6 | Input, 7 | Output 8 | } from '@angular/core'; 9 | 10 | import { ExpansionPanelButtonComponent } from './expansion-panel-button/expansion-panel-button.component'; 11 | 12 | @Component({ 13 | selector: 'app-expansion-panel-header', 14 | templateUrl: './expansion-panel-header.component.html', 15 | styleUrls: ['./expansion-panel-header.component.scss'], 16 | changeDetection: ChangeDetectionStrategy.OnPush, 17 | imports: [ExpansionPanelButtonComponent] 18 | }) 19 | export class ExpansionPanelHeaderComponent { 20 | @Input() expanded: boolean; 21 | 22 | @Output() expandedChange = new EventEmitter(); 23 | 24 | @HostBinding('class.app-expansion-panel-header-expanded') 25 | get hasExpandedClass() { 26 | return this.expanded; 27 | } 28 | 29 | handleClose(): void { 30 | this.expandedChange.emit(false); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/pages/footer/footer.component.scss: -------------------------------------------------------------------------------- 1 | .order2 { 2 | order: 2; 3 | margin-right: 0.5%; 4 | display: block; 5 | right: 0; 6 | margin-left: 140px; 7 | text-align: right !important; 8 | width: 100%; 9 | } 10 | 11 | $footer-margin-top: 0px; 12 | $footer-height: 29px; 13 | 14 | .footer-right { 15 | z-index: 666; 16 | background: #ffffffa3; 17 | font-size: 0.7rem; 18 | display: flex; 19 | align-items: center; 20 | height: $footer-height; 21 | } 22 | 23 | span.footer-text { 24 | color: #095797; 25 | align-self: center; 26 | margin-left: 0.5rem; 27 | } 28 | 29 | span.footer-text a { 30 | color: #095797; 31 | text-decoration: none; 32 | } 33 | 34 | ::ng-deep div.ol-scale-line { 35 | position: fixed !important; 36 | display: flex; 37 | flex-direction: row; 38 | margin-left: 0.5%; 39 | left: 70px !important; 40 | bottom: 3px !important; 41 | } 42 | 43 | ::ng-deep .ol-scale-line-inner { 44 | border: 1px solid black; 45 | color: black; 46 | border-top: none; 47 | order: 1; 48 | } 49 | -------------------------------------------------------------------------------- /src/app/pages/portal/toast-panel-for-expansion/toast-panel-for-expansion.component.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/core.variables' as core; 2 | @use '@igo2/core/partial/media'; 3 | @use '../portal.variables' as portal; 4 | 5 | :host { 6 | @extend %box-shadowed; 7 | 8 | background-color: white; 9 | 10 | height: portal.$toast-panel-for-expansion-collapsed-height; 11 | max-height: portal.$toast-panel-for-expansion-max-height; 12 | 13 | transition: height 280ms cubic-bezier(0.4, 0, 0.2, 1); 14 | padding: core.$igo-padding; 15 | 16 | @include media.mobile { 17 | max-height: 40%; 18 | } 19 | } 20 | 21 | :host.toast-panel-for-expansion-opened { 22 | height: portal.$toast-panel-for-expansion-max-height; 23 | 24 | @include media.mobile { 25 | height: 40%; 26 | } 27 | } 28 | 29 | igo-panel { 30 | position: relative; 31 | height: 100%; 32 | 33 | ::ng-deep .igo-panel-header:hover { 34 | cursor: pointer; 35 | } 36 | } 37 | 38 | div[igostoppropagation] { 39 | height: 100%; 40 | width: 100%; 41 | } 42 | -------------------------------------------------------------------------------- /src/app/pages/portal/welcome-window/welcome-window.component.html: -------------------------------------------------------------------------------- 1 | @if (html$ | async) { 2 |
3 | 4 |

{{ 'welcomeWindow.title' | translate }}

5 | 6 | 15 |
16 |
17 | 18 |
19 | 20 | 28 | 29 |
30 | } 31 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/search-sources-prop.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | title ,String,Le titre de la source de recherche,"icherche,ilayer,icherchereverse,nominatim", 3 | searchUrl ,String,Définit l'url de la source de recherche,, 4 | available ,Boolean,,true/false, 5 | enabled ,Boolean, La valeur permet/bloque l'accesibilité de la propriété,true/false, 6 | order ,number,Ordre d'apparition des résultats de recherche,, 7 | distance ,number,Rayon de recherche à appliquer pour la icherche reverse,100,500,1000,2000,5000, 8 | params ,String,Permet de modifier les paramètres d'url,limit: 5 (limite le nombre de resultats de recherche à 5), 9 | settings ,SearchSourceSettings[],Permet de modifier les paramètres d'affichage de la source,, 10 | queryFormat ,String, Permet de forcer un format pour l'interrogation (query),, 11 | showInPointerSummary ,Boolean,Afficher ou non la possibilité du pointeur sommaire,true/false, true 12 | showInSettings ,Boolean,Permettre l'affichage de la source dans les paramètres de la recherche,true/false, 13 | -------------------------------------------------------------------------------- /src/test.config.ts: -------------------------------------------------------------------------------- 1 | import { registerLocaleData } from '@angular/common'; 2 | import { provideHttpClient } from '@angular/common/http'; 3 | import { provideHttpClientTesting } from '@angular/common/http/testing'; 4 | import localeFrCaExtra from '@angular/common/locales/extra/fr-CA'; 5 | import localeFrCa from '@angular/common/locales/fr-CA'; 6 | import { provideZonelessChangeDetection } from '@angular/core'; 7 | import { TestModuleMetadata } from '@angular/core/testing'; 8 | import { provideRouter } from '@angular/router'; 9 | 10 | registerLocaleData(localeFrCa, localeFrCaExtra); 11 | 12 | export const testConfig: TestModuleMetadata = { 13 | providers: [ 14 | provideZonelessChangeDetection(), 15 | provideHttpClient(), 16 | provideHttpClientTesting(), 17 | provideRouter([]) 18 | ] 19 | }; 20 | 21 | export function mergeTestConfig( 22 | moduleDef: TestModuleMetadata 23 | ): TestModuleMetadata { 24 | console.log(); 25 | return { 26 | ...moduleDef, 27 | providers: [...(moduleDef.providers ?? []), ...testConfig.providers!] 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /release.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('semantic-release').GlobalConfig} 3 | */ 4 | module.exports = { 5 | branches: [{ name: 'master' }, { name: 'next', prerelease: 'next' }], 6 | plugins: [ 7 | '@semantic-release/commit-analyzer', 8 | '@semantic-release/release-notes-generator', 9 | [ 10 | '@semantic-release/github', 11 | { 12 | assets: [ 13 | { 14 | path: 'dist/igo2/igo2-dist.zip', 15 | label: 'Distributions files' 16 | } 17 | ] 18 | } 19 | ], 20 | [ 21 | '@semantic-release/exec', 22 | { 23 | prepareCmd: [ 24 | 'npm pkg set version=${nextRelease.version}', 25 | 'node --import tsx scripts/src/update-version.mts ${nextRelease.version}', 26 | 'npm run build.prod', 27 | 'cd dist/igo2 && zip -qq -r igo2-dist.zip *' 28 | ].join(' && ') 29 | } 30 | ], 31 | [ 32 | '@semantic-release/git', 33 | { assets: ['src/**/*', 'package.json', 'package-lock.json'] } 34 | ] 35 | ] 36 | }; 37 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/timeFilter.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | min ,String,Période de temps minimum. ,"| En fonction du type,  3 | | peut être une année,  4 | | une date ou une heure.  5 | |             6 | | NB: Si la valeur est absente,  7 | | le système appliquera ce qui  8 | | est définit dans le service. ", 9 | max ,String,Période de temps maximum. ,"| En fonction du type,  10 | | peut être une année,  11 | | une date ou une heure.  12 | |             13 | | NB: Si la valeur est absente,  14 | | le système appliquera ce qui  15 | | est définit dans le service. ", 16 | range,Boolean,Intervalle à saisir par utilisateur. ,true/false , 17 | step ,Number,Le temps de l'intervalle en millisecondes. ,Ex: 63072000000 pour un an. , 18 | style ,String,Le style du selecteur temporel,"calendar, slider ",slider 19 | type ,String,"Le type temporel de calendrier. En année, jour, heure, etc. ","year, date ", 20 | timeInterval ,Number,"| Pour configuration en 'slider',  21 | | le temps d'attente avant de passer  22 | | au suivant, en millisecondes. ",, 23 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/igoOgcFilterDuring.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | begin ,String ,Valeur de début du filtre temporel. NB.: avec calendarModeYear il ne doit pas avoir de temps d'inscris,,Valeur **minDate** de la couche 3 | end ,String ,Valeur de fin du filtre temporel.NB.: avec calendarModeYear il ne doit pas avoir de temps d'inscris ,,Valeur **maxDate** de la couche 4 | step ,String ,Pas de temps défini selon la norme ISO-8601 ,Voir `Wiki`__ ,60000 millisecondes 5 | restrictToStep ,Boolean, "| True si le filtre doit respecter le pas de temps depuis 6 | | l'attribut **minDate**. 7 | | En mode calendrier à true, n'affichera plus la date de fin, le filtre sera : date début + pas de temps. 8 | | Sinon le pas de temps est respecté selon l'attribut **begin**" ,True | False ,False 9 | calendarModeYear,Boolean,"| Lorsque true, l’interface présentera uniquement des 10 | | années et ajustera les requête aux service pour 11 | | que l’année de début et de fin soit incluse dans 12 | | le retour.",True | False ,False 13 | -------------------------------------------------------------------------------- /.github/workflows/pull-request.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | # 4 | 5 | name: Pull Request 6 | on: 7 | workflow_dispatch: 8 | pull_request: 9 | types: [opened, synchronize] 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: The branch or tag ref that triggered the workflow run. 16 | run: echo ${GITHUB_REF#refs/*/} 17 | 18 | - uses: actions/checkout@v4 19 | - name: Use Node.js 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: 24 23 | 24 | - name: Install dependencies 25 | run: npm ci --no-audit 26 | 27 | - name: Security 28 | run: npm audit --omit dev && npm audit signatures 29 | 30 | - name: Quality 31 | run: npm run lint.check & npm run format.check 32 | 33 | - name: Test 34 | run: npm run e2e 35 | 36 | - name: Build 37 | run: npm run build.prod 38 | -------------------------------------------------------------------------------- /src/app/pages/footer/footer.component.html: -------------------------------------------------------------------------------- 1 | 34 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/map-overlay.component.html: -------------------------------------------------------------------------------- 1 | @for (element of mapOverlay; track element; let i = $index) { 2 |
12 | @if (element.link) { 13 | 14 | {{ element.text }} 15 | @if (element.imgSrc) { 16 | 21 | } 22 | 23 | } @else { 24 | {{ element.text }} 25 | @if (element.imgSrc) { 26 | 31 | } 32 | } 33 |
34 | } 35 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/core.variables' as core; 2 | 3 | igo-spinner { 4 | position: absolute; 5 | top: core.$igo-margin; 6 | right: core.$igo-margin; 7 | z-index: 100; 8 | } 9 | 10 | /*** Message-center ***/ 11 | igo-message-center 12 | ::ng-deep 13 | simple-notifications 14 | ::ng-deep 15 | div.simple-notification-wrapper { 16 | right: 10px; 17 | } 18 | 19 | $header-height: 72px; 20 | $header-height-mobile: 72px; 21 | $footer-height: 29px; 22 | 23 | ::ng-deep .portal-with-header { 24 | height: calc(100% - #{$header-height-mobile}) !important; 25 | } 26 | 27 | ::ng-deep .portal-with-header-footer { 28 | height: calc(100% - #{$header-height-mobile} - #{$footer-height}) !important; 29 | } 30 | 31 | ::ng-deep .portal-with-footer { 32 | height: calc(100% - #{$footer-height}) !important; 33 | } 34 | 35 | @media screen and (min-width: 824px) { 36 | ::ng-deep .portal-with-header { 37 | height: calc(100% - #{$header-height}) !important; 38 | } 39 | 40 | ::ng-deep .portal-with-header-footer { 41 | height: calc(100% - #{$header-height} - #{$footer-height}) !important; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/buttons-bundles.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | selector ,"| OgcPushButton[] 3 | | OgcCheckbox[] 4 | | OgcRadioButton[] 5 | | OgcSelect[] ",Liste de selecteur pour filtrer les entités de la carte ,, 6 | **id*** ,String ,"| Id rataché au groupe pour le classement dans le groupe.  7 | | Doit être présente et identique dans  8 | | ogcFilter.{selector}.groups.ids ",, 9 | **logical*** ,String ,"| Opérateur logique à appliquer entre les boutons lorsque  10 | | plusieurs boutons seront activés. ""ET"", ""OU"". ","Or, And ", 11 | vertical ,Boolean ,"| Indique si la disposition des boutons dans la  12 | | fenêtre se fait de manière verticale. ",true | false ,false 13 | title ,String ,Indique le sous-titre à afficher pour le sélecteur en question. ,, 14 | multiple ,Boolean ,"| Indique si une liste déroulante permet la sélection de  15 | | plusieurs éléments. ",true | false ,true 16 | unfiltered ,Boolean ,"| Indique si une option permettant de réinitialiser les filtres  17 | | appliqués est disponible. ",true | false , 18 | order ,Number,Indique l'ordre d'apparition du sélecteur en question. ,, 19 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. include:: global.rst 2 | 3 | .. meta:: 4 | 5 | :DC.creator: Gouvernement du Québec 6 | :DC.language: fr 7 | 8 | ----------------------- 9 | IGO-2 10 | ----------------------- 11 | 12 | Voici le site de documentation pour la IGO2 : Infrastructure Géomatique Ouverte 2.0 (|igo2|_) / Open GIS Infrastructure project version 2.0. 13 | 14 | |igo-logo| 15 | 16 | 17 | * Installation : `https://github.com/infra-geo-ouverte/igo2#installation-et-démarrage `_ 18 | * Démo : ``_ 19 | * Dépôt GitHub : 20 | - ``_ 21 | - ``_ 22 | 23 | 24 | ---------- 25 | 26 | Dernière mise à jour de la documentation : |date| (|time| UTC) 27 | 28 | |CC| 29 | 30 | ---------- 31 | 32 | .. toctree:: 33 | :maxdepth: 5 34 | 35 | english 36 | introduction 37 | config_json 38 | properties 39 | url_control 40 | interactiveTour_config 41 | shortcut 42 | 43 | .. note:: 44 | 45 | Cette documentation est en construction. 46 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/import-export.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **url*** ,String ,Url du service de conversion. ,https://geoegl.msp.gouv.qc.ca/apis/ogre , 3 | clientSideFileSizeMaxMb ,Number ,Taille maximum du fichiers pouvant être lu par le fureteur. ,,30 4 | gpxAggregateInComment ,Boolean,"| Lorsque l'option est activée l'exportation du fichier vers le format GPX va rassembler 5 | | les informations de l'enregistrement dans le champ «cmt» du gpx et assigner la valeur 6 | | de l'ID au champ «name». ",,false 7 | forceNaming ,Boolean,Ajoute une boite texte au formulaire d'exportation qui permet de nommer le fichier exporter. ,,false 8 | formats ,String[] ,La liste des formats qu'il est possible d'exporter. ,"'GeoJSON', 'GML', 'GPX', 'KML', 'Shapefile', 'CSV' ","['GeoJSON', 'GML', 'GPX', 'KML', 'Shapefile', 'CSV'] " 9 | configFileToGeoDBService ,String ,Fichiers de configuration à utiliser afin d'intégrer des données dans la base de données Indexed-db de l'application.,"un url, relatif ou absolu", 10 | allowToStoreLayer ,Boolean ,Indique si les données importées doivent être stockées dans la l'Indexed-DB, true/false, false 11 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/search/storedQueries.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Description,Valeur défaut 2 | **fields*** ,"| Liste des champs à intéroger pour la StoredQueries. 3 | | La structure est la suivante: 4 | | 1er attribut: {« name »: « rtss », »defaultValue »: « -99 »}, 5 | | 2e attribut : {« name »: « chainage », »defaultValue »: « 0 », »splitPrefix »: « \+ »} 6 | | afin de représenter le terme dans la barre de recherche: 0013801110000c+12", 7 | outputFormat ,"| Référer au GetCapabilities pour découvrir les formats supportés par votre serveur. 8 | | Vous ne pouvez définir de GML 3.2 + compte tenu d'un  9 | | `bug `__  connu d'Openlayers. ",text/xml; subtype=gml/3.1.1 10 | param ,"| Objet contenant les paramètres supplémentaires à envoyer au service lors de l'appel 11 | | de la storedqueries. 12 | | Le paramètre 'limit' peut aussi y être utilisé pour limité le nombre de résultat de recherche. ", 13 | resultTitle ,Nom de l'attribut à utiliser pour le titre du résultat. , 14 | searchUrl ,Url du service ,https://ws.mapserver.transports.gouv.qc.ca/swtq 15 | **storedquery_id*** ,Nom de la requête à demander au serveur. , 16 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/map-overlay.interface.ts: -------------------------------------------------------------------------------- 1 | import { Media } from '@igo2/core/media'; 2 | 3 | import { MapOverlayCssClass } from './map-overlay.enum'; 4 | 5 | export interface MapOverlay { 6 | /** 7 | * Media device to display the mapOverlay 8 | * Desktop is the default value. 9 | */ 10 | media: Media[]; 11 | /** 12 | * Css class to define position of the element 13 | */ 14 | cssClass: MapOverlayCssClass; 15 | fixed?: boolean; // Is element is fixed, won't be affect by animation, default to false 16 | link?: string; // Link to open when element is clicked 17 | imgSrc?: string; // source of the image to show 18 | imgSize?: string; // Size of the image 19 | text?: string; // text to show before image 20 | fontSize?: string; // Font size to display text 21 | alt?: string; // alternate text for an image if the image cannot be displayed 22 | marginLeft?: string; // Margin to add to the left of the element 23 | marginRight?: string; // Margin to add to the right of the element 24 | marginTop?: string; // Margin to add to the top of the element 25 | marginBottom?: string; // Margin to add to the bottom of the element 26 | } 27 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/context-summary.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Descriptions,Outil lié 2 | `base`_ ,string ,"| Identification du nom du ficher de base dont 3 | | les contextes peuvent hériter du contenu. ","| Map 4 | | MapDetails 5 | | MapLegend 6 | | Maptools" 7 | **layers*** ,:ref:`layer[] ` ,"| Liste des couches d'informations  8 | | disponibles pour le contexte sélectionné. ","| Map 9 | | MapDetails 10 | | MapLegend 11 | | Maptools" 12 | **map*** ,`map`_ ,"| Définition de la carte lors de l'ouverture 13 | | initiale du contexte ", 14 | message ,`Message`_ ,Propriété qui n'est plus favorisée. Il vous est suggéré d'utiliser 'messages' , 15 | messages,`Message`_ [] ,Présentation d'une liste des messages à l'ouverture du contexte. , 16 | `toolbar`_ ,String[] ,"| Liste des outils disponibles dans 17 | | l'application. L'ordre dans la 18 | | liste correspond à l'ordre 19 | | d'apparition des outils dans IGO2. ",Tous 20 | `tools`_ ,Objet[] ,Liste des configurations des outils présentes dans l'application. ,Tous 21 | "| **uri***      22 | | Voir `uri`_ ",string ,"| Nom ou identifiant du contexte.  23 | | Doit être uniqueau sein de la même application. ","| Map 24 | | ShareMap " 25 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/auth.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | url,String,Définit l'url d'appel du service d'authentification,, 3 | **tokenKey***,String,Définit la clef de l'api d'authentification utilisée,, 4 | allowAnonymous,Boolean,"| Permet/Bloque l'accès aux usagers non authentifiés 5 | | d'accéder aux contextes publics ",true | false,true 6 | hostsWithCredentials,{}[] (liste d'objet),"| Indique à l'application, la liste des domaines a être interceptés 7 | | et à y ajouter dans l'appel. 8 | | ""withCredentials"": true/false selon la valeur définie.exemple:  9 | | [{ 10 | | withCredentials: true, 11 | | domainRegFilters: '(https:\/\/|http:\/\/)(.*domain.com)(.*)' 12 | | }] ",, 13 | hostsByKey,{}[] (liste d'objet),"| Indique à l'application, la liste des domaines a être interceptés 14 | | et à y ajouter dans l'appel la clé/valeur en paramètres. 15 | | ""withCredentials"": true/false selon la valeur définie.exemple:  16 | | [{ 17 | | keyProperty: 'theNameOfYourKey’, 18 | | keyValue: 'theValueOfYourKey’, 19 | | domainRegFilters: '(https:\/\/|http:\/\/)(.*domain.com)(.*)' 20 | | }] ",, 21 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/tools.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **name*** ,String,Le nom de l'outil ,"| - :ref:`about ` 3 | | - :ref:`catalog ` 4 | | - :ref:`catalogBrowser ` 5 | | - :ref:`contextManager ` 6 | | - :ref:`directions ` 7 | | - :ref:`activeOgcFilter ` 8 | | - :ref:`ogcFilter ` 9 | | - :ref:`activeTimeFilter ` 10 | | - :ref:`timeFilter ` 11 | | - :ref:`spatialFilter ` 12 | | - :ref:`importExport ` 13 | | - :ref:`mapTool ` 14 | | - :ref:`mapLegend ` 15 | | - :ref:`mapDetails ` 16 | | - :ref:`mapTools ` 17 | | - :ref:`measurer ` 18 | | - :ref:`print ` 19 | | - :ref:`searchResults ` 20 | | - :ref:`spatialFilter ` 21 | | - :ref:`shareMap ` ", 22 | title ,String,"| Le titre affiché dans l'application. Sujet aux traductions. 23 | | Si vous modifiez le titre par défaut, vous devez ajouter 24 | | ce titre dans les langues supportées par IGO2 (fr-en). 25 | |     - fichiers dans `Language`_ ",,Référer vous à l'outil désiré. 26 | -------------------------------------------------------------------------------- /src/app/pages/header/header.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, inject } from '@angular/core'; 2 | import { MatToolbarModule } from '@angular/material/toolbar'; 3 | 4 | import { ConfigService } from '@igo2/core/config'; 5 | import { LanguageService } from '@igo2/core/language'; 6 | 7 | import { TranslateModule } from '@ngx-translate/core'; 8 | 9 | @Component({ 10 | selector: 'app-header', 11 | templateUrl: './header.component.html', 12 | styleUrls: ['./header.component.scss'], 13 | imports: [MatToolbarModule, TranslateModule] 14 | }) 15 | export class HeaderComponent { 16 | private configService = inject(ConfigService); 17 | protected languageService = inject(LanguageService); 18 | 19 | public headerLogo: string; 20 | public headerLogoPrint: string; 21 | 22 | constructor() { 23 | this.computeHeader(); 24 | } 25 | 26 | computeHeader() { 27 | this.headerLogo = this.configService.getConfig('header.logo'); 28 | this.headerLogoPrint = this.configService.getConfig('header.logoPrint'); 29 | } 30 | 31 | // Future translation system 32 | /*changeLanguage() { 33 | if (this.languageService.getLanguage() === 'fr'){ 34 | this.languageService.setLanguage('en'); 35 | } else { 36 | this.languageService.setLanguage('fr'); 37 | } 38 | }*/ 39 | } 40 | -------------------------------------------------------------------------------- /scripts/src/update-version.mts: -------------------------------------------------------------------------------- 1 | import { $ } from 'execa'; 2 | import { readFileSync } from 'node:fs'; 3 | import { writeFile } from 'node:fs/promises'; 4 | 5 | import { resolveRoot } from './core/paths.mts'; 6 | import { executor } from './utils/executor.mts'; 7 | import * as log from './utils/log.mts'; 8 | 9 | executor('Update version', async () => { 10 | const [_nodePath, _scriptPath, version] = process.argv; 11 | if (!version) { 12 | return; 13 | } 14 | 15 | await updateVersionFile(version); 16 | 17 | // Regenerate the package-lock.json with the latest version 18 | await $({ stdio: 'inherit', shell: true })`npm i --package-lock-only`; 19 | }); 20 | 21 | async function updateVersionFile(version: string): Promise { 22 | const filePath = resolveRoot('src/environments/version.ts'); 23 | 24 | let body = readFileSync(filePath, 'utf-8'); 25 | body = body.replace(/app: '[A-Za-z0-9\.\-]+'/g, `app: '${version}'`); 26 | body = body.replace( 27 | /releaseDateApp: [0-9]+/g, 28 | `releaseDateApp: ${Date.now()}` 29 | ); 30 | 31 | try { 32 | await writeFile(filePath, body, { flag: 'w' }); 33 | log.success(`Update version ${version} to the 'version.ts' file`); 34 | } catch (error: any) { 35 | log.error(error); 36 | process.exit(1); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/edition.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **name*** ,String,Nom de l'attribut ,, 3 | enabled ,Boolean ,Activer ou non la table d'édition sur la couche. ,true/false ,false 4 | baseUrl ,String ,Url de base du service à appeler. 5 | addUrl ,String ,Url d'appel pour l'ajout d'une entité. 6 | deleteUrl ,String ,Url d'appel pour la suppression d'une entité (par le champ primaire). 7 | modifyUrl ,String ,Url d'appel pour la modification d'une entité(par le champ primaire). 8 | geomType ,String ,Géométrie de la couche (Point/Ligne/Polygone). 9 | addWithDraw ,Boolean ,Activer ou non le dession lors de l'ajout de l'entité. ,true/false ,false 10 | messages ,Object[] ,Personnaliser les messages affichés à l'utilisateur. 11 | addHeaders ,Object ,Personnaliser les headers de l'appel fait à l'ajout 12 | modifyProtocole ,String ,Personnaliser le protocole d'appel fait la modification ,,patch 13 | modifyHeaders ,Object ,Personnaliser les headers de l'appel fait à la modification 14 | addButton ,Boolean ,Activer ou non le bouton d'ajout sur la couche. ,true/false ,true 15 | modifyButton ,Boolean ,Activer ou non le bouton de modification sur la couche. ,true/false ,true 16 | deleteButton ,Boolean ,Activer ou non le bouton de suppression sur la couche. ,true/false ,true 17 | -------------------------------------------------------------------------------- /src/style/partial/variables.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/core.variables'; 2 | 3 | /*** Generic ***/ 4 | $app-background-color: rgb(255, 255, 255); 5 | $app-icon-button-width: 40px; 6 | 7 | $app-border-width: 1px; 8 | $app-border-style: solid; 9 | $app-border-color: rgba(0, 0, 0, 0.2); 10 | 11 | %border-box { 12 | box-sizing: border-box; 13 | -moz-box-sizing: border-box; 14 | -webkit-box-sizing: border-box; 15 | } 16 | 17 | %bordered-top { 18 | border-top: $app-border-width $app-border-style $app-border-color; 19 | } 20 | 21 | %bordered-bottom { 22 | border-bottom: $app-border-width $app-border-style $app-border-color; 23 | } 24 | 25 | %bordered-left { 26 | border-left: $app-border-width $app-border-style $app-border-color; 27 | } 28 | 29 | %bordered-right { 30 | border-right: $app-border-width $app-border-style $app-border-color; 31 | } 32 | 33 | %box-shadowed { 34 | -moz-box-shadow: 0px 0px 2px 0px #dddddd; 35 | -webkit-box-shadow: 0px 0px 2px 0px #dddddd; 36 | -o-box-shadow: 0px 0px 2px 0px #dddddd; 37 | box-shadow: 0px 0px 2px 0px #dddddd; 38 | } 39 | 40 | %box-shadowed-bottom-right { 41 | -moz-box-shadow: 2px 2px 2px 0px #dddddd; 42 | -webkit-box-shadow: 2px 2px 2px 0px #dddddd; 43 | -o-box-shadow: 2px 2px 2px 0px #dddddd; 44 | box-shadow: 2px 2px 2px 0px #dddddd; 45 | } 46 | -------------------------------------------------------------------------------- /src/environments/environnement.interface.ts: -------------------------------------------------------------------------------- 1 | import { AllEnvironmentOptions } from '@igo2/integration'; 2 | import { EnvironmentOptions as IntegrationEnvironmentOptions } from '@igo2/integration'; 3 | 4 | import { MapOverlay } from 'src/app/pages/portal/map-overlay/map-overlay.interface'; 5 | 6 | export interface AppEnvironmentOptions extends IntegrationEnvironmentOptions { 7 | igo: EnvironmentOptions; 8 | } 9 | 10 | export interface EnvironmentOptions extends AllEnvironmentOptions { 11 | header?: { 12 | hasHeader?: boolean; 13 | logo?: string; 14 | logoPrint?: string; 15 | }; 16 | hasFooter?: boolean; 17 | title?: string; 18 | theme?: string; // enum? 19 | sidenavTitle?: string; 20 | description?: string; 21 | favoriteContext4NonAuthenticated?: boolean; 22 | mapOverlay?: MapOverlay[]; 23 | queryTabs?: boolean; 24 | welcomeWindow?: { 25 | discoverTitleInLocale?: string; 26 | nbVisitToShow?: number; 27 | nbVisitToShowAgain?: number; 28 | showAgainOnNewIGOVersion?: boolean; 29 | }; 30 | hasExpansionPanel?: boolean; 31 | showRotationButtonIfNoRotation?: boolean; 32 | offlineButton?: boolean; 33 | wakeLockApiButton?: boolean; 34 | hasFeatureEmphasisOnSelection?: boolean; 35 | hasSearchPointerSummary?: boolean; 36 | allowResetSearchSourcesOptions?: boolean; 37 | } 38 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/map-view.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | enableRotation ,Boolean,"| Définir si, lors de l'utilisation en mobile, on peut tourner 3 | | la carte et de cette facon ne plus avoir le nord en haut. ",true | false,true 4 | projection ,String ,Indique la projection de la carte en indiquant le code EPSG. ,, 5 | center ,Array [] ,"| Coordonnée du positionnement du centre de la carte lors de  6 | | l'arrivée dans le contexte. ",, 7 | zoom ,Number,"| Indique le niveau de zoom de la carte lors de  8 | | l'arrivée dans le contexte. ",, 9 | homeExtentButtonExtent ,String,"| Coordonnées de l'étendue de la carte lorsque l'utilisateur 10 | | clique sur le bouton homeExtent. ","MINX | MINY | MAXX | MAXY", 11 | geolocate ,Boolean,"| Indique si la carte est zommée sur la localisation de l'utilisateur  12 | | lors de l'arrivée dans le contexte. ",true | false,true 13 | maxZoomOnExtent ,Number,"| Indique le niveau de zoom qu'aura l'application lors d'un clic  14 | | sur un résultat de recherche qui n'est pas une couche. ",, 15 | maxLayerZoomExtent ,Array [] ,"| Indique l'étendue maximale considérée comme étant valide pour un cadrage 16 | | lors du calcul de l'étendue d'une ou plusieurs couches. Les coordonnées 17 | | minimales et maximales doivent être compatibles avec la projection donnée. ",, 18 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/mvt.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **type*** ,String ,,mvt ,mvt 3 | **url*** ,String ,"| L'URL du service de données tuilées en spécifiant la position 4 | | des tuiles en déclarant les balises de remplacement: 5 | | - {x} 6 | | - {-y} 7 | | - {z} 8 | | X et Y représentent la position de la tuile appelée 9 | | tandis que le Z, le zoom. ",, 10 | excludeAttribute ,String [],"| Liste des attributs exclus du getInfo lorsque l'application 11 | | est en ligne. ",, 12 | excludeAttributeOffline,String [],"| Liste des attributs exclus du getInfo lorsque l'application 13 | | est hors-ligne.",, 14 | featureClass ,String ,"| Définir cette option en tant que 'feature' pour obtenir 15 | | une prise en charge complète de l'édition 16 | | et de la géométrie des tuiles. 17 | | Cette option diminue les performances de rendu des tuiles. 18 | | Ne pas utiliser cette option pour 19 | | optimiser le rendu des tuiles. ",feature , 20 | queryLayerFeatures ,Boolean ,Définit si les entitées vectorielles de la couche seront interrogées ,true | false, true 21 | queryUrl ,String , "| Paramètres possibles dans l'url: 22 | | {ymin}, {xmax}, {ymax}, {xmin}, {x}, {y}, {resolution}, {srid}", "| Exemple: 23 | | ""queryUrl"": ""https://mapserver.com/test?x={x}&y={y}"" ", Null si non défini 24 | -------------------------------------------------------------------------------- /e2e/support/component.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/component.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | // Import commands.js using ES2015 syntax: 16 | // Alternatively you can use CommonJS syntax: 17 | // require('./commands') 18 | import { mount } from 'cypress/angular'; 19 | 20 | import './commands'; 21 | 22 | // Augment the Cypress namespace to include type definitions for 23 | // your custom command. 24 | // Alternatively, can be defined in cypress/support/component.d.ts 25 | // with a at the top of your spec. 26 | declare global { 27 | // eslint-disable-next-line @typescript-eslint/no-namespace 28 | namespace Cypress { 29 | interface Chainable { 30 | mount: typeof mount; 31 | } 32 | } 33 | } 34 | 35 | Cypress.Commands.add('mount', mount); 36 | 37 | // Example use: 38 | // cy.mount(MyComponent) 39 | -------------------------------------------------------------------------------- /src/contexts/_default.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "_default", 3 | "base": "_base", 4 | "layers": [ 5 | { 6 | "title": "MSP DESSERTE MUN 911", 7 | "sourceOptions": { 8 | "type": "wms", 9 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 10 | "params": { 11 | "layers": "MSP_DESSERTE_MUN_911", 12 | "version": "1.3.0" 13 | }, 14 | "queryable": false, 15 | "queryFormat": "gml2", 16 | "queryTitle": "Municipalite" 17 | } 18 | }, 19 | { 20 | "title": "MSP Tel. Urgence", 21 | "sourceOptions": { 22 | "type": "wms", 23 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 24 | "params": { 25 | "layers": "telephone_urg", 26 | "version": "1.3.0" 27 | }, 28 | "queryable": true, 29 | "queryFormat": "gml2", 30 | "queryTitle": "desclocal" 31 | } 32 | }, 33 | { 34 | "title": "Établissements MTQ", 35 | "sourceOptions": { 36 | "type": "wms", 37 | "url": "https://ws.mapserver.transports.gouv.qc.ca/swtq", 38 | "params": { 39 | "layers": "etablissement_mtq", 40 | "version": "1.3.0" 41 | }, 42 | "queryable": true, 43 | "queryFormat": "gml2", 44 | "queryTitle": "nometablis" 45 | } 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /ngsw-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/service-worker/config/schema.json", 3 | "index": "/index.html", 4 | "appData": { 5 | "changelog": "Version update", 6 | "version": "16.3.0" 7 | }, 8 | "assetGroups": [ 9 | { 10 | "name": "data", 11 | "installMode": "prefetch", 12 | "updateMode": "prefetch", 13 | "resources": { 14 | "files": [ 15 | "/data/**" 16 | ] 17 | } 18 | }, 19 | { 20 | "name": "contexts", 21 | "installMode": "prefetch", 22 | "updateMode": "prefetch", 23 | "resources": { 24 | "files": [ 25 | "/contexts/**" 26 | ] 27 | } 28 | }, 29 | { 30 | "name": "app", 31 | "installMode": "prefetch", 32 | "updateMode": "prefetch", 33 | "resources": { 34 | "files": [ 35 | "/favicon.ico", 36 | "/index.html", 37 | "/manifest.webmanifest", 38 | "/*.css", 39 | "/*.js", 40 | "/locale/**", 41 | "/config/**" 42 | ] 43 | } 44 | }, { 45 | "name": "assets", 46 | "installMode": "prefetch", 47 | "updateMode": "prefetch", 48 | "resources": { 49 | "files": [ 50 | "/assets/**", 51 | "/*.(pdf|eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" 52 | ] 53 | } 54 | } 55 | ] 56 | } 57 | -------------------------------------------------------------------------------- /scripts/src/utils/log.mts: -------------------------------------------------------------------------------- 1 | /** 2 | * Source: https://github.com/ng-packagr/ng-packagr/blob/ee4fd635a626e1ee2266b05cb572002bb09b4849/src/lib/utils/log.ts 3 | */ 4 | /* eslint-disable no-console */ 5 | import { colors } from './color.mts'; 6 | 7 | export const error = (err: string | Error) => { 8 | if (err instanceof Error) { 9 | console.error(colors.red('ERROR: ' + err.message)); 10 | 11 | if (process.env.DEBUG) { 12 | console.error(colors.red(err.stack ?? '') + '\n'); 13 | } 14 | } else { 15 | console.error(colors.red(err)); 16 | } 17 | }; 18 | 19 | export const warn = (msg: string) => { 20 | console.warn(colors.yellow('WARNING: ' + msg)); 21 | }; 22 | 23 | export const success = (msg: string) => { 24 | console.log(colors.green(msg)); 25 | }; 26 | 27 | export const info = (msg: string) => { 28 | console.log(colors.blue(msg)); 29 | }; 30 | 31 | export const msg = (msg: string) => { 32 | console.log(colors.white(msg)); 33 | }; 34 | 35 | export const debug = (msg: string) => { 36 | if (process.env.DEBUG) { 37 | console.log(colors.inverse.cyan(`[debug] ${msg}`)); 38 | } 39 | }; 40 | 41 | export const startMsg = (message: string) => { 42 | msg( 43 | '\n------------------------------------------------------------------------------' 44 | ); 45 | msg(message); 46 | msg( 47 | '------------------------------------------------------------------------------' 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /.github/workflows/deploy-demo.yml: -------------------------------------------------------------------------------- 1 | name: Deploy demo 2 | 3 | on: 4 | workflow_call: 5 | 6 | # Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages 7 | permissions: 8 | contents: read 9 | pages: write 10 | id-token: write 11 | 12 | concurrency: 13 | group: 'pages' 14 | cancel-in-progress: false 15 | 16 | jobs: 17 | build: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | - name: Set up Node 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: 24 26 | cache: 'npm' 27 | - name: Setup Pages 28 | uses: actions/configure-pages@v5 29 | - name: Install dependencies 30 | run: npm ci 31 | - name: Build 32 | run: npm run build.github -- --base-href /${{ github.event.repository.name }}/ 33 | - name: SPA routing 34 | run: cp ./dist/ghpages/browser/index.html ./dist/ghpages/browser/404.html 35 | - name: Upload artifact 36 | uses: actions/upload-pages-artifact@v3 37 | with: 38 | path: './dist/ghpages/browser' 39 | 40 | deploy: 41 | environment: 42 | name: github-pages 43 | url: ${{ steps.deployment.outputs.page_url }} 44 | runs-on: ubuntu-latest 45 | needs: build 46 | steps: 47 | - name: Deploy to GitHub Pages 48 | id: deployment 49 | uses: actions/deploy-pages@v4 50 | -------------------------------------------------------------------------------- /src/app/pages/portal/sidenav/sidenav.component.html: -------------------------------------------------------------------------------- 1 | 7 |
8 |
13 | @if (toolbox.activeTool$ | async) { 14 | 15 | 16 | } 17 | 18 | 19 | @if (toolbox.activeTool$ | async) { 20 | 30 | } 31 | 32 | 38 | 39 | 40 |
41 |
42 | 48 |
49 | -------------------------------------------------------------------------------- /src/contexts/simple2.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "simple2", 3 | "title": "Protection de la Faune", 4 | "base": "_base", 5 | "message": { 6 | "title": "Info", 7 | "text": "welcome", 8 | "type": "info", 9 | "options": { 10 | "timeOut": 20000 11 | } 12 | }, 13 | "layers": [ 14 | { 15 | "zIndex": 8, 16 | "title": "Directions régionales de la Protection de la faune", 17 | "visible": true, 18 | "sourceOptions": { 19 | "crossOrigin": "anonymous", 20 | "queryable": true, 21 | "queryFormat": "gml", 22 | "optionsFromCapabilities": false, 23 | "url": "https://servicesvecto3.mern.gouv.qc.ca/geoserver/SmartFaunePub/ows?", 24 | "params": { 25 | "layers": "LIMITE_REGIONS_PFQ", 26 | "version": "1.3.0" 27 | }, 28 | "type": "wms" 29 | } 30 | }, 31 | { 32 | "zIndex": 9, 33 | "title": "Bureaux de la Protection de la faune du Québec", 34 | "visible": true, 35 | "sourceOptions": { 36 | "crossOrigin": "anonymous", 37 | "queryable": true, 38 | "queryFormat": "gml", 39 | "url": "https://servicesvecto3.mern.gouv.qc.ca/geoserver/SmartFaunePub/ows?", 40 | "optionsFromCapabilities": false, 41 | "params": { 42 | "layers": "Bureaux_protection_faune", 43 | "version": "1.3.0" 44 | }, 45 | "type": "wms" 46 | } 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /docs/_tables/fr/interactiveTour/interactiveTourStep.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | beforeChange ,InteractiveTourAction ,"| Déclenchement avant le changement de boite. Attends avant de passer à 3 | | l'étape suivante (en combinaison de waitFor qui prend du css)",, 4 | beforeShow ,InteractiveTourAction ,"| Déclenchement avant l'apparition de la boite. Attends avant d'ouvrir l'étape  5 | | (en combinaison de waitFor qui prend du css) ",, 6 | disableInteraction ,Boolean,Permet ou non à l'utilisateur de cliquer sur l'éléments du step en surbrillance ,true | false ,true 7 | element ,String,Elément HTML à mettre en surbrillance. NB.: doit être visible lors du déclanchement ,, 8 | highlightClass ,String,Définit la classe à appliquer aux éléments en surbrillance ,, 9 | noBackButton ,Boolean,Définit si le step aura un bouton précédent,, 10 | onHide ,InteractiveTourAction ,Déclenchement lorsque la boite disparait ,, 11 | onShow ,InteractiveTourAction ,Déclenchement lors de l'apparition de la boite ,, 12 | position ,String,Définit la position des boites aide ,"'auto', 'right', 'left', 'bottom', 'top'.      ","| NB.: Si la propriété position n'est pas présente,  13 | | les boites seront disposées au centre de l'écran " 14 | scrollToElement ,Boolean,Indique si on défile la page sur l'élément en surbrillance ,true | false , 15 | text ,String,Le texte inscrit dans la boite d'aide. On peut y mettre du html. NB.: voir traduction ,, 16 | title ,String,Le titre de la boite d'aide ,, 17 | -------------------------------------------------------------------------------- /src/app/pages/portal/toast-panel-for-expansion/toast-panel-for-expansion.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | Component, 4 | EventEmitter, 5 | HostBinding, 6 | Input, 7 | Output 8 | } from '@angular/core'; 9 | 10 | import { PanelComponent } from '@igo2/common/panel'; 11 | 12 | import { showContent } from './toast-panel-for-expansion.animations'; 13 | 14 | @Component({ 15 | selector: 'app-toast-panel-for-expansion', 16 | templateUrl: './toast-panel-for-expansion.component.html', 17 | styleUrls: ['./toast-panel-for-expansion.component.scss'], 18 | animations: [showContent()], 19 | changeDetection: ChangeDetectionStrategy.OnPush, 20 | imports: [PanelComponent] 21 | }) 22 | export class ToastPanelForExpansionComponent { 23 | @Input() 24 | set opened(value: boolean) { 25 | if (value === this._opened) { 26 | return; 27 | } 28 | this._opened = value; 29 | this.openedChange.emit(this._opened); 30 | } 31 | get opened(): boolean { 32 | return this._opened; 33 | } 34 | private _opened: boolean; 35 | 36 | @Input() title: string; 37 | 38 | @Input() withHeader: boolean; 39 | 40 | @Output() openedChange = new EventEmitter(); 41 | 42 | @HostBinding('class.toast-panel-for-expansion-opened') 43 | get hasOpenedClass() { 44 | return this.opened; 45 | } 46 | 47 | @HostBinding('style.visibility') 48 | get displayStyle() { 49 | return this.withHeader || this.opened ? 'visible' : 'hidden'; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/contexts/_contexts.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "uri": "_default", 4 | "title": "Simple" 5 | }, 6 | { 7 | "uri": "messages", 8 | "title": "Messages" 9 | }, 10 | { 11 | "uri": "timeFilter", 12 | "title": "Filtre temporel (Time filter)" 13 | }, 14 | { 15 | "uri": "ogcFilters", 16 | "title": "Filtre attributaire (Attribute filter)" 17 | }, 18 | { 19 | "uri": "layerSync", 20 | "title": "Synchronisation de layers" 21 | }, 22 | { 23 | "uri": "workspace", 24 | "title": "Workspace (vue tabulaire)" 25 | }, 26 | { 27 | "uri": "mapOverlay", 28 | "title": "Superposition de carte (Map overlay)" 29 | }, 30 | { 31 | "uri": "testExport", 32 | "title": "Test export" 33 | }, 34 | { 35 | "uri": "variousFormats", 36 | "title": "Divers format à titre d'exemple" 37 | }, 38 | { 39 | "uri": "variousStyles", 40 | "title": "Divers styles à titre d'exemple" 41 | }, 42 | { 43 | "uri": "legends", 44 | "title": "Exemples de légendes" 45 | }, 46 | { 47 | "uri": "homeExtent", 48 | "title": "Étendue de la carte(Home Extent)" 49 | }, 50 | { 51 | "uri": "geolocation", 52 | "title": "Geolocation" 53 | }, 54 | { 55 | "uri": "addLayerFromIndex", 56 | "title": "Ajout de couche à partir d'un index" 57 | }, 58 | { 59 | "uri": "keepCurrentViewFalse", 60 | "title": "Un contexte qui impose sa vue" 61 | }, 62 | { 63 | "uri": "layerGroup", 64 | "title": "Group de couche" 65 | } 66 | ] 67 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/workspaceOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | enabled ,Boolean ,Définir si la couche aura ou non une table d'attributs. ,true | false ,"| Pour les sources vectorielles, true par défault. 3 | | Pour les wms avec des propriétés 4 | | WFS associées, false par défault" 5 | minResolution ,Number ,"| Indique la résolution minimale (grande échelle, très zoomé) 6 | | à laquelle la table d'attribut pourra faire apparaître des 7 | | enregistrements. ",0 à Infinity ou absent , 8 | maxResolution ,Number ,"| Indique la résolution maximale (petite échelle,peu zoomé) 9 | | à laquelle la table d'attribut pourra faire apparaître des 10 | | enregistrements. ",0 à Infinity ou absent , 11 | queryOptions , Object{} , "mapQueryOnOpenTab: Boolean. 12 | | Indique si les info seront présentés sur clic dans la map lorsque la table attribut est ouverte 13 | | tabQuery: Boolean. 14 | | Indique si les info seront présentés sur clic dans la table d'attribut", True, True , 15 | pageSize ,Number,"| Indique le nombre d'entités maximum à faire apparaître dans 16 | | une seule page de la table d'attribut.",1 à [...] ou absent 17 | | (par défaut = 50) , 18 | pageSizeOptions ,Number[],"| Indique les possibilités de changement du nombre 19 | | d'entités pouvant être affichés sur une seule page (pageSize)." 20 | | ,0 à Infinity ou absent 21 | | (par défaut = 1, 5, 10, 20, 50, 100, 500), 22 | searchIndexEnabled ,boolean,"| Indique si oui ou non, la couche devrait etre indexée (cherchable) 23 | | ,true/false 24 | | false 25 | -------------------------------------------------------------------------------- /e2e/support/commands.ts: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example namespace declaration will help 3 | // with Intellisense and code completion in your 4 | // IDE or Text Editor. 5 | // *********************************************** 6 | // declare namespace Cypress { 7 | // interface Chainable { 8 | // customCommand(param: any): typeof customCommand; 9 | // } 10 | // } 11 | // 12 | // function customCommand(param: any): void { 13 | // console.warn(param); 14 | // } 15 | // 16 | // NOTE: You can use it like so: 17 | // Cypress.Commands.add('customCommand', customCommand); 18 | // 19 | // *********************************************** 20 | // This example commands.js shows you how to 21 | // create various custom commands and overwrite 22 | // existing commands. 23 | // 24 | // For more comprehensive examples of custom 25 | // commands please read more here: 26 | // https://on.cypress.io/custom-commands 27 | // *********************************************** 28 | // 29 | // 30 | // -- This is a parent command -- 31 | // Cypress.Commands.add("login", (email, password) => { ... }) 32 | // 33 | // 34 | // -- This is a child command -- 35 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 36 | // 37 | // 38 | // -- This is a dual command -- 39 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 40 | // 41 | // 42 | // -- This will overwrite an existing command -- 43 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 44 | -------------------------------------------------------------------------------- /scripts/src/utils/color.mts: -------------------------------------------------------------------------------- 1 | /** 2 | * Source: https://github.com/ng-packagr/ng-packagr/blob/ee4fd635a626e1ee2266b05cb572002bb09b4849/src/lib/utils/color.ts 3 | */ 4 | import * as ansiColors from 'ansi-colors'; 5 | import { WriteStream } from 'tty'; 6 | 7 | type AnsiColors = typeof ansiColors; 8 | 9 | function supportColor(): boolean { 10 | if (process.env.FORCE_COLOR !== undefined) { 11 | // 2 colors: FORCE_COLOR = 0 (Disables colors), depth 1 12 | // 16 colors: FORCE_COLOR = 1, depth 4 13 | // 256 colors: FORCE_COLOR = 2, depth 8 14 | // 16,777,216 colors: FORCE_COLOR = 3, depth 16 15 | // See: https://nodejs.org/dist/latest-v12.x/docs/api/tty.html#tty_writestream_getcolordepth_env 16 | // and https://github.com/nodejs/node/blob/b9f36062d7b5c5039498e98d2f2c180dca2a7065/lib/internal/tty.js#L106; 17 | switch (process.env.FORCE_COLOR) { 18 | case '': 19 | case 'true': 20 | case '1': 21 | case '2': 22 | case '3': 23 | return true; 24 | default: 25 | return false; 26 | } 27 | } 28 | 29 | if (process.stdout instanceof WriteStream) { 30 | return process.stdout.getColorDepth() > 1; 31 | } 32 | 33 | return false; 34 | } 35 | 36 | // Create a separate instance to prevent unintended global changes to the color configuration 37 | // Create function is not defined in the typings. See: https://github.com/doowb/ansi-colors/pull/44 38 | const colors = ( 39 | ansiColors as AnsiColors & { create: () => AnsiColors } 40 | ).create(); 41 | colors.enabled = supportColor(); 42 | 43 | export { colors }; 44 | -------------------------------------------------------------------------------- /src/app/pages/header/header.component.html: -------------------------------------------------------------------------------- 1 | 41 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | @use '@angular/material' as mat; 2 | @use '@igo2/core/all-style'; 3 | @use '@igo2/core/layout'; 4 | 5 | @use 'style/reset.scss'; 6 | @use 'style/theme.scss'; 7 | 8 | :root { 9 | --sidenav-width: 400px; 10 | } 11 | 12 | html { 13 | font-size: 14px; 14 | } 15 | 16 | body { 17 | font-family: var(--igo-font-family-text); 18 | } 19 | 20 | .material-symbols-outlined { 21 | font-variation-settings: 22 | 'FILL' 1, 23 | 'wght' 400, 24 | 'GRAD' 0, 25 | 'opsz' 24; 26 | } 27 | 28 | igo-home-button, 29 | igo-menu-button, 30 | igo-search-bar { 31 | @include mat.icon-button-overrides( 32 | ( 33 | state-layer-size: 48px 34 | ) 35 | ); 36 | } 37 | 38 | igo-context-item { 39 | @include mat.list-overrides( 40 | ( 41 | list-item-one-line-container-height: 48px 42 | ) 43 | ); 44 | } 45 | 46 | .toast-title-red { 47 | color: red; 48 | font-size: 22px; 49 | font-weight: bold; 50 | } 51 | 52 | .toast-message-gray { 53 | color: rgb(68, 69, 70); 54 | } 55 | .toast-message-green-div { 56 | color: rgb(35, 85, 20); 57 | } 58 | 59 | .toast-message-ul-pad-inline-start-9prc { 60 | padding-inline-start: 9%; 61 | } 62 | 63 | .toast-message-a-blue { 64 | color: blue !important; 65 | text-decoration: underline; 66 | text-decoration-color: blue; 67 | } 68 | 69 | .toast-message-a-blue:hover { 70 | text-decoration: underline !important; 71 | } 72 | 73 | .mat-elevation-z2 { 74 | box-shadow: var(--mat-sys-level2); 75 | } 76 | 77 | // SDG overrides 78 | h1 { 79 | &:after { 80 | content: none !important; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/importExportOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | selectFirstProj ,Boolean ,Permet de controler si la première projection rencontrée dans la liste sera sélectionnée. ,true / false ,false 3 | projectionsLimitations ,Objet,Permet de controler la liste des projections disponible dans l'outil. ,"| { 4 | | ""projFromConfig"": true, // Utiliser les projections définies dans la configuration 5 | | ""nad83"": true, // Utiliser le NAD83 6 | | ""wgs84"": true, // Utiliser le WGS84 7 | | ""webMercator"": true, // Utiliser le WebMercator (EPSG:3857) 8 | | ""utm"": true, // Utiliser les projections UTM 9 | | ""mtm"": true, // Utiliser les projections MTM 10 | | ""utmZone"": { 11 | | ""minZone"": 17, // Zone minimale UTM 12 | | ""maxZone"": 21 // Zone maximale UTM 13 | | }, 14 | | ""mtmZone"": { 15 | ""| minZone"": 4, // Zone minimale MTM 16 | | ""maxZone"": 10 // Zone maximale MTM 17 | | }}","| { 18 | | ""projFromConfig"": true, 19 | | ""nad83"": true, 20 | | ""wgs84"": true, 21 | | ""webMercator"": true, 22 | | ""utm"": true, 23 | | ""mtm"": true, 24 | | ""utmZone"": { 25 | | ""minZone"": 1, 26 | | ""maxZone"": 60 27 | | }, 28 | | ""mtmZone"": { 29 | ""| minZone"": 1, 30 | | ""maxZone"": 10 31 | | }}" 32 | importExportType ,String ,Définit quel type d'exportation sera ouvert par défaut ,layer ou context ,layer 33 | importExportShowBothType ,Boolean ,"| Permet d'afficher ou non les 2 types d'importation ou exportation  34 | | (layer ou contexte) Si false, le type définit précédemment, sera 35 | | le seul type affiché.Se base sur l'option importExportType.",true / false ,true 36 | -------------------------------------------------------------------------------- /src/app/pages/portal/sidenav/sidenav.component.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/media'; 2 | 3 | @use '../portal.variables' as portal; 4 | 5 | :host { 6 | background-color: rgb(255, 255, 255); 7 | 8 | ::ng-deep { 9 | .igo-panel-header { 10 | position: relative; 11 | } 12 | } 13 | 14 | mat-sidenav { 15 | // This is needed because whe using the 16 | // sidenav "side" mode, the z-index is 1 17 | // and the sidenav appears below our backdrop. 18 | // The "side" mode is required to prevent 19 | // the sidenav from focusing a random button on open. 20 | z-index: 3 !important; 21 | height: 100%; 22 | width: var(--sidenav-width); 23 | box-sizing: content-box; 24 | overflow-y: unset; 25 | 26 | @include media.mobile { 27 | width: portal.$app-sidenav-width-mobile; 28 | max-width: var(--sidenav-width); 29 | } 30 | } 31 | 32 | igo-home-button { 33 | position: absolute; 34 | top: 53px; 35 | } 36 | 37 | .app-content, 38 | igo-panel { 39 | height: 100%; 40 | } 41 | 42 | .app-sidenav-content { 43 | margin-top: portal.$app-sidenav-margin-top; 44 | height: portal.$app-sidenav-height; 45 | @include media.mobile { 46 | height: calc(100% - #{portal.$app-sidenav-margin-top}); 47 | } 48 | } 49 | 50 | igo-panel ::ng-deep .igo-panel-content { 51 | position: relative; 52 | } 53 | 54 | div.toolActivated > igo-panel ::ng-deep > div.igo-panel-header { 55 | margin-left: 50px; 56 | position: relative; 57 | } 58 | 59 | igo-toolbox { 60 | @include media.mobile { 61 | overflow: auto; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | # 4 | 5 | name: Release 6 | on: 7 | push: 8 | branches: 9 | - master 10 | - next 11 | - ^[0-9]+(.[0-9]+)?.x$ 12 | 13 | jobs: 14 | release: 15 | name: Release 16 | runs-on: ubuntu-latest 17 | permissions: 18 | id-token: write # to enable use of OIDC for npm provenance 19 | contents: write 20 | steps: 21 | - uses: actions/checkout@v4 22 | with: 23 | fetch-depth: 0 24 | persist-credentials: false 25 | 26 | - name: Use Node.js 27 | uses: actions/setup-node@v4 28 | with: 29 | node-version: 24 30 | cache: 'npm' 31 | registry-url: 'https://registry.npmjs.org' 32 | 33 | - name: Install dependencies 34 | run: npm ci --include=dev --include=optional --no-audit 35 | 36 | - name: Security 37 | run: npm audit --omit dev && npm audit signatures 38 | 39 | - name: Quality 40 | run: npm run lint.check & npm run format.check 41 | 42 | - name: Test 43 | run: npm run e2e 44 | 45 | - name: Release 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.PAT }} 48 | run: npx semantic-release 49 | 50 | deploy-gh-pages: 51 | name: Deploy demo content to Pages 52 | needs: release 53 | if: github.ref == 'refs/heads/master' 54 | uses: ./.github/workflows/deploy-demo.yml 55 | -------------------------------------------------------------------------------- /src/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "id": "igo2DemoPWA", 3 | "name": "IGO2 - APP", 4 | "short_name": "IGO2", 5 | "description": "IGO2 installable app", 6 | "theme_color": "#1976d2", 7 | "background_color": "#fafafa", 8 | "display": "standalone", 9 | "scope": "./", 10 | "start_url": "./", 11 | "orientation": "any", 12 | "icons": [ 13 | { 14 | "src": "assets/icons/icon-72x72.png", 15 | "sizes": "72x72", 16 | "type": "image/png", 17 | "purpose": "maskable any" 18 | }, 19 | { 20 | "src": "assets/icons/icon-96x96.png", 21 | "sizes": "96x96", 22 | "type": "image/png", 23 | "purpose": "maskable any" 24 | }, 25 | { 26 | "src": "assets/icons/icon-128x128.png", 27 | "sizes": "128x128", 28 | "type": "image/png", 29 | "purpose": "maskable any" 30 | }, 31 | { 32 | "src": "assets/icons/icon-144x144.png", 33 | "sizes": "144x144", 34 | "type": "image/png", 35 | "purpose": "maskable any" 36 | }, 37 | { 38 | "src": "assets/icons/icon-152x152.png", 39 | "sizes": "152x152", 40 | "type": "image/png", 41 | "purpose": "maskable any" 42 | }, 43 | { 44 | "src": "assets/icons/icon-192x192.png", 45 | "sizes": "192x192", 46 | "type": "image/png", 47 | "purpose": "maskable any" 48 | }, 49 | { 50 | "src": "assets/icons/icon-384x384.png", 51 | "sizes": "384x384", 52 | "type": "image/png", 53 | "purpose": "maskable any" 54 | }, 55 | { 56 | "src": "assets/icons/icon-512x512.png", 57 | "sizes": "512x512", 58 | "type": "image/png", 59 | "purpose": "maskable any" 60 | } 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /src/style/breakpoints.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:map'; 2 | 3 | // There is no standard for breakpoints for the Quebec.ca theme 4 | // This is the Material breakpoint design by devices 5 | $device-breakpoints: ( 6 | mobile: ( 7 | max: 599px 8 | ), 9 | tablet: ( 10 | min: 600px, 11 | max: 1239px 12 | ), 13 | laptop: ( 14 | min: 1240px, 15 | max: 1439px 16 | ), 17 | desktop: ( 18 | min: 1440px 19 | ) 20 | ); 21 | 22 | // Source: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_breakpoints.scss 23 | @function breakpoint-min($name, $breakpoints: $device-breakpoints) { 24 | $min: map.get($breakpoints, $name, min); 25 | @return if($min != 0, $min, null); 26 | } 27 | 28 | @function breakpoint-max($name, $breakpoints: $device-breakpoints) { 29 | $max: map.get($breakpoints, $name, max); 30 | @return if($max and $max > 0, $max, null); 31 | } 32 | 33 | // Media of at least the minimum breakpoint width. No query for the smallest breakpoint. 34 | // Makes the @content apply to the given breakpoint and wider. 35 | @mixin media-breakpoint-up($name, $breakpoints: $device-breakpoints) { 36 | $min: breakpoint-min($name, $breakpoints); 37 | @if $min { 38 | @media (min-width: $min) { 39 | @content; 40 | } 41 | } @else { 42 | @content; 43 | } 44 | } 45 | 46 | // Media of at most the maximum breakpoint width. No query for the largest breakpoint. 47 | // Makes the @content apply to the given breakpoint and narrower. 48 | @mixin media-breakpoint-down($name, $breakpoints: $device-breakpoints) { 49 | $max: breakpoint-max($name, $breakpoints); 50 | @if $max { 51 | @media (max-width: $max) { 52 | @content; 53 | } 54 | } @else { 55 | @content; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /docs/template.rst: -------------------------------------------------------------------------------- 1 | 2 | *************** 3 | Chapter title.. 4 | *************** 5 | 6 | Section title.. 7 | =============== 8 | 9 | Subsection title.. 10 | ------------------ 11 | 12 | Subsubsection title.. 13 | ^^^^^^^^^^^^^^^^^^^^^ 14 | 15 | Paragrapth title.. 16 | """""""""""""""""" 17 | 18 | Paragrapth title.. 19 | ****************** 20 | 21 | BLA BLA 22 | 23 | BLA BL 24 | 25 | - l 26 | - k 27 | - l 28 | - l 29 | 30 | 1. A1 31 | 2. A2 32 | 3. A3 33 | 4. A4 34 | 35 | 36 | hasExpansionPanel 37 | ================= 38 | 39 | .. warning:: 40 | 41 | En cours de construction 42 | 43 | .. line-block:: 44 | 45 | Voici ma desc 46 | 47 | Exemples 48 | 49 | .. code:: json 50 | 51 | { 52 | "icon" : "iconName", 53 | "name" : "catalogBrowser", 54 | "title": "TitreOutilQuiDoitEtreTraduit", 55 | "options" : { 56 | "optiona": 2 57 | } 58 | } 59 | 60 | Propriétés 61 | 62 | .. tabularcolumns:: |p{1cm}|p{2cm}|p{7cm}|p{2cm}|p{2cm}| 63 | 64 | .. csv-table:: 65 | :file: _tables/template.csv 66 | :header-rows: 1 67 | :widths: 10 10 30 15 10 68 | 69 | Important : Les propriétés en caractère gras suivis d'un * sont obligatoires. 70 | 71 | Liens 72 | 73 | - `igo2-lib/packages/core/src/style/themes `_ 74 | - `igo2-lib/packages/core/src/style/themes `_ 75 | 76 | 77 | .. image:: https://www.sciencesetavenir.fr/assets/img/2019/09/05/cover-r4x3w1000-5d70cc64ae7b7-000-1jz24y.jpg 78 | -------------------------------------------------------------------------------- /src/config/github.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "id": "igo2DemoGitHub", 3 | "name": "Demo Github - IGO2", 4 | "short_name": "Demo Github - IGO", 5 | "description": "Demo Github - IGO2 installable", 6 | "theme_color": "#1976d2", 7 | "background_color": "#fafafa", 8 | "display": "standalone", 9 | "scope": "../", 10 | "start_url": "../", 11 | "orientation": "any", 12 | "icons": [ 13 | { 14 | "src": "../assets/icons/icon-72x72.png", 15 | "sizes": "72x72", 16 | "type": "image/png", 17 | "purpose": "maskable any" 18 | }, 19 | { 20 | "src": "../assets/icons/icon-96x96.png", 21 | "sizes": "96x96", 22 | "type": "image/png", 23 | "purpose": "maskable any" 24 | }, 25 | { 26 | "src": "../assets/icons/icon-128x128.png", 27 | "sizes": "128x128", 28 | "type": "image/png", 29 | "purpose": "maskable any" 30 | }, 31 | { 32 | "src": "../assets/icons/icon-144x144.png", 33 | "sizes": "144x144", 34 | "type": "image/png", 35 | "purpose": "maskable any" 36 | }, 37 | { 38 | "src": "../assets/icons/icon-152x152.png", 39 | "sizes": "152x152", 40 | "type": "image/png", 41 | "purpose": "maskable any" 42 | }, 43 | { 44 | "src": "../assets/icons/icon-192x192.png", 45 | "sizes": "192x192", 46 | "type": "image/png", 47 | "purpose": "maskable any" 48 | }, 49 | { 50 | "src": "../assets/icons/icon-384x384.png", 51 | "sizes": "384x384", 52 | "type": "image/png", 53 | "purpose": "maskable any" 54 | }, 55 | { 56 | "src": "../assets/icons/icon-512x512.png", 57 | "sizes": "512x512", 58 | "type": "image/png", 59 | "purpose": "maskable any" 60 | } 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sources/wms-params.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **layers*** ,String ,"| Correspond au nom de la couche demandée. 3 | | Vous pouvez appeler plusieurs couches, 4 | | en séparant chacune de celles-ci par une virgule. 5 | | 6 | | IMP:       7 | | - Pour les couches multiples, vous  8 | | ne pourrez récupérer les propriétés 9 | | fournies par les GetCapabilities. 10 | | Vous devez donc fournir les propriétés 11 | | title, max/min Resolution (au besoin). 12 | | 13 | | - Si vous voulez appliquer des filters 14 | | OGC à des couches multiples, elles 15 | | doivent partager le même schéma de 16 | |  données (même champs). ","| Exemple: 17 | | Layers=nomDeLaCouche1 18 | | layers=nomDeLaCouche1,nomDeLaCouche2 ", 19 | version ,String ,Version  de l'appel WMS ,"| 1.1.0  20 | | 1.1.1 21 | | 1.3.0 ",1.3.0 22 | feature_count ,Number,"| Nombre de résultats retournés par le serveur 23 | | lors des appels GetFeatureInfo (clic sur carte)",,5 24 | info_format ,String ,"| Nom spécifique du format d'appel du GetFeatureInfo. 25 | | Nécessaire si vos format d'appels diffèrent des 26 | | noms standards gérés par IGO (décrits précédemment). ",, 27 | dpi ,Number,"| Nombre de points par pouce du résultat 28 | | de l'appel du GetMap. Particulièrement 29 | | utile dans IGO pour effectuer la conversion 30 | | entre la résolution et le nombre échelle. ",,96 31 | map_resolution ,Number,"| Nombre de points par pouce du résultat 32 | | de l'appel du GetMap. Particulièrement 33 | | utile dans IGO pour effectuer la conversion 34 | | entre la résolution et le nombre échelle. ",,96 35 | format_options ,String ,"| Nombre de points par pouce du résultat 36 | | de l'appel du GetMap. Particulièrement 37 | | utile dans IGO pour effectuer la conversion 38 | | entre la résolution et le nombre échelle. ",,dpi:96 39 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, 3 | Component, 4 | EventEmitter, 5 | HostBinding, 6 | Input, 7 | Output 8 | } from '@angular/core'; 9 | 10 | import { BackdropComponent } from '@igo2/common/backdrop'; 11 | 12 | import { ExpansionPanelHeaderComponent } from './expansion-panel-header.component'; 13 | import { showContent } from './expansion-panel.animations'; 14 | 15 | @Component({ 16 | selector: 'app-expansion-panel', 17 | templateUrl: './expansion-panel.component.html', 18 | styleUrls: ['./expansion-panel.component.scss'], 19 | animations: [showContent()], 20 | changeDetection: ChangeDetectionStrategy.OnPush, 21 | imports: [BackdropComponent, ExpansionPanelHeaderComponent] 22 | }) 23 | export class ExpansionPanelComponent { 24 | @Input() 25 | get expanded(): boolean { 26 | return this._expanded; 27 | } 28 | set expanded(value: boolean) { 29 | if (value === this._expanded) { 30 | return; 31 | } 32 | 33 | this._expanded = value; 34 | this.expandedChange.emit(this._expanded); 35 | } 36 | private _expanded: boolean; 37 | 38 | @Input() maximized = false; 39 | 40 | @Input() 41 | get backdropShown(): boolean { 42 | return this._backdropShown; 43 | } 44 | set backdropShown(value: boolean) { 45 | this._backdropShown = value; 46 | } 47 | private _backdropShown: boolean; 48 | 49 | @Output() expandedChange = new EventEmitter(); 50 | 51 | @HostBinding('class.app-expansion-panel-expanded') 52 | get hasExpandedClass() { 53 | return this.expanded; 54 | } 55 | 56 | @HostBinding('class.app-expansion-panel-expanded-maximized') 57 | get hasExpandedFullClass() { 58 | return this.expanded && this.maximized; 59 | } 60 | 61 | onBackdropClick() { 62 | this.expanded = false; 63 | this.backdropShown = false; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/app/pages/portal/portal.variables.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/media'; 2 | @use 'variables'; 3 | @use '@igo2/core/partial/core.variables' as core; 4 | 5 | $app-footer-height: 48px; 6 | $app-mobile-min-space-right: 48px; 7 | 8 | $app-expansion-panel-collapsed-height: 40px; 9 | $app-expansion-panel-collapsed-width: 40px; 10 | $app-expansion-panel-height: 281px; 11 | $app-expansion-panel-height-maximized: 496px; 12 | $app-expansion-panel-header-height: calc( 13 | #{$app-expansion-panel-collapsed-height} + 10px 14 | ); 15 | 16 | $app-toast-panel-collapsed-height: 46px; 17 | $app-toast-panel-collapsed-height-mobile: 35px; 18 | $app-toast-panel-width-tablet: 500px; 19 | 20 | $app-toast-panel-width: 42vw; 21 | $app-toast-panel-max-width: 600px; 22 | $app-toast-panel-height: 30vh; 23 | $app-toast-panel-max-height: 30vh; 24 | $app-toast-panel-height-mobile: 34vh; 25 | 26 | $app-full-toast-panel-width: 45vw; 27 | $app-full-toast-panel-max-height: 65vh; 28 | $app-full-toast-panel-height-mobile: 55vh; 29 | 30 | $app-toast-panel-html-width: 60vw; 31 | $app-toast-panel-html-height: 32vh; 32 | 33 | $app-toast-panel-html-large-height: 55vh; 34 | 35 | $app-sidenav-margin-top: 48px + 5px; // Search bar height + margin-top 36 | $app-sidenav-height: calc(100% - #{$app-sidenav-margin-top}); 37 | $app-sidenav-width-mobile: calc( 38 | 100% - #{$app-mobile-min-space-right} - #{core.$igo-margin} 39 | ); 40 | 41 | $search-bar-left: core.$igo-icon-size + core.$igo-margin; 42 | $search-bar-width: calc(var(--sidenav-width) - #{core.$igo-margin} - 1px); 43 | $search-bar-width-mobile: calc($app-sidenav-width-mobile - core.$igo-margin); 44 | 45 | $app-footer-height: 49px; 46 | $toast-panel-for-expansion-collapsed-height: 48px; 47 | $toast-panel-for-expansion-max-height: 329px; 48 | $toast-panel-for-expansion-width: 30%; 49 | 50 | $header-height: 72px; 51 | $header-height-mobile: 72px; 52 | $footer-height: 29px; 53 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapToolOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | expandLegendOfVisibleLayers ,Boolean ,"À l'ouverture de l'outil, sous l'onglet Carte, déroule (affiche) les légendes des couches visibles. ",true / false ,false 3 | ogcButton ,Boolean ,Permet d'afficher le bouton filtre OGC pour les couches le permettant. ,true / false ,true 4 | queryBadge ,Boolean ,"Sous l'onglet Carte, affiche en superposition à l'oeil de visiblité, un ""?"" pour les couches interrogeable. ",true / false ,false 5 | timeButton ,Boolean ,Permet d'afficher le bouton filtre temporel pour les couches le permettant. ,true / false ,true 6 | toggleLegendOnVisibilityChange ,Boolean ,"| Sous l'onglet Carte, déroule (affiche) les légendes lorsque le statut de visibilité  7 | | d'une couche passe de non-visible à visible ",true / false ,false 8 | updateLegendOnResolutionChange ,Boolean ,Permet de rafraichir la légende à chaque changement de résolution (zoom) ,true / false ,false 9 | layerListControls ,Objet,"| Divers contrôles effectués à la liste de couches affichées dans l'interface. 10 | | ""excludeBaseLayers"" = Retire les couches identifiées comme baseLayer. 11 | | ""showToolbar"" = Outil permettant de contrôler la liste des couche                  12 | | ""always"", ""never"" ou ""default"" = visible si 5 couches et + 13 | | ""keyword"" = Mot clef filtrant la liste de couches 14 | | ""sortAlpha"" = Tri la liste de couches alphabétiquement. 15 | | ""onlyVisible"" = Ne garde que dans la liste de couches, les couches visible.","| ""layerListControls"": { 16 | | ""excludeBaseLayers"": true, 17 | | ""showToolbar"": ""always"", 18 | | ""keyword"": ""allo"", 19 | | ""sortAlpha"": true, 20 | | ""onlyVisible"": true 21 | | }","| ""layerListControls"": { 22 | | ""excludeBaseLayers"": false, 23 | | ""showToolbar"": ""default"", 24 | | ""sortAlpha"": false, 25 | | ""onlyVisible"": false 26 | | }" 27 | -------------------------------------------------------------------------------- /src/app/pages/portal/expansion-panel/expansion-panel.component.scss: -------------------------------------------------------------------------------- 1 | @use '@igo2/core/partial/media'; 2 | @use '@igo2/core/partial/core.variables' as core; 3 | 4 | @use '../portal.variables' as portal; 5 | 6 | :host { 7 | @extend %box-shadowed; 8 | 9 | display: block; 10 | background-color: white; 11 | 12 | height: portal.$app-expansion-panel-collapsed-height; 13 | width: portal.$app-expansion-panel-collapsed-width; 14 | 15 | transition: 16 | height 200ms cubic-bezier(0.4, 0, 0.2, 1), 17 | width 200ms cubic-bezier(0.4, 0, 0.2, 1); 18 | 19 | &:not(.app-expansion-panel-expanded) { 20 | ::ng-deep { 21 | .app-expansion-panel-content { 22 | display: none; 23 | } 24 | } 25 | } 26 | 27 | &.app-expansion-panel-expanded { 28 | height: portal.$app-expansion-panel-height; 29 | width: 100%; 30 | z-index: 6; 31 | 32 | ::ng-deep { 33 | .app-expansion-panel-trigger-container { 34 | box-shadow: none; 35 | } 36 | } 37 | 38 | @include media.mobile { 39 | &.footer { 40 | margin-bottom: 48px; 41 | } 42 | } 43 | } 44 | } 45 | 46 | .app-expansion-panel-container { 47 | height: 100%; 48 | width: 100%; 49 | } 50 | 51 | :host.app-expansion-panel-expanded-maximized { 52 | height: portal.$app-expansion-panel-height-maximized; 53 | width: 100%; 54 | z-index: 6; 55 | 56 | @include media.mobile { 57 | &.footer { 58 | margin-bottom: 48px; 59 | } 60 | } 61 | } 62 | 63 | :host > div { 64 | height: 100%; 65 | width: 100%; 66 | } 67 | 68 | .app-expansion-panel-content { 69 | height: calc(100% - #{portal.$app-expansion-panel-header-height}); 70 | overflow: auto; 71 | padding: core.$igo-padding; 72 | } 73 | 74 | igo-backdrop ::ng-deep > div { 75 | // 120 because material tables use z-index = 110 for sticky headers 76 | z-index: 120 !important; 77 | } 78 | 79 | .app-expansion-panel-content ::ng-deep .igo-entity-table-with-selection { 80 | width: 100%; 81 | } 82 | -------------------------------------------------------------------------------- /src/contexts/timeFilter.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "timeFilter", 3 | "base": "_base", 4 | "layers": [ 5 | { 6 | "title": "Embâcle", 7 | "sourceOptions": { 8 | "type": "wms", 9 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 10 | "queryable": true, 11 | "queryTitle": "no_seq_observation", 12 | "params": { 13 | "layers": "vg_observation_v_inondation_embacle_wmst", 14 | "version": "1.3.0" 15 | }, 16 | "timeFilterable": true, 17 | "timeFilter": { 18 | "min": "2013", 19 | "max": "2019", 20 | "range": false, 21 | "type": "year", 22 | "style": "slider", 23 | "step": 1, 24 | "timeInterval": 2000 25 | } 26 | }, 27 | "metadata": { 28 | "url": "https://www.donneesquebec.ca/recherche/fr/dataset/historique-publique-d-embacles-repertories-au-msp" 29 | } 30 | }, 31 | { 32 | "visible": false, 33 | "sourceOptions": { 34 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 35 | "timeFilterable": true, 36 | "timeFilter": { 37 | "min": "1990-01-01", 38 | "max": "2020-03-28", 39 | "style": "calendar", 40 | "range": true, 41 | "type": "date" 42 | }, 43 | "queryable": true, 44 | "queryFormat": "gml2", 45 | "queryTitle": "date_observation", 46 | "optionsFromCapabilities": true, 47 | "params": { 48 | "layers": "vg_observation_v_autre_wmst", 49 | "version": "1.3.0" 50 | }, 51 | "type": "wms" 52 | } 53 | } 54 | ], 55 | "toolbar": [ 56 | "searchResults", 57 | "contextManager", 58 | "mapTools", 59 | "timeFilter", 60 | "measurer", 61 | "directions", 62 | "catalog", 63 | "importExport", 64 | "print", 65 | "shareMap", 66 | "about", 67 | "advancedMap" 68 | ] 69 | } 70 | -------------------------------------------------------------------------------- /src/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "directionsSources": { 3 | "osrm": { 4 | "name": "OSRM Québec", 5 | "baseUrl": "/apis/itineraire/route/v1/", 6 | "profiles": [ 7 | { 8 | "name": "driving" 9 | }, 10 | { 11 | "name": "forestier", 12 | "authorization": { 13 | "url": "/apis/igo2/user/igo", 14 | "property": "hasOsrmPrivateAccess" 15 | } 16 | } 17 | ] 18 | } 19 | }, 20 | "favoriteContext4NonAuthenticated": true, 21 | "theme": "blue-theme", 22 | "header": { 23 | "hasHeader": false, 24 | "logo": "assets/images/signature-PIV.svg", 25 | "logoPrint": "assets/images/signature-PIV.svg" 26 | }, 27 | "hasFooter": false, 28 | "hasExpansionPanel": true, 29 | "geolocation": { 30 | "button": { 31 | "visible": true 32 | } 33 | }, 34 | "showRotationButtonIfNoRotation": false, 35 | "menu": { 36 | "button": { 37 | "visible": true, 38 | "useThemeColor": false 39 | } 40 | }, 41 | "searchBar": { 42 | "showSearchBar": true, 43 | "showSearchButton": false 44 | }, 45 | "queryTabs": false, 46 | "saveSearchResultInLayer": true, 47 | "hasFeatureEmphasisOnSelection": true, 48 | "homeExtentButton": { 49 | "homeExtButtonExtent": [-9000000, 5790000, -7500000, 6770000], 50 | "homeExtButtonCenter": [-71.938087, 48.446975], 51 | "homeExtButtonZoom": 6 52 | }, 53 | "searchSources": { 54 | "cadastre": { 55 | "available": false 56 | } 57 | }, 58 | "title": "IGO", 59 | "welcomeWindow": { 60 | "showAgainOnNewIGOVersion": true, 61 | "nbVisitToShow": 2, 62 | "nbVisitToShowAgain": 30 63 | }, 64 | "edition": { 65 | "url": "/apis/inedit/" 66 | }, 67 | "wakeLockApiButton": false, 68 | "offlineButton": false, 69 | "regex": { 70 | "geoservice": [ 71 | { 72 | "url": "https://geoegl.msp.gouv.qc.ca/ws/mffpecofor.fcgi", 73 | "type": "wms", 74 | "propertiesForLayerName": ["name"] 75 | } 76 | ] 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapDetailsOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | expandLegendOfVisibleLayers ,Boolean ,"À l'ouverture de l'outil, sous l'onglet Carte, déroule (affiche) les légendes des couches visibles. ",true / false ,false 3 | layerAdditionAllowed ,Boolean ,"| Identifie si l'ajout de couches à la carte sont permises. 4 | | Influence les messages d'aide à l'usager ",true / false ,true 5 | ogcButton ,Boolean ,Permet d'afficher le bouton filtre OGC pour les couches le permettant. ,true / false ,true 6 | queryBadge ,Boolean ,"Sous l'onglet Carte, affiche en superposition à l'oeil de visiblité, un ""?"" pour les couches interrogeable. ",true / false ,false 7 | timeButton ,Boolean ,Permet d'afficher le bouton filtre temporel pour les couches le permettant. ,true / false ,true 8 | toggleLegendOnVisibilityChange ,Boolean ,"| Sous l'onglet Carte, déroule (affiche) les légendes lorsque le statut de visibilité  9 | | d'une couche passe de non-visible à visible ",true / false ,false 10 | updateLegendOnResolutionChange ,Boolean ,Permet de rafraichir la légende à chaque changement de résolution (zoom) ,true / false ,false 11 | layerListControls ,Objet,"| Divers contrôles effectués à la liste de couches affichées dans l'interface. 12 | | ""excludeBaseLayers"" = Retire les couches identifiées comme baseLayer. 13 | | ""showToolbar"" = Outil permettant de contrôler la liste des couche                  14 | | ""always"", ""never"" ou ""default"" = visible si 5 couches et + 15 | | ""keyword"" = Mot clef filtrant la liste de couches 16 | | ""sortAlpha"" = Tri la liste de couches alphabétiquement. 17 | | ""onlyVisible"" = Ne garde que dans la liste de couches, les couches visible.","| ""layerListControls"": { 18 | | ""excludeBaseLayers"": true, 19 | | ""showToolbar"": ""always"", 20 | | ""keyword"": ""allo"", 21 | | ""sortAlpha"": true, 22 | | ""onlyVisible"": true 23 | | }","| ""layerListControls"": { 24 | | ""excludeBaseLayers"": false, 25 | | ""showToolbar"": ""default"", 26 | | ""sortAlpha"": false, 27 | | ""onlyVisible"": false 28 | | }" 29 | -------------------------------------------------------------------------------- /src/app/pages/portal/sidenav/sidenav-import.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Ce fichier TEMPORAIRE permet de corriger un problème de tree-shaking 3 | * https://github.com/infra-geo-ouverte/igo2/issues/1178 4 | */ 5 | import { ToolComponent } from '@igo2/common/tool'; 6 | import { 7 | AboutToolComponent, 8 | ActiveOgcFilterToolComponent, 9 | ActiveTimeFilterToolComponent, 10 | AdvancedMapToolComponent, 11 | CatalogBrowserToolComponent, 12 | CatalogLibraryToolComponent, 13 | ContextEditorToolComponent, 14 | ContextManagerToolComponent, 15 | ContextPermissionManagerToolComponent, 16 | ContextShareToolComponent, 17 | DataIssueReporterToolComponent, 18 | DirectionsToolComponent, 19 | DrawingToolComponent, 20 | ImportExportToolComponent, 21 | MapDetailsToolComponent, 22 | MapLegendToolComponent, 23 | MapProximityToolComponent, 24 | MapToolComponent, 25 | MapToolsComponent, 26 | MeasurerToolComponent, 27 | OgcFilterToolComponent, 28 | PrintToolComponent, 29 | SearchResultsToolComponent, 30 | SpatialFilterToolComponent, 31 | TimeFilterToolComponent 32 | } from '@igo2/integration'; 33 | 34 | // Prevent Tree-Shaking with Explicit Imports 35 | 36 | const _TOOLS = [ 37 | ToolComponent, 38 | AboutToolComponent, 39 | CatalogBrowserToolComponent, 40 | CatalogLibraryToolComponent, 41 | ContextEditorToolComponent, 42 | ContextManagerToolComponent, 43 | ContextPermissionManagerToolComponent, 44 | ContextShareToolComponent, 45 | DirectionsToolComponent, 46 | DrawingToolComponent, 47 | ActiveOgcFilterToolComponent, 48 | ActiveTimeFilterToolComponent, 49 | OgcFilterToolComponent, 50 | SpatialFilterToolComponent, 51 | TimeFilterToolComponent, 52 | DataIssueReporterToolComponent, 53 | ImportExportToolComponent, 54 | AdvancedMapToolComponent, 55 | MapDetailsToolComponent, 56 | MapLegendToolComponent, 57 | MapProximityToolComponent, 58 | MapToolComponent, 59 | MapToolsComponent, 60 | MeasurerToolComponent, 61 | PrintToolComponent, 62 | SearchResultsToolComponent 63 | ]; 64 | 65 | export function importAllTools() { 66 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 67 | for (const tool of _TOOLS) { 68 | // @WORKAROUND Empty iteration to prevent tree shaking 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/sourceFields.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | **name*** ,String,Nom de l'attribut ,, 3 | alias ,String,Alias de l'attribut.,,Le nom de l'attribut est utilisé si nul. 4 | values ,[],Liste de valeurs permises ,,"| Si vide, pour les WFS,  5 | | sera récupéré automatiquement. " 6 | visible ,Boolean ,Indique si le champ doit être visible ou non dans la table d'édition. ,true/false ,true 7 | type ,String ,Indique le type de saisie pour l'outil d'édition. ,number/string/autocomplete/list/date 8 | multiple ,Boolean ,Indique si la liste en saisie doit être multiple ou non ,true/false ,false 9 | excludeFromOgcFilters ,Boolean ,Indique si l'attribut est utilisé dans l'outil de filtre OGC. ,true/false ,true 10 | allowedOperatorsType ,String,Indique les opérateurs permis pour cet attribut ,"| BasicNumericOperator 11 | | Basic 12 | | BasicAndSpatial 13 | | Spatial 14 | | All 15 | | Time 16 | | Référez vous à `ogc-filter.ts `__ pour les opérateurs correspondants.",BasicAndSpatial 17 | validation ,Object ,Indique les validations lors de la sauvegarde d'une entité ,| Référez vous à `entity.interface.ts `__ ., 18 | relation ,String ,Indique les relations à lier pour la saisie des champs de type list ,| Référez vous à `datasource.interface.ts `__ ., 19 | searchIndex,Object ,Indique si et comment le champs doit etre indexé pour etre recherchable (vector source seulement),"| enabled?: boolean; 20 | | preset?: Preset; 21 | | tokenize?: Tokenizer; 22 | | cache?: boolean | number; 23 | | resolution?: number; 24 | | context?: boolean; 25 | | optimize?: boolean; 26 | | language?: string; 27 | | encode?: Encoders; 28 | | Si aucun champ n’est renseigné, la valeur par défaut s’appliquera. Seuls les champs dont l’occurrence des valeurs est supérieure a 2% sera indexé OU si le contenu n’est pas du float. 29 | | Voir https://github.com/nextapps-de/flexsearch/ pour les propriétés associées.","tokenize: ""full""" 30 | -------------------------------------------------------------------------------- /src/contexts/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "messages", 3 | "title": "Messages", 4 | "base": "_base", 5 | "messages": [ 6 | { 7 | "title": "messages.title", 8 | "text": "messages.message", 9 | "type": "success", 10 | "textInterpolateParams": { "content": "messages.content" }, 11 | "showIcon": true, 12 | "options": { 13 | "timeOut": 30000, 14 | "titleClass": "toast-title-red", 15 | "messageClass": "toast-message-gray" 16 | } 17 | }, 18 | { 19 | "title": "Warning with noTimeout", 20 | "text": "Warning xxxxxx
Click on message to indicate you have read the warninglink exemple with custom class toast-message-a-blue", 21 | "type": "warning", 22 | "format": "html", 23 | "options": { 24 | "disableTimeOut": true 25 | } 26 | } 27 | ], 28 | "layers": [ 29 | { 30 | "title": "MSP Tel. Urgence", 31 | "visible": false, 32 | "sourceOptions": { 33 | "type": "wms", 34 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 35 | "params": { 36 | "layers": "telephone_urg", 37 | "version": "1.3.0" 38 | }, 39 | "queryable": true, 40 | "queryFormat": "gml2", 41 | "queryTitle": "desclocal" 42 | }, 43 | "messages": [ 44 | { 45 | "title": "Info", 46 | "text": "First message at layer level, always shown when the layer is set to be visible", 47 | "type": "info", 48 | "options": { 49 | "timeOut": 20000, 50 | "showOnEachLayerVisibility": true 51 | } 52 | }, 53 | { 54 | "title": "Info no icon", 55 | "text": "Second message at layer level", 56 | "type": "info", 57 | "showIcon": false, 58 | "options": { 59 | "timeOut": 20000 60 | } 61 | }, 62 | { 63 | "title": "Show message type", 64 | "text": "3e message at layer level", 65 | "type": "show", 66 | "showIcon": false, 67 | "options": { 68 | "timeOut": 20000 69 | } 70 | } 71 | ] 72 | } 73 | ] 74 | } 75 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/filter/ogcFilters.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | allowedOperatorsType ,String,"| Paramètre relatif aux filtres avancés.  3 | | Les opérateurs pour construire l'expression filtrante  4 | | qui seront accessible à l'utilisateur. 5 | | 6 | | NB: Ce paramètre s'appliquera a tous les champs  7 | | définit dans sourceField mais ce paramètre peut aussi 8 | | être définit à l'intérieur de sourceField pour l'appliquer | au niveau d'un champ spécifique si besoin. ","| BasicNumericOperator,            9 | | Basic,  10 | | Spatial,            11 | | BasicAndSpatial,            12 | | All 13 | | time. ",BasicAndSpatial 14 | editable ,Boolean,"| Active ou non la possibilité à l'utilisateur de 15 | | construire des filtres avancés. ",true | false ,true 16 | enabled ,Boolean,"| Active ou non les filtres modifiable par l'utilisateur sur  17 | | la couche. Si = false, le bouton de filtre n'apparait plus. 18 | | Par exemple, dans le cas que le pilote voudrait filtrer une  19 | | couche mais que ce filtre ne soit pas modifiable par l'utilisateur. ",true | false ,true 20 | filters ,"| IgoLogicalArrayOptions 21 | | AnyBaseOgcFilterOptions ","| Permet de définir un filtre avancé. 22 | | :ref:`voir configuration filters ` ",, 23 | pushButtons ,PushButton ,"| Permet de définir des boutons poussoirs qui pourront être  24 | | activés par l'utilisateur pour appliquer des filtres voulus. 25 | | Doit contenir obligatoirement bundles[]. ",, 26 | checkboxes ,Checkbox ,"| Permet de définir des cases à cocher qui pourront être  27 | | activées par l'utilisateur pour appliquer des filtres voulus. 28 | | Doit contenir obligatoirement bundles[]. ",, 29 | radioButtons ,RadioButton ,"| Permet de définir des boutons radio qui pourront être  30 | | activés par l'utilisateur pour appliquer des filtres voulus. 31 | | Doit contenir obligatoirement bundles[]. ",, 32 | select ,Select ,"| Permet de définir une liste déroulante permettant à 33 | | l'utilisateur d'appliquer un ou plusieurs filtres. 34 | | Doit contenir obligatoirement bundles[].",, 35 | autocomplete ,Automcomplete ,"| Permet de définir un autocomplétion permettant à 36 | | l'utilisateur d'appliquer un ou plusieurs filtres à partir d'un domaine de valeurs. 37 | | Doit contenir obligatoirement domSelectors[].",, 38 | -------------------------------------------------------------------------------- /docs/_tables/fr/config/message.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | format ,String,"| Le format du message html ou text. Selon le choix, une deuxième configuration devra 3 | | être définie soit html ou text. ","'text', 'html' ", 4 | html ,String,Le html du message sur une seule ligne. Cette configuration est obligatoire si le format = 'html. ,, 5 | showIcon , Boolean, Indique si l'icone est présent dans l'affichage du message , true/false, true 6 | options.* ,Notification ,"| Voir les options Notifications dans le projet 7 | | `ngx-toastr options. `_ ",, 8 | options.disableTimeOut , Boolean, Enlève le délais de temps ou est affiché le message, true/false, false 9 | options.template ,String ,En construction ,, 10 | options.from ,Date | String ,"| Date de début de l'application du message. 11 | | Peut être une date OU un string interprétable 12 | | en javascript. `https://developer.mozilla.org/fr/docs... `_ ",, 13 | options.to,Date | String ,"| Date de fin de l'application du message. 14 | | Peut être une date OU un string interprétable 15 | | en javascript. `https://developer.mozilla.org/fr/docs... `_ ",, 16 | text ,String,"| Le text du message à afficher. Cette configuration remplace la configuration html. 17 | | NB.: pour un message qui sera traduction en fonction du navigateur simplement 18 | | créer une clef de traduction indiquée ici et mettre son équivalent dans les 19 | | fichiers de traduction local en.json, fr.json. Exemple: 20 | | ""text"": ""messageContextXyz"", 21 | | fr.json = ""messageContextXyz"": 

mon super message

22 | | en.json = ""messageContextXyz"": 

message in english

",, 23 | title ,String,"| Le titre du message à afficher. Cette configuration s'active seulement avec la 24 | | configuration text et ne sera pas pris en compte avec la configuration html. ",, 25 | type ,String,"| Le type du message à afficher. Avertissement, erreur ou information. 26 | | Selon le type choisi une couleur spécifiée sera appliquée selon la 27 | | thématique de couleur de l'application. ","| 'warning', 'error', 28 | | 'info', 'success', 'show'", 29 | -------------------------------------------------------------------------------- /src/app/pages/portal/map-overlay/map-overlay.component.ts: -------------------------------------------------------------------------------- 1 | import { NgClass, NgStyle } from '@angular/common'; 2 | import { AfterViewInit, Component, OnDestroy, inject } from '@angular/core'; 3 | 4 | import { Context, ContextService } from '@igo2/context'; 5 | import { ConfigService } from '@igo2/core/config'; 6 | import { MediaService } from '@igo2/core/media'; 7 | 8 | import { Subscription } from 'rxjs'; 9 | 10 | import { MapOverlay } from './map-overlay.interface'; 11 | 12 | @Component({ 13 | selector: 'app-map-overlay', 14 | templateUrl: './map-overlay.component.html', 15 | styleUrls: ['./map-overlay.component.scss'], 16 | imports: [NgClass, NgStyle] 17 | }) 18 | export class MapOverlayComponent implements AfterViewInit, OnDestroy { 19 | private contextService = inject(ContextService); 20 | private mediaService = inject(MediaService); 21 | private configService = inject(ConfigService); 22 | 23 | public mapOverlay: MapOverlay[] = []; 24 | private context$$: Subscription; 25 | private media$$: Subscription; 26 | private context: Context; 27 | 28 | ngAfterViewInit() { 29 | this.context$$ = this.contextService.context$.subscribe((context) => { 30 | this.handleContextChange(context); 31 | this.context = context; 32 | }); 33 | this.media$$ = this.mediaService.media$.subscribe(() => 34 | this.handleContextChange(this.context) 35 | ); 36 | } 37 | 38 | ngOnDestroy() { 39 | this.context$$.unsubscribe(); 40 | this.media$$.unsubscribe(); 41 | } 42 | 43 | private handleContextChange(context: Context) { 44 | let mapOverlay: MapOverlay[] = []; 45 | if (context !== undefined) { 46 | this.mapOverlay = []; 47 | 48 | if (context['mapOverlay']) { 49 | mapOverlay = context['mapOverlay']; 50 | } else { 51 | mapOverlay = this.configService.getConfig('mapOverlay', []); 52 | } 53 | for (const overlay of mapOverlay) { 54 | // If no media define use default to desktop, display only if current media is on context definition 55 | if ( 56 | (!overlay.media && this.mediaService.getMedia() === 'desktop') || 57 | (overlay.media && 58 | overlay.media.includes(this.mediaService.getMedia())) 59 | ) { 60 | this.mapOverlay.push(overlay); 61 | } 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /scripts/src/utils/file-system.utils.mts: -------------------------------------------------------------------------------- 1 | import { existsSync, readFileSync } from 'fs'; 2 | import { 3 | copyFile as fsCopyFile, 4 | mkdir, 5 | readFile, 6 | writeFile 7 | } from 'fs/promises'; 8 | import { normalize, sep } from 'path'; 9 | 10 | export const BUFFER_ENCODING: BufferEncoding = 'utf-8'; 11 | 12 | export async function readFileContent(path: string): Promise { 13 | const body = await readFile(path, BUFFER_ENCODING); 14 | return JSON.parse(body) as T; 15 | } 16 | 17 | export function readFileContentSync(path: string): T { 18 | const body = readFileSync(path, BUFFER_ENCODING); 19 | return JSON.parse(body) as T; 20 | } 21 | 22 | export async function createFile( 23 | fileName: string, 24 | dest: string, 25 | body: string 26 | ): Promise { 27 | const path = `${dest}/${fileName}`; 28 | try { 29 | await writeFile(path, body, BUFFER_ENCODING); 30 | } catch (err: any) { 31 | if (err.code === 'ENOENT') { 32 | await createFolderRecursively(dest); 33 | await writeFile(path, body, BUFFER_ENCODING); 34 | } 35 | } 36 | } 37 | 38 | export async function copyFile(src: string, dest: string): Promise { 39 | try { 40 | await fsCopyFile(src, dest); 41 | } catch (err: any) { 42 | if (err.code === 'ENOENT') { 43 | await createPreviousFolder(dest); 44 | await fsCopyFile(src, dest); 45 | } 46 | } 47 | } 48 | 49 | export async function createFolderRecursively(dest: string): Promise { 50 | try { 51 | await mkdir(dest); 52 | } catch (err: any) { 53 | if (err.code === 'ENOENT') { 54 | await createPreviousFolder(dest); 55 | await createFolderRecursively(dest); 56 | } 57 | } 58 | } 59 | 60 | async function createPreviousFolder(dest: string): Promise { 61 | const folders = normalize(dest).split(sep); 62 | folders.pop(); 63 | await createFolderRecursively(folders.join(sep)); 64 | } 65 | 66 | export function pathExist(path: string): boolean { 67 | return existsSync(path); 68 | } 69 | 70 | export function writeFile2( 71 | path: string, 72 | body: object | string, 73 | endLineBreak = true 74 | ): Promise { 75 | let formattedBody = 76 | typeof body === 'string' ? body : JSON.stringify(body, null, 2); 77 | if (endLineBreak) { 78 | formattedBody = formattedBody.concat('\n'); 79 | } 80 | return writeFile(path, formattedBody, BUFFER_ENCODING); 81 | } 82 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import stylistic from '@stylistic/eslint-plugin'; 3 | import angular from 'angular-eslint'; 4 | import { defineConfig } from 'eslint/config'; 5 | import tseslint from 'typescript-eslint'; 6 | 7 | export default defineConfig( 8 | { 9 | files: ['**/*.ts'], 10 | plugins: { 11 | // @ts-ignore 12 | '@stylistic': stylistic 13 | }, 14 | extends: [ 15 | eslint.configs.recommended, 16 | ...tseslint.configs.recommended, 17 | ...tseslint.configs.stylistic, 18 | ...angular.configs.tsRecommended 19 | ], 20 | languageOptions: { 21 | parserOptions: { 22 | projectService: true, 23 | tsconfigRootDir: import.meta.dirname 24 | } 25 | }, 26 | processor: angular.processInlineTemplates, 27 | rules: { 28 | '@angular-eslint/directive-selector': [ 29 | 'error', 30 | { 31 | type: 'attribute', 32 | prefix: 'app', 33 | style: 'camelCase' 34 | } 35 | ], 36 | '@angular-eslint/component-selector': [ 37 | 'error', 38 | { 39 | type: 'element', 40 | prefix: 'app', 41 | style: 'kebab-case' 42 | } 43 | ], 44 | '@angular-eslint/no-output-native': 'off', 45 | '@stylistic/semi': ['error', 'always'], 46 | '@typescript-eslint/array-type': 'warn', 47 | '@typescript-eslint/no-explicit-any': 'warn', 48 | '@typescript-eslint/no-unused-expressions': [ 49 | 'error', 50 | { allowTernary: true } 51 | ], 52 | '@typescript-eslint/no-unused-vars': [ 53 | 'error', 54 | { args: 'after-used', destructuredArrayIgnorePattern: '^_' } 55 | ], 56 | 'arrow-spacing': 'error', 57 | eqeqeq: ['error', 'smart'], 58 | 'no-multi-spaces': 'error', 59 | 'no-multiple-empty-lines': 'error', 60 | 'no-trailing-spaces': 'error', 61 | 'no-useless-escape': 'warn', 62 | 63 | 'no-unused-vars': 'off', 64 | semi: 'warn', 65 | 'semi-spacing': 'warn' 66 | } 67 | }, 68 | { 69 | files: ['**/*.html'], 70 | extends: [ 71 | ...angular.configs.templateRecommended, 72 | ...angular.configs.templateAccessibility 73 | ], 74 | rules: { 75 | '@angular-eslint/template/alt-text': 'warn', 76 | '@angular-eslint/template/click-events-have-key-events': 'warn', 77 | '@angular-eslint/template/interactive-supports-focus': 'warn' 78 | } 79 | } 80 | ); 81 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master, next ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master, next ] 20 | schedule: 21 | - cron: '32 22 * * 5' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | language: [ 'javascript' ] 32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 33 | # Learn more: 34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 35 | 36 | steps: 37 | - name: Checkout repository 38 | uses: actions/checkout@v3 39 | 40 | # Initializes the CodeQL tools for scanning. 41 | - name: Initialize CodeQL 42 | uses: github/codeql-action/init@v3 43 | with: 44 | languages: ${{ matrix.language }} 45 | # If you wish to specify custom queries, you can do so here or in a config file. 46 | # By default, queries listed here will override any specified in a config file. 47 | # Prefix the list here with "+" to use these queries and those in the config file. 48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 49 | 50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 51 | # If this step fails, then you should remove it and run the build manually (see below) 52 | - name: Autobuild 53 | uses: github/codeql-action/autobuild@v3 54 | 55 | # ℹ️ Command-line programs to run using the OS shell. 56 | # 📚 https://git.io/JvXDl 57 | 58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 59 | # and modify them (or add more) to build your code if your project 60 | # uses a compiled language 61 | 62 | #- run: | 63 | # make bootstrap 64 | # make release 65 | 66 | - name: Perform CodeQL Analysis 67 | uses: github/codeql-action/analyze@v3 68 | -------------------------------------------------------------------------------- /src/assets/mapboxStyleExample-vectortile.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 8, 3 | "name": "Example Style Vector Tile", 4 | "metadata": { "maputnik:renderer": "mbgljs" }, 5 | "sources": { 6 | "ahocevar": { 7 | "type": "vector", 8 | "minZoom": 0, 9 | "maxZoom": 22 10 | } 11 | }, 12 | "sprite": "", 13 | "layers": [ 14 | { 15 | "id": "line_style_canada", 16 | "type": "line", 17 | "source": "ahocevar", 18 | "source-layer": "ne_10m_admin_0_countries", 19 | "filter": ["any", ["==", "admin", "Canada"]], 20 | "paint": { 21 | "line-color": "rgba(0, 0, 0, 1)" 22 | }, 23 | "layout": { 24 | "visibility": "visible", 25 | "line-cap": "round", 26 | "line-join": "round" 27 | } 28 | }, 29 | { 30 | "id": "fill_style_canada", 31 | "type": "fill", 32 | "source": "ahocevar", 33 | "source-layer": "ne_10m_admin_0_countries", 34 | "filter": ["any", ["==", "admin", "Canada"]], 35 | "paint": { 36 | "fill-color": "rgba(255, 10, 10, 0.5)" 37 | }, 38 | "layout": { 39 | "visibility": "visible", 40 | "line-cap": "round", 41 | "line-join": "round" 42 | } 43 | }, 44 | { 45 | "id": "line_style_usa", 46 | "type": "line", 47 | "source": "ahocevar", 48 | "source-layer": "ne_10m_admin_0_countries", 49 | "filter": ["any", ["==", "admin", "United States of America"]], 50 | "paint": { 51 | "line-color": "rgba(0, 50, 255, 1)", 52 | "line-width": 3 53 | }, 54 | "layout": { 55 | "visibility": "visible", 56 | "line-cap": "round", 57 | "line-join": "round" 58 | } 59 | }, 60 | { 61 | "id": "fill_style_usa", 62 | "type": "fill", 63 | "source": "ahocevar", 64 | "source-layer": "ne_10m_admin_0_countries", 65 | "filter": ["any", ["==", "admin", "United States of America"]], 66 | "paint": { 67 | "fill-color": "rgba(0, 50, 255, 0.5)" 68 | }, 69 | "layout": { 70 | "visibility": "visible", 71 | "line-cap": "round", 72 | "line-join": "round" 73 | } 74 | }, 75 | { 76 | "id": "fill_style_usa", 77 | "type": "fill", 78 | "source": "ahocevar", 79 | "source-layer": "ne_10m_admin_0_countries", 80 | "filter": ["any", ["==", "admin", "Liechtenstein"]], 81 | "paint": { 82 | "fill-color": "rgba(255, 255, 0, 1)" 83 | }, 84 | "layout": { 85 | "visibility": "visible", 86 | "line-cap": "round", 87 | "line-join": "round" 88 | } 89 | } 90 | ], 91 | "id": "vectortileid" 92 | } 93 | -------------------------------------------------------------------------------- /docs/_tables/fr/properties/tools/mapToolsOptions.csv: -------------------------------------------------------------------------------- 1 | Propriétés,Type,Description,Valeurs possibles,Valeur défaut 2 | allowShowAllLegends ,Boolean ,"| Affiche un bouton permettant de montrer toutes les légendes de la carte, 3 | | même pour les couches non visible OU hors échelle d'affichage. ",true / false ,false 4 | showAllLegendsValue ,Boolean ,"| Si allowShowAllLegends est permis (true), définit la valeur à l'ouverture de l'application. 5 | | true = toutes les légendes sont affichées (même ceux non visibles à la carte) ",true / false ,false 6 | expandLegendOfVisibleLayers ,Boolean ,"À l'ouverture de l'outil, sous l'onglet Carte, déroule (affiche) les légendes des couches visibles. ",true / false ,false 7 | layerAdditionAllowed ,Boolean ,"| Identifie si l'ajout de couches à la carte sont permises. 8 | | Influence les messages d'aide à l'usager ",true / false ,true 9 | ogcButton ,Boolean ,Permet d'afficher le bouton filtre OGC pour les couches le permettant. ,true / false ,true 10 | queryBadge ,Boolean ,"Sous l'onglet Carte, affiche en superposition à l'oeil de visiblité, un ""?"" pour les couches interrogeable. ",true / false ,false 11 | timeButton ,Boolean ,Permet d'afficher le bouton filtre temporel pour les couches le permettant. ,true / false ,true 12 | selectedTabAtOpening ,String ,"Permet de définir, lors de la première ouverture de l'outil, quel onglet est ouvert. ",'legend' ,L'onglet Carte est ouvert par défaut. 13 | toggleLegendOnVisibilityChange ,Boolean ,"| Sous l'onglet Carte, déroule (affiche) les légendes lorsque le statut de visibilité  14 | | d'une couche passe de non-visible à visible ",true / false ,false 15 | updateLegendOnResolutionChange ,Boolean ,Permet de rafraichir la légende à chaque changement de résolution (zoom) ,true / false ,false 16 | layerListControls ,Objet,"| Divers contrôles effectués à la liste de couches affichées dans l'interface. 17 | | ""excludeBaseLayers"" = Retire les couches identifiées comme baseLayer. 18 | | ""showToolbar"" = Outil permettant de contrôler la liste des couche                  19 | | ""always"", ""never"" ou ""default"" = visible si 5 couches et + 20 | | ""keyword"" = Mot clef filtrant la liste de couches 21 | | ""sortAlpha"" = Tri la liste de couches alphabétiquement. 22 | | ""onlyVisible"" = Ne garde que dans la liste de couches, les couches visible.","| ""layerListControls"": { 23 | | ""excludeBaseLayers"": true, 24 | | ""showToolbar"": ""always"", 25 | | ""keyword"": ""allo"", 26 | | ""sortAlpha"": true, 27 | | ""onlyVisible"": true 28 | | }","| ""layerListControls"": { 29 | | ""excludeBaseLayers"": false, 30 | | ""showToolbar"": ""default"", 31 | | ""sortAlpha"": false, 32 | | ""onlyVisible"": false 33 | | }" 34 | -------------------------------------------------------------------------------- /docs/shortcut.rst: -------------------------------------------------------------------------------- 1 | --------------------- 2 | Raccourcis clavier 3 | --------------------- 4 | 5 | 6 | ************************************ 7 | CTRL maintenu + lick drag + relâche 8 | ************************************ 9 | 10 | .. line-block:: 11 | 12 | Lorsque vous avez des données tabulaire(vectorielle), 13 | permet de faire une sélection par rectangle sur ces entités. 14 | Lorsque vous effectuez plusieurs rectangle consécutif, 15 | la sélection effectuée est ajoutée à la précédente sélection. 16 | 17 | 18 | ******************************* 19 | Majuscule (shift) maintenu 20 | ******************************* 21 | 22 | .. line-block:: 23 | 24 | Lorsque vous maintenez la touche majuscule (SHIFT) et que vous cliquez 25 | sur la carte, vous définirez une zone à l'intérieur de laquelle 26 | vous pourrez aller zoomer une fois la zone définie. 27 | 28 | 29 | ******************************* 30 | F2 31 | ******************************* 32 | 33 | .. line-block:: 34 | 35 | Dans l'application, si un résumé de la position du curseur est disponible, 36 | F2 permet d'activer/désactiver le résumé de position. 37 | 38 | 39 | ******************************* 40 | Z 41 | ******************************* 42 | 43 | .. line-block:: 44 | 45 | Lorsque vous avez effectué une interrogation \à la carte (clic dans la carte) 46 | et que vous avez sélectionné un résultat d'interrogation, si vous appuyez sur 47 | la touche z, vous zoomerez sur le résultat en cours. 48 | 49 | 50 | ******************************* 51 | Flèche gauche 52 | ******************************* 53 | 54 | .. line-block:: 55 | 56 | Lorsque vous avez effectué une interrogation \à la carte (clic dans la carte) 57 | et que vous avez sélectionné un résultat d'interrogation, si vous appuyez sur 58 | la touche fl\èche gauche, vous accéderez au résultat de recherche qui précède 59 | dans la liste des résultats. 60 | 61 | Important : 62 | - Si le résultat sélectionné est le premier de la liste de résultat, le raccourci ne fonctionnera pas. 63 | - Si vous obtenez un seul résultat, le raccourci ne fonctionnera pas. 64 | 65 | 66 | ******************************* 67 | Flèche droite 68 | ******************************* 69 | 70 | .. line-block:: 71 | 72 | Lorsque vous avez effectué une interrogation \à la carte (clic dans la carte) 73 | et que vous avez sélectionné un résultat d'interrogation, si vous appuyez sur 74 | la touche fl\èche droite, vous accéderez au résultat de recherche qui succède 75 | dans la liste des résultats. 76 | 77 | Important : 78 | - Si le résultat sélectionné est le dernier de la liste de résultat, le raccourci ne fonctionnera pas. 79 | - Si vous obtenez un seul résultat, le raccourci ne fonctionnera pas. 80 | -------------------------------------------------------------------------------- /src/app/pages/portal/welcome-window/welcome-window.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, inject } from '@angular/core'; 2 | import { MatDialogConfig } from '@angular/material/dialog'; 3 | 4 | import { ConfigService } from '@igo2/core/config'; 5 | import { StorageService } from '@igo2/core/storage'; 6 | 7 | import { getAppVersion } from 'src/app/app.utils'; 8 | 9 | @Injectable({ 10 | providedIn: 'root' 11 | }) 12 | export class WelcomeWindowService { 13 | private configService = inject(ConfigService); 14 | private storageService = inject(StorageService); 15 | 16 | nbVisit: number; 17 | showAgain: boolean; 18 | igoVersionDifferentFromStorage = false; 19 | 20 | constructor() { 21 | this.igoVersionDifferentFromStorage = this.isVersionDifferentFromStorage(); 22 | this.setStorageConfig(); 23 | } 24 | 25 | setStorageConfig() { 26 | this.nbVisit = Number(this.storageService.get('welcomeWindow_nbVisit')); 27 | if (!this.nbVisit) { 28 | this.nbVisit = 0; 29 | } 30 | 31 | this.storageService.set('welcomeWindow_nbVisit', (this.nbVisit += 1)); 32 | } 33 | 34 | isVersionDifferentFromStorage(): boolean { 35 | return ( 36 | this.storageService.get('version') !== getAppVersion(this.configService) 37 | ); 38 | } 39 | 40 | hasWelcomeWindow(): boolean { 41 | if ( 42 | this.storageService.get('welcomeWindow_showAgain') === false || 43 | this.storageService.get('welcomeWindow_showAgain') === 'false' 44 | ) { 45 | if ( 46 | this.nbVisit >= 47 | this.configService.getConfig('welcomeWindow.nbVisitToShowAgain') 48 | ) { 49 | this.storageService.set('welcomeWindow_nbVisit', 0); 50 | this.storageService.remove('welcomeWindow_showAgain'); 51 | return true; 52 | } else if ( 53 | this.configService.getConfig('welcomeWindow.showAgainOnNewIGOVersion') 54 | ) { 55 | if (this.igoVersionDifferentFromStorage) { 56 | this.storageService.set('welcomeWindow_nbVisit', 0); 57 | this.storageService.remove('welcomeWindow_showAgain'); 58 | return true; 59 | } 60 | } 61 | return false; 62 | } 63 | 64 | if ( 65 | typeof this.configService.getConfig('welcomeWindow.nbVisitToShow') !== 66 | 'undefined' 67 | ) { 68 | if ( 69 | this.nbVisit > 70 | this.configService.getConfig('welcomeWindow.nbVisitToShow') 71 | ) { 72 | this.storageService.set('welcomeWindow_showAgain', false); 73 | return false; 74 | } 75 | } 76 | 77 | return this.configService.getConfig('welcomeWindow'); 78 | } 79 | 80 | getConfig(): MatDialogConfig { 81 | const dialogConfig = new MatDialogConfig(); 82 | 83 | dialogConfig.disableClose = true; 84 | dialogConfig.autoFocus = true; 85 | dialogConfig.maxWidth = '500px'; 86 | 87 | return dialogConfig; 88 | } 89 | 90 | afterClosedWelcomeWindow() { 91 | this.storageService.set('welcomeWindow_showAgain', this.showAgain); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/app/services/pwa.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, inject } from '@angular/core'; 2 | import { SwUpdate } from '@angular/service-worker'; 3 | 4 | import { ConfirmDialogService } from '@igo2/common/confirm-dialog'; 5 | import { LanguageService } from '@igo2/core/language'; 6 | 7 | import { interval } from 'rxjs'; 8 | import { skip, tap } from 'rxjs/operators'; 9 | 10 | @Injectable({ 11 | providedIn: 'root' 12 | }) 13 | export class PwaService { 14 | private updates = inject(SwUpdate); 15 | private languageService = inject(LanguageService); 16 | private confirmDialogService = inject(ConfirmDialogService); 17 | 18 | private confirmOpened = false; 19 | constructor() { 20 | const updates = this.updates; 21 | 22 | if (updates.isEnabled) { 23 | this.handleVersionUpdates(); 24 | } 25 | } 26 | 27 | checkForUpdates() { 28 | if (this.updates.isEnabled) { 29 | interval(60 * 1000 * 2) 30 | .pipe(skip(1)) 31 | .subscribe(async () => { 32 | try { 33 | const updateFound = await this.updates.checkForUpdate(); 34 | console.log( 35 | updateFound 36 | ? 'A new version is available.' 37 | : 'Already on the latest version.' 38 | ); 39 | } catch (err) { 40 | console.error('Failed to check for updates:', err); 41 | } 42 | }); 43 | } 44 | } 45 | 46 | private modalUpdatePWA() { 47 | if (this.confirmOpened) { 48 | return; 49 | } 50 | const title = this.languageService.translate.instant( 51 | 'pwa.new-version-title' 52 | ); 53 | const body = this.languageService.translate.instant('pwa.new-version'); 54 | const message = `${title} ${body}`; 55 | this.confirmDialogService 56 | .open(message) 57 | .pipe(tap(() => (this.confirmOpened = true))) 58 | .subscribe((confirm) => { 59 | if (confirm) { 60 | this.confirmOpened = false; 61 | if (window.navigator.onLine) { 62 | document.location.reload(); 63 | } else { 64 | alert( 65 | `Hors-ligne / Offline. Vous devez être en ligne pour mettre à jour l\'application. You must be online to update the application.` 66 | ); 67 | setTimeout(() => { 68 | this.modalUpdatePWA(); 69 | }, 900000); 70 | } 71 | } 72 | }); 73 | } 74 | 75 | private handleVersionUpdates(): void { 76 | this.updates.versionUpdates.subscribe((evt) => { 77 | switch (evt.type) { 78 | case 'VERSION_DETECTED': 79 | console.log(`Downloading new app version: ${evt.version.hash}`); 80 | break; 81 | case 'VERSION_READY': 82 | console.log(`Current app version: ${evt.currentVersion.hash}`); 83 | console.log( 84 | `New app version ready for use: ${evt.latestVersion.hash}` 85 | ); 86 | this.modalUpdatePWA(); 87 | break; 88 | case 'VERSION_INSTALLATION_FAILED': 89 | console.error( 90 | `Failed to install app version '${evt.version.hash}': ${evt.error}` 91 | ); 92 | break; 93 | } 94 | }); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IGO2 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 | 33 |
34 | 40 | 47 | 48 |
49 | 50 | 116 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/contexts/mapOverlay.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "mapOverlay", 3 | "base": "_base", 4 | "mapOverlay": [ 5 | { 6 | "cssClass": "bottom-left", 7 | "imgSrc": "./assets/images/igo-loading.gif", 8 | "imgSize": "50px", 9 | "text": "bottom-left fixed", 10 | "link": "https://www.google.com", 11 | "alt": "Loading", 12 | "fixed": true, 13 | "marginLeft": "90px", 14 | "fontSize": "14pt" 15 | }, 16 | { 17 | "cssClass": "bottom-right", 18 | "text": "bottom-right", 19 | "link": "https://www.google.ca", 20 | "marginRight": "55px" 21 | }, 22 | { 23 | "cssClass": "top-left", 24 | "imgSrc": "./assets/images/igo-loading.gif", 25 | "imgSize": "70px", 26 | "link": "https://www.google.ca/search?q=top-left", 27 | "alt": "Loading", 28 | "marginTop": "50px" 29 | }, 30 | { 31 | "cssClass": "top-right", 32 | "imgSrc": "./assets/images/igo-loading.gif", 33 | "imgSize": "70px", 34 | "text": "top-right", 35 | "alt": "Loading" 36 | }, 37 | { 38 | "media": ["mobile", "tablet", "desktop"], 39 | "cssClass": "top-center", 40 | "imgSrc": "./assets/images/igo-loading.gif", 41 | "imgSize": "20px", 42 | "text": "top-center everyone", 43 | "alt": "Loading", 44 | "marginTop": "50px" 45 | }, 46 | { 47 | "cssClass": "center-center", 48 | "text": "center-center fixed", 49 | "fontSize": "8pt", 50 | "fixed": true 51 | }, 52 | { 53 | "cssClass": "bottom-center", 54 | "imgSrc": "./assets/images/igo-loading.gif", 55 | "imgSize": "70px", 56 | "text": "bottom-center", 57 | "alt": "Loading" 58 | }, 59 | { 60 | "cssClass": "center-right", 61 | "imgSrc": "./assets/images/igo-loading.gif", 62 | "imgSize": "10px", 63 | "text": "center-right", 64 | "alt": "Loading" 65 | }, 66 | { 67 | "cssClass": "center-left", 68 | "imgSrc": "./assets/images/igo-loading.gif", 69 | "imgSize": "70px", 70 | "text": "center-left", 71 | "alt": "Loading" 72 | }, 73 | { 74 | "media": ["mobile", "tablet"], 75 | "cssClass": "bottom-left", 76 | "imgSrc": "./assets/images/igo-loading.gif", 77 | "imgSize": "20px", 78 | "text": "b-l mob/tab fixed", 79 | "link": "https://www.google.com", 80 | "alt": "Loading", 81 | "fixed": true, 82 | "marginLeft": "50px", 83 | "fontSize": "10pt" 84 | }, 85 | { 86 | "media": ["mobile", "tablet"], 87 | "cssClass": "bottom-right", 88 | "text": "b-r mob/tab", 89 | "link": "https://www.google.ca", 90 | "marginRight": "50px", 91 | "fontSize": "10pt" 92 | }, 93 | { 94 | "media": ["mobile"], 95 | "cssClass": "center-center", 96 | "text": "c-c mobile only", 97 | "fontSize": "10pt", 98 | "fixed": true 99 | }, 100 | { 101 | "media": ["tablet"], 102 | "cssClass": "center-center", 103 | "text": "c-c tablet only fixed", 104 | "fontSize": "10pt", 105 | "fixed": true 106 | } 107 | ], 108 | "tools": [ 109 | { 110 | "name": "about", 111 | "options": { 112 | "html": "

Demo of mapOverlay


You can switch to a mobile or tablet for a different display. For more information about the mapOverlay context parameters, take a look to the interface: src/app/pages/portal/map-overlay/map-overlay.interface.ts" 113 | } 114 | } 115 | ] 116 | } 117 | -------------------------------------------------------------------------------- /src/contexts/legends.json: -------------------------------------------------------------------------------- 1 | { 2 | "uri": "legends", 3 | "title": "Exemples de légendes", 4 | "base": "_base", 5 | "layers": [ 6 | { 7 | "id": 1, 8 | "title": "WMS Example 1", 9 | "sourceOptions": { 10 | "type": "wms", 11 | "url": "https://geoegl.msp.gouv.qc.ca/apis/ws/igo_gouvouvert.fcgi", 12 | "queryable": true, 13 | "queryTitle": "no_seq_observation", 14 | "params": { 15 | "layers": "vg_observation_v_inondation_embacle_wmst", 16 | "version": "1.3.0" 17 | } 18 | } 19 | }, 20 | { 21 | "id": 2, 22 | "title": "WMS Example 2", 23 | "sourceOptions": { 24 | "type": "wms", 25 | "url": "https://ws.mapserver.transports.gouv.qc.ca/swtq", 26 | "urlWfs": "https://ws.mapserver.transports.gouv.qc.ca/swtq", 27 | "queryable": true, 28 | "params": { 29 | "layers": "radars_photos" 30 | } 31 | } 32 | }, 33 | { 34 | "id": 3, 35 | "title": "ArcGIS REST Example 1 (Legend image)", 36 | "sourceOptions": { 37 | "type": "arcgisrest", 38 | "layer": "0", 39 | "queryable": true, 40 | "url": "https://services8.arcgis.com/DxiA7PucIZzprCzK/arcgis/rest/services/2021_CKQ_GLOBAL/FeatureServer" 41 | } 42 | }, 43 | { 44 | "id": 4, 45 | "title": "ArcGIS REST Example 2 (Legend SVG (Dashed line))", 46 | "sourceOptions": { 47 | "type": "arcgisrest", 48 | "layer": "18", 49 | "queryable": true, 50 | "url": "https://services8.arcgis.com/DxiA7PucIZzprCzK/arcgis/rest/services/2021_CKQ_GLOBAL/FeatureServer" 51 | } 52 | }, 53 | { 54 | "id": 5, 55 | "title": "ArcGIS REST Example 3 (Legend SVG (Unique values))", 56 | "sourceOptions": { 57 | "type": "arcgisrest", 58 | "layer": "16", 59 | "queryable": true, 60 | "url": "https://services8.arcgis.com/DxiA7PucIZzprCzK/arcgis/rest/services/2021_CKQ_GLOBAL/FeatureServer" 61 | } 62 | }, 63 | { 64 | "id": 6, 65 | "title": "ArcGIS REST Example 4 (Legend SVG (Simple line))", 66 | "sourceOptions": { 67 | "type": "arcgisrest", 68 | "layer": "22", 69 | "queryable": true, 70 | "url": "https://services8.arcgis.com/DxiA7PucIZzprCzK/arcgis/rest/services/2021_CKQ_GLOBAL/FeatureServer" 71 | } 72 | }, 73 | { 74 | "id": 8, 75 | "title": "Image ArcGIS REST Example 1", 76 | "sourceOptions": { 77 | "type": "imagearcgisrest", 78 | "queryFormat": "esrijson", 79 | "layer": "2", 80 | "queryable": true, 81 | "url": "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer" 82 | } 83 | }, 84 | { 85 | "id": 9, 86 | "title": "Image ArcGIS REST Example 2", 87 | "sourceOptions": { 88 | "type": "imagearcgisrest", 89 | "queryFormat": "esrijson", 90 | "layer": "1", 91 | "queryable": true, 92 | "url": "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Hurricanes/MapServer" 93 | } 94 | }, 95 | { 96 | "id": 10, 97 | "title": "Image ArcGIS REST Example 3", 98 | "sourceOptions": { 99 | "type": "imagearcgisrest", 100 | "queryFormat": "esrijson", 101 | "layer": "0", 102 | "queryable": true, 103 | "url": "https://gisp.dfo-mpo.gc.ca/arcgis/rest/services/FGP/Seafloor_SubstratBenthique/MapServer" 104 | } 105 | } 106 | ] 107 | } 108 | --------------------------------------------------------------------------------