Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client
1 result
Show changes
Commits on Source (43)
Showing
with 443 additions and 142 deletions
......@@ -3,10 +3,36 @@ stages:
- build
- deploy
default:
services:
- name: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09-dind
alias: docker
variables:
DEPENDENCY_PROXY: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/
build_branch:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
stage: build
except:
- master
- recette
- dev
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE/feat:$CI_COMMIT_REF_SLUG" --build-arg conf=prod .
- docker push "$CI_REGISTRY_IMAGE/feat:$CI_COMMIT_REF_SLUG"
build:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
services:
- docker:18.09-dind
stage: build
only:
- master
......@@ -16,30 +42,33 @@ build:
- docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" --build-arg conf=prod .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
build_dev:
build-release:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
services:
- docker:18.09-dind
stage: build
only:
- dev
- tags
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
- docker push "$CI_REGISTRY_IMAGE:dev"
- docker build --pull -t "$CI_REGISTRY_IMAGE/tags:$CI_COMMIT_TAG" --build-arg conf=prod .
- docker push "$CI_REGISTRY_IMAGE/tags:$CI_COMMIT_TAG"
build_json_server:
build_dev:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
services:
- docker:18.09-dind
stage: build
only:
- dev
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE:json_server" ./api/
- docker push "$CI_REGISTRY_IMAGE:json_server"
when: manual
- docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
- docker push "$CI_REGISTRY_IMAGE:dev"
deploy_dev:
stage: deploy
......@@ -53,19 +82,9 @@ deploy_dev:
- docker-compose pull web-app
- docker-compose up -d web-app
- docker system prune -a -f
deploy_mobile:
stage: deploy
tags:
- deploy
only:
- mobile
script:
- cd /home/mps/ram
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker-compose pull web-app
- docker-compose up -d web-app
- docker system prune -a -f
environment:
name: dev
url: https://resin-dev.grandlyon.com
deploy_rec:
stage: deploy
......@@ -79,6 +98,10 @@ deploy_rec:
- docker-compose pull web-app-rec
- docker-compose up -d web-app-rec
- docker system prune -a -f
when: manual
environment:
name: rec
url: https://resin-rec.grandlyon.com
# code_analysis:
# image: skilldlabs/sonar-scanner:3.4.0
......@@ -102,26 +125,14 @@ deploy_rec:
# -Dsonar.login=${SONAR_TOKEN}
mr:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
services:
- docker:18.09-dind
stage: build
only:
- merge_requests
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
# Job for auto building pwa in case of issue
# Juste create a new branche 'pwa'
pwa-build:
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
services:
- docker:18.09-dind
stage: build
only:
- feat/poc-pwa
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE:pwa" --build-arg conf=dev .
- docker push "$CI_REGISTRY_IMAGE:pwa"
......@@ -2,6 +2,41 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [1.14.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.13.0...v1.14.0) (2022-02-21)
### Features
* **carto:** enable pop-up autopan for markers in order to have a better display on small screen ([758b319](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/758b3193f1263bb31bf46d45a67b136e5fcdaa9f))
* **carto:** put selected and hover marker on top of the others ([cc3c16c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/cc3c16c34682f8baaed15caaf8ba70a91ecf4024))
* **cicd:** rework on automation. Add feature and tag build. Better handling of dependencie proxy ([b9a6764](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/b9a67640b4c7aae589019ae57330d734e5ce3300))
* **nginx:** new conf for PWA handling ([a38b929](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a38b929207e0543857867efa355c7c014e96a99e))
* **orientation-form:** change orientation form design ([1946312](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1946312fe8b9e1a025693c53ecea6c08d21e5031))
* **post:** display attachment in post ([020c192](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/020c192182d3d275ecfecd27cdc59bdabe1e0387))
* **previewImages:** Manage post preview image independantly from post details images ([1761f74](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1761f7412c9b2645925a6ed925a585fdae8326f9))
* **print-orientation:** graphic update for the print at the end of the orientation ([335ba0a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/335ba0af1e97893ba2f3107366598eb67a9fd1fd))
* **reset-password:** add notification when reset email is sent ([ed857c5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/ed857c5ca45086ac30a4f1977ac5ae524b15161a))
* **searchResults:** Add page descriptions ([c15012f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/c15012fc12aaa9d43e27d273d75b12f77ac90e44))
### Bug Fixes
* **admin:** broken link in structure was making admin panel crash ([51ffbb4](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/51ffbb429cbf546c44765cf7f80e37e2dae48d0c))
* **cicd:** fix deploy issue after variables adding ([0d9f2fc](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/0d9f2fca8ed2ee8aca43d839f8ceb69053f7359a))
* **cicd:** job build issue on service ([74c091f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/74c091f0486b2f7db555b825c15189b32967e581))
* **cicd:** variable usage was making deploy job fail ([2461c64](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2461c64b7a88dd2f6cd5f90ad530be726c5537da))
* missing label on footer button ([9662f7e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/9662f7e78b8ba74a0e2c182bd670b088891baf9b))
* **news:** change updated date display to created date ([b4c323c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/b4c323c464ef361b0568af56d550c8a4953be2e1))
* **news:** created date in post list ([6d2ada7](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6d2ada7c02b4c1efdb83c0f2e2770a385f4856a2))
* **news:** issue in responsive, width of post-container is now fixed ([8fa4923](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/8fa492345262bdcea440010d467d0a0179d49ae3))
* **news:** issue on news display, tag duplication and page display were broken ([7099003](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/70990035c6c417ad82f00c5d560e239c7d9a86fe))
* **news:** tag refactor for 'a-la-une' tag. This tag is no longer display if there is another tag on the same post. ([9d0be47](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/9d0be47f1e6fe7a4cd684d6c2b65299bc6ccb0f0))
* **orientation-form:** fix formation list ([2b5a449](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2b5a4490f8287d045be49481ab475027cf596219))
* **orientation-form:** remove geoloc button in carto from orientation form ([070d15d](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/070d15d913900a40186ab06f43504880b3b1b20e))
* **posts:** remove image width forced to 100% in post details ([055e9cb](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/055e9cbe0db90f9409192d7d03b6363ee0f9a2a3))
* **print-orientation:** progression percentage is 100% when printing ([5a2c196](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5a2c196462a126646d2ae1e0b76760dd338876ab))
* typo in mobile menu ([cb3ebc7](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/cb3ebc7a5dc6c20d9451a0cee1558f5241554f63))
## [1.13.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.12.0...v1.13.0) (2022-02-07)
......
# Stage 0, based on Node.js, to build and compile Angular
FROM node:14.18-slim as build
ARG DEPENDENCY_PROXY=
FROM ${DEPENDENCY_PROXY}node:14.18-slim as build
WORKDIR /app
......@@ -24,7 +25,7 @@ ARG conf
RUN npm run build:prod
# Stage 1, based on Nginx, to have only the compiled app
FROM nginx
FROM ${DEPENDENCY_PROXY}nginx
# copy artifact build from the 'build environment'
RUN apt-get update
......
......@@ -48,8 +48,7 @@ server {
}
location /api {
rewrite ^/api/(.*) /$1 break;
proxy_pass http://service-ram:3000/api;
proxy_pass http://service-ram:3000;
}
location /base-adresse/base-adresse-nationale/streets {
......
......@@ -28,6 +28,16 @@
"maxAge": "12h",
"timeout": "5s"
}
},
{
"name": "api",
"urls": ["/api/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 10000,
"maxAge": "12h",
"timeout": "5s"
}
}
]
}
{
"name": "pamn",
"version": "1.13.0",
"version": "1.14.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......@@ -9878,6 +9878,12 @@
"vary": "^1"
}
},
"corser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
"integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=",
"dev": true
},
"cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
......@@ -12074,6 +12080,12 @@
"integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==",
"dev": true
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true
},
"hosted-git-info": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
......@@ -12095,6 +12107,15 @@
"wbuf": "^1.1.0"
}
},
"html-encoding-sniffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
"integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"dev": true,
"requires": {
"whatwg-encoding": "^2.0.0"
}
},
"html-entities": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
......@@ -12257,6 +12278,78 @@
}
}
},
"http-server": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.0.tgz",
"integrity": "sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==",
"dev": true,
"requires": {
"basic-auth": "^2.0.1",
"chalk": "^4.1.2",
"corser": "^2.0.1",
"he": "^1.2.0",
"html-encoding-sniffer": "^3.0.0",
"http-proxy": "^1.18.1",
"mime": "^1.6.0",
"minimist": "^1.2.5",
"opener": "^1.5.1",
"portfinder": "^1.0.28",
"secure-compare": "3.0.1",
"union": "~0.5.0",
"url-join": "^4.0.1"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
......@@ -14746,6 +14839,12 @@
"integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
"dev": true
},
"opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"dev": true
},
"optionator": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
......@@ -16694,6 +16793,12 @@
"get-assigned-identifiers": "^1.1.0"
}
},
"secure-compare": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
"integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=",
"dev": true
},
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
......@@ -18196,6 +18301,15 @@
}
}
},
"union": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
"integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
"dev": true,
"requires": {
"qs": "^6.4.0"
}
},
"unique-filename": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
......@@ -18316,6 +18430,12 @@
"punycode": "^2.1.0"
}
},
"url-join": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
"dev": true
},
"url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
......@@ -18733,6 +18853,26 @@
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true
},
"whatwg-encoding": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
"dev": true,
"requires": {
"iconv-lite": "0.6.3"
},
"dependencies": {
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
}
}
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
......
{
"name": "pamn",
"version": "1.13.0",
"version": "1.14.0",
"scripts": {
"ng": "ng",
"start": "ng serve --configuration=fr --proxy-config proxy.conf.json",
......
<div id="structure-list" *ngIf="structures.data.structures && structures.data.structures.length != 0">
<p *ngFor="let structure of structures.data.structures">
<a href="/acteurs?id={{ structure._id }}" target="_blank">{{ structure.structureName }}</a>
<a *ngIf="structure" href="/acteurs?id={{ structure._id }}" target="_blank">{{ structure.structureName }}</a>
</p>
</div>
......@@ -39,6 +39,7 @@ import { OrientationFormComponent } from './form/orientation-form/orientation-fo
import { StructureDetailPrintComponent } from './form/orientation-form/component/structure-detail-print/structure-detail-print.component';
import { StructureListPrintComponent } from './form/orientation-form/component/structure-list-print/structure-list-print.component';
import { StructurePrintHeaderComponent } from './form/orientation-form/component/structure-print-header/structure-print-header.component';
import { OrientationComponent } from './form/orientation-form/component/orientation-modal/orientation-modal.component';
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
import { StructureResolver } from './resolvers/structure.resolver';
......@@ -71,6 +72,7 @@ import { UpdateService } from './services/update.service';
StructureDetailPrintComponent,
StructureListPrintComponent,
StructurePrintHeaderComponent,
OrientationComponent,
],
imports: [
BrowserModule,
......
......@@ -29,7 +29,7 @@
height: calc(100vh - #{$header-height} - #{$footer-height});
@media #{$tablet} {
padding: 0;
height: 100%;
height: calc(100vh - #{$header-height});
}
}
.btnSwitch {
......
import { Component, OnInit } from '@angular/core';
import { Meta } from '@angular/platform-browser';
const { DateTime } = require('luxon');
import * as _ from 'lodash';
......@@ -30,7 +31,8 @@ export class CartoComponent implements OnInit {
constructor(
private structureService: StructureService,
private geoJsonService: GeojsonService,
private activatedRoute: ActivatedRoute
private activatedRoute: ActivatedRoute,
private meta: Meta
) {}
ngOnInit(): void {
......@@ -45,6 +47,11 @@ export class CartoComponent implements OnInit {
if (history.state.data) {
this.currentStructure = new Structure(history.state.data);
}
this.meta.updateTag({
name: 'description',
content: 'Recense tous les lieux, accompagnements et ateliers de médiation numérique de la Métropole de Lyon.',
});
}
public getStructures(filters: Filter[]): void {
......
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { Meta } from '@angular/platform-browser';
import { ContactMessage } from '../models/contact-message.model';
import { AuthService } from '../services/auth.service';
import { ContactService } from '../services/contact.service';
......@@ -23,7 +24,8 @@ export class ContactComponent implements OnInit {
private router: Router,
private authService: AuthService,
private notificationService: NotificationService,
public utils: Utils
public utils: Utils,
private meta: Meta
) {}
ngOnInit(): void {
......@@ -37,6 +39,12 @@ export class ContactComponent implements OnInit {
subject: ['', Validators.required],
message: ['', Validators.required],
});
this.meta.updateTag({
name: 'description',
content:
"Formulaire pour contacter Rés'IN, le Réseau des acteurs de l'inclusion numérique de la métropole de Lyon",
});
}
public get isLoggedIn(): boolean {
......
<div fxLayout="row" fxLayoutGap="10px" fxLayoutAlign="center center">
<button class="btn-primary small previous" (click)="goToPreviousPage()">
<div fxLayout="row" [ngClass]="{ column: hasFinishButton() }" fxLayoutGap="10px" fxLayoutAlign="center center">
<button *ngIf="displayPreviousButton" class="btn-primary small previous" (click)="goToPreviousPage()">
<div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">
<svg class="chevronLeft" aria-hidden="true">
<use [attr.xlink:href]="'assets/form/sprite.svg#chevronLeft'"></use>
......@@ -7,6 +7,16 @@
{{ btnName[0] }}
</div>
</button>
<button *ngIf="hasFinishButton()" class="btn-primary small previous" (click)="finishedModal()">
<div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">
<svg class="flag" aria-hidden="true">
<use [attr.xlink:href]="'/assets/ico/flag.svg'"></use>
</svg>
{{ btnName[2] }}
</div>
</button>
<button
class="btn-primary small next"
(click)="goToNextPage()"
......@@ -14,9 +24,15 @@
type="submit"
[ngClass]="{ invalid: !isValid }"
>
<div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">
{{ btnName[1]
}}<svg class="chevronRight" aria-hidden="true">
<div *ngIf="btnName[1] == 'Imprimer'" fxLayout="row" fxLayoutAlign="center center">
<svg class="print" aria-hidden="true">
<use [attr.xlink:href]="'/assets/ico/print.svg'"></use>
</svg>
{{ btnName[1] }}
</div>
<div *ngIf="btnName[1] != 'Imprimer'" class="rowBtn" fxLayout="row" fxLayoutAlign="center center">
{{ btnName[1] }}
<svg class="chevronRight" aria-hidden="true">
<use [attr.xlink:href]="'assets/form/sprite.svg#chevronRight'"></use>
</svg>
</div>
......
@import '../../../assets/scss/color';
@import '../../../assets/scss/typography';
@import '../../../assets/scss/breakpoint';
.btn-primary {
&.previous {
background-color: initial;
background-color: $white;
color: $grey-2;
border: solid $grey-4 1px;
}
&.invalid {
opacity: 0.4;
}
&:focus .print {
background-color: $secondary-color;
}
&.next {
.rowBtn {
margin-left: 24px;
}
}
&.invalid {
opacity: 0.4;
}
.column {
@media #{$phone} {
flex-direction: column !important;
button {
margin-bottom: 10px !important;
margin-right: 0 !important;
}
}
}
......@@ -25,6 +42,22 @@
.chevronRight {
height: 24px;
width: 24px;
stroke: inherit;
margin-left: 10px;
}
.print {
stroke: $white;
width: 20px;
height: 20px;
padding-right: 20px;
background-color: $white;
mask: url(/assets/ico/print.svg) no-repeat center;
}
.flag {
padding-right: 10px;
stroke: $black;
width: 20px;
height: 20px;
background-color: $grey-1;
mask: url(/assets/ico/flag.svg) no-repeat center;
}
......@@ -5,19 +5,26 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
templateUrl: './footer-form.component.html',
styleUrls: ['./footer-form.component.scss'],
})
export class FooterFormComponent implements OnInit {
export class FooterFormComponent {
@Input() isValid: boolean;
@Input() btnName: string[];
@Input() displayPreviousButton: boolean = true;
@Output() nextPage = new EventEmitter<any>();
@Output() previousPage = new EventEmitter<any>();
constructor() {}
ngOnInit(): void {}
@Output() endPage = new EventEmitter<any>();
public goToNextPage(): void {
this.nextPage.emit();
}
public goToPreviousPage(): void {
this.previousPage.emit();
}
public hasFinishButton(): boolean {
return this.btnName.length == 3;
}
public finishedModal(): void {
this.endPage.emit();
}
}
<div *ngIf="openned" class="modalBackground">
<div class="modal">
<div
(clickOutside)="closeModal(false)"
class="contentModal"
fxLayout="row-reverse"
fxLayoutAlign="space-around start"
>
<div class="ico-close">
<div class="ico-close-wrapper">
<div (click)="closeModal()" class="ico-close-details"></div>
</div>
</div>
<div class="modalContent">
<h3 fxLayoutAlign="center center">Souhaitez-vous terminer cette orientation ?</h3>
<div class="footerModal" fxLayout="row" fxLayoutAlign="space-around center">
<button type="button" class="btn confirm" (click)="goToPreviousPage()">Revenir aux résultats</button>
<button class="btn-primary small previous" routerLink="../home">
<div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">
<img class="flag" src="/assets/ico/flag.svg" alt />
Terminer
</div>
</button>
</div>
</div>
</div>
</div>
</div>
@import '../../../../../assets/scss/typography';
@import '../../../../../assets/scss/color';
.ico-close-details {
margin-right: 16px;
}
h3 {
margin: 8% 15%;
text-align: center;
@include cn-regular-18;
color: $grey-2;
}
.modalContent {
margin: 0 32px;
width: 100%;
}
.footerModal {
margin: 25px;
}
.modalBackground .modal .footerModal .btn.confirm {
font-size: 14px;
font-weight: normal;
}
.flag {
padding-right: 10px;
stroke: $white;
}
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { OrientationComponent } from './orientation-modal.component';
describe('OrientationModalComponent', () => {
let component: OrientationComponent;
let fixture: ComponentFixture<OrientationComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [OrientationComponent],
imports: [HttpClientTestingModule],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(OrientationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, EventEmitter, Input, Output } from '@angular/core';
@Component({
selector: 'app-orientation-modal',
templateUrl: './orientation-modal.component.html',
styleUrls: ['./orientation-modal.component.scss'],
})
export class OrientationComponent {
@Input() public openned: boolean;
@Output() closed = new EventEmitter();
@Output() previousPage = new EventEmitter();
public closeModal(): void {
this.closed.emit();
}
public goToPreviousPage(): void {
this.closeModal();
this.previousPage.emit();
}
}
......@@ -3,76 +3,18 @@
<div fxLayout="row" class="structure-details-block" fxLayoutAlign="baseline baseline" fxLayoutGap="8px">
<div fxLayout="column" fxLayoutGap="10px" fxFlex="100%">
<div fxLayout="column" class="no-margin" fxLayoutAlign="space-between start">
<h2 class="bold">{{ structure.structureName }}</h2>
</div>
<div fxLayout="row" fxLayoutAlign="space-between center">
<div class="typeInformationHeader" fxLayout="column">
<h3>{{ structure.getLabelTypeStructure() }}</h3>
</div>
<h3 class="bold">{{ structure.structureName }}</h3>
</div>
<div class="mobile-column">
<div fxLayout="column" fxFlex="50%">
<div fxLayout="column" fxFlex="100%">
<div *ngIf="structure.address" fxLayout="row" fxLayoutAlign="none flex-end" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'adress'" [title]="'Adresse'"></app-svg-icon>
<p>{{ structure.address.numero }} {{ structure.address.street }}, {{ structure.address.commune }}</p>
</div>
<div *ngIf="structure.website" fxLayout="row" fxLayoutAlign="none flex-end" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'web'" [title]="'Site web'"></app-svg-icon>
<a
target="_blank"
class="custom-link"
rel="noopener noreferrer"
[href]="structure.website.includes('http') ? structure.website : 'http://' + structure.website"
>{{ structure.website | url }}</a
>
</div>
<div *ngIf="structure.hasSocialNetwork()" fxLayout="row" fxLayoutAlign="none baseline" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'network'"></app-svg-icon>
<div fxLayout="row" fxLayoutAlign="none baseline" fxLayoutGap="8px">
<a
*ngIf="structure.facebook"
target="_blank"
class="custom-link"
rel="noopener noreferrer"
[href]="'http://' + structure.facebook"
>
<app-svg-icon [type]="'ico'" [icon]="'facebook'" [title]="'Facebook'"></app-svg-icon
></a>
<a
*ngIf="structure.twitter"
target="_blank"
class="custom-link"
rel="noopener noreferrer"
[href]="'http://' + structure.twitter"
>
<app-svg-icon [type]="'ico'" [icon]="'twitter'" [title]="'Twitter'"></app-svg-icon
></a>
<a
*ngIf="structure.instagram"
target="_blank"
class="custom-link"
rel="noopener noreferrer"
[href]="'http://' + structure.instagram"
>
<app-svg-icon [type]="'ico'" [icon]="'instagram'" [title]="'Instagram'"></app-svg-icon
></a>
<a
*ngIf="structure.linkedin"
target="_blank"
class="custom-link"
rel="noopener noreferrer"
[href]="'http://' + structure.linkedin"
>
<app-svg-icon [type]="'ico'" [icon]="'linkedin'" [title]="'Linkedin'"></app-svg-icon
></a>
</div>
</div>
<div *ngIf="structure.contactPhone" fxLayout="row" fxLayoutAlign="none flex-end" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'tel'" [title]="'Téléphone'"></app-svg-icon>
<p>{{ structure.contactPhone | phone }}</p>
</div>
</div>
<div fxLayout="column" fxFlex="50%">
<div
*ngIf="structure.contactMail && structure.contactMail !== 'unknown@unknown.com'"
fxLayout="row"
......@@ -82,23 +24,8 @@
<app-svg-icon [type]="'ico'" [iconClass]="'grey-1'" [icon]="'email'" [title]="'Email'"></app-svg-icon>
<p>{{ structure.contactMail }}</p>
</div>
<div *ngIf="structure.hasPassNumeric()" fxLayout="row" fxLayoutAlign="none center" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'pass'" [title]="'Pass numérique'"></app-svg-icon>
<p>agréé Pass Numérique</p>
</div>
<div fxLayout="row" fxLayoutAlign="none flex-end" fxLayoutGap="13px">
<app-svg-icon [type]="'ico'" [icon]="'calendar'"></app-svg-icon>
<p>Mise à jour le {{ structure.updatedAt | date: 'mediumDate' }}</p>
</div>
</div>
</div>
<div>
{{ structure.description }}
</div>
<div class="info">
{{ structure.lockdownActivity }}
</div>
</div>
</div>
<!-- Accueil -->
......@@ -119,7 +46,9 @@
<h4>{{ day.key | day }}</h4>
<div class="opening-time" fxLayout="row" fxLayoutAlign="none flex-end">
<div *ngFor="let timeRange of day.value.time; let isFirst = first">
<p *ngIf="isFirst && timeRange.opening">de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}</p>
<p *ngIf="isFirst && timeRange.opening">
de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}
</p>
<p *ngIf="!isFirst && timeRange.opening">
et de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}
</p>
......