From a54d4be5b462b7f644ae2d5a971563d02037f46b Mon Sep 17 00:00:00 2001 From: Simon C Date: Fri, 18 Feb 2022 18:17:03 +0100 Subject: [PATCH] first commit --- .dockerignore | 4 + .drone.yml | 158 +++++++++++++++++ .editorconfig | 10 ++ .env | 3 + .gitignore | 3 + .gitmodules | 3 + Dockerfile | 4 + assets/js/main.js | 61 +++++++ assets/js/sw.js | 12 ++ assets/styles/main.sass | 9 + config/_default/config.yml | 42 +++++ config/development/config.yml | 1 + config/production/config.yml | 1 + config/staging/config.yml | 1 + content/.drone.yml | 167 ++++++++++++++++++ content/_index.md | 157 ++++++++++++++++ data/ceiba.yml | 82 +++++++++ docker-compose.prod.yml | 28 +++ docker-compose.staging.yml | 20 +++ layouts/_default/question.json.json | 3 + layouts/api/item.json.json | 22 +++ layouts/index.html | 34 ++++ layouts/partials/scores.html | 29 +++ run | 24 +++ scripts/directus-to-markdown/index.js | 81 +++++++++ .../@resilien/directus-to-markdown | 1 + .../node_modules/url-slug | 1 + scripts/directus-to-markdown/package.json | 11 ++ static/images/pwa-icon-256.png | Bin 0 -> 7379 bytes static/images/pwa-icon-512.png | Bin 0 -> 16609 bytes static/manifest.json | 25 +++ themes/hugo-theme-lowtech | 1 + 32 files changed, 998 insertions(+) create mode 100644 .dockerignore create mode 100644 .drone.yml create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Dockerfile create mode 100644 assets/js/main.js create mode 100644 assets/js/sw.js create mode 100644 assets/styles/main.sass create mode 100644 config/_default/config.yml create mode 100644 config/development/config.yml create mode 100644 config/production/config.yml create mode 100644 config/staging/config.yml create mode 100644 content/.drone.yml create mode 100644 content/_index.md create mode 100644 data/ceiba.yml create mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.staging.yml create mode 100644 layouts/_default/question.json.json create mode 100644 layouts/api/item.json.json create mode 100644 layouts/index.html create mode 100644 layouts/partials/scores.html create mode 100755 run create mode 100644 scripts/directus-to-markdown/index.js create mode 120000 scripts/directus-to-markdown/node_modules/@resilien/directus-to-markdown create mode 120000 scripts/directus-to-markdown/node_modules/url-slug create mode 100644 scripts/directus-to-markdown/package.json create mode 100644 static/images/pwa-icon-256.png create mode 100644 static/images/pwa-icon-512.png create mode 100644 static/manifest.json create mode 160000 themes/hugo-theme-lowtech diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f205c0b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +# Ignore everything +** + +!public diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..e71f59e --- /dev/null +++ b/.drone.yml @@ -0,0 +1,158 @@ +--- +# drone encrypt weko/scores.ceiba-conseil.com $REGISTRY_PASSWORD +kind: secret +name: REGISTRY_PASSWORD +data: BW8D91fKNJuWWF5k5F/CNi8GIQvmNEUocqPJJ+N57qxQ06y+G9q715PBFpys5BTKUQHPQqSd7Q6MhWpsOc5Ttn/gtCX1tbGrAqsFrEec + +--- +# drone encrypt weko/scores.ceiba-conseil.com $REGISTRY_USER +kind: secret +name: REGISTRY_USER +data: dlboI6U0j0jZxVQiF62p9lQkpFBg7M4QtiD6K7K3NtQmkw== + +--- +# drone encrypt weko/scores.ceiba-conseil.com "{\"auths\":{\"https://registry.weko.io\":{\"auth\":\"$(echo -n "$REGISTRY_USER:$REGISTRY_PASSWORD" | base64)\",\"email\":\"$REGISTRY_USER\"}}}" +kind: secret +name: REGISTRY_CONFIG +data: B0svjVRqxyDJE+MmSPPCU2hWbBzTjYHS6CnV6IAzGxrQPVNbGmEqoCWkBsG6tUFhL3JcU+fYEidV+RVHTRpYumbDWTXlBSz0q3BVsfqxvgWb2JgpvO7/X3rIxCZwECMMMm7nyRubsOeFDzFh9ic1cU4Bw2DTA+L65lWGiEGME/KqCi6yKy56KjmAC8kAoJ9ifw++KsGytvZjPI68+bbWpRFTAuwWU3SDv12y + +--- +# drone encrypt weko/scores.ceiba-conseil.com $DIRECTUS_URL +kind: secret +name: DIRECTUS_URL +data: Z1mUl3LdiVP6vClaVeA56nTafKHIevYaRKqqYDKycN5im+M93XvrZbK995EDreb4cttMD1jMmJaq3NQ= + +--- +# drone encrypt weko/scores.ceiba-conseil.com $DIRECTUS_TOKEN +kind: secret +name: DIRECTUS_TOKEN +data: C4N8jh2kDORa5vo2mqOcqbBLLBXdcnHNDq9sK6+R9gzemeyzLp3K7ENw5ZibVYAJ2VEYylQr9zvHFeFE + +# --- +# kind: pipeline +# type: docker +# name: prod +# +# platform: +# os: linux +# arch: arm64 +# +# steps: +# - name: install submodule +# image: drone/git +# commands: +# - git submodule update --init +# +# - name: install npm +# image: node:current-alpine +# volumes: +# - name: hugo-theme-lowtech_node_modules +# path: /drone/src/themes/hugo-theme-lowtech/node_modules +# # environment: +# # DIRECTUS_URL: +# # from_secret: DIRECTUS_URL +# # DIRECTUS_TOKEN: +# # from_secret: DIRECTUS_TOKEN +# commands: +# - (cd themes/hugo-theme-lowtech && npm i) +# # - node scripts/directus-to-markdown/index.js +# +# - name: build website +# image: jakejarvis/hugo-extended +# commands: +# - hugo --minify --environment production +# +# - name: typo +# image: node:current-alpine +# volumes: +# - name: hugo-theme-lowtech_node_modules +# path: /drone/src/themes/hugo-theme-lowtech/node_modules +# commands: +# - node themes/hugo-theme-lowtech/scripts/typo +# +# - name: push docker image on registry +# image: plugins/docker +# settings: +# username: +# from_secret: REGISTRY_USER +# password: +# from_secret: REGISTRY_PASSWORD +# repo: registry.weko.io/sisa-urfe_fr +# registry: registry.weko.io +# tags: +# - latest +# +# image_pull_secrets: +# - REGISTRY_CONFIG +# +# volumes: +# - name: hugo-theme-lowtech_node_modules +# host: +# path: /tmp/drone/cache/weko/scores.ceiba-conseil.com/themes/hugo-theme-lowtech + +--- +kind: pipeline +type: docker +name: staging + +platform: + os: linux + arch: arm64 + +steps: +- name: install submodule + image: drone/git + commands: + - git submodule update --init + +- name: install npm + image: node:current-alpine + volumes: + - name: hugo-theme-lowtech_node_modules + path: /drone/src/themes/hugo-theme-lowtech/node_modules + environment: + DIRECTUS_URL: + from_secret: DIRECTUS_URL + DIRECTUS_TOKEN: + from_secret: DIRECTUS_TOKEN + commands: + - (cd themes/hugo-theme-lowtech && npm i) + - node scripts/directus-to-markdown/index.js + +- name: build website + image: jakejarvis/hugo-extended + environment: + HUGO_PARAMS_DIRECTUS_URL: + from_secret: DIRECTUS_URL + HUGO_PARAMS_DIRECTUS_TOKEN: + from_secret: DIRECTUS_TOKEN + commands: + - hugo --minify --buildDrafts --buildFuture --environment staging + +- name: typo + image: node:current-alpine + volumes: + - name: hugo-theme-lowtech_node_modules + path: /drone/src/themes/hugo-theme-lowtech/node_modules + commands: + - node themes/hugo-theme-lowtech/scripts/typo + +- name: push docker image on registry + image: plugins/docker + settings: + username: + from_secret: REGISTRY_USER + password: + from_secret: REGISTRY_PASSWORD + repo: registry.weko.io/scores_ceiba + registry: registry.weko.io + tags: + - staging + +image_pull_secrets: +- REGISTRY_CONFIG + +volumes: +- name: hugo-theme-lowtech_node_modules + host: + path: /tmp/drone/cache/weko/scores.ceiba-conseil.com/themes/hugo-theme-lowtech diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0bf5d83 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.env b/.env new file mode 100644 index 0000000..8ba6b27 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +DOCKER_CONTEXT=vert.weko.resilien +NAME=vert.weko.resilien +URL=scores.ceiba-conseil.com diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..026173a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +resources +public +.hugo_build.lock diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b426a68 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/hugo-theme-lowtech"] + path = themes/hugo-theme-lowtech + url = https://git.weko.io/kosssi/hugo-theme-lowtech.git diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3f66d28 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM registry.weko.io/nginx-lowtech:0.0.9 + +# Copie des sources du site +COPY public /usr/share/nginx/html diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..bd44980 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,61 @@ +if ('serviceWorker' in navigator) { + // Use the window load event to keep the page load performant + window.addEventListener('load', () => { + navigator.serviceWorker.register('/js/sw.js').then(function(reg) { + if(reg.installing) { + console.log('Service worker installing'); + } else if(reg.waiting) { + console.log('Service worker installed'); + } else if(reg.active) { + console.log('Service worker active'); + } + + }).catch(function(error) { + // registration failed + console.log('Registration failed with ' + error); + }); + }); +} + + +async function main () { + const forms = document.getElementsByClassName('form') + for (const form of forms) { + const fieldsName = [...new Set(Array.from(form.querySelectorAll("input")).map(item => item.name))] + const scoreFields = Array.from(form.querySelectorAll(".score")) + form.addEventListener('change', function() { + const fieldsValue = fieldsName.map(fieldName => { + const field = form.querySelector('input[name="' + fieldName + '"]:checked') + if (field) return field.value + }).filter(item => item !== undefined) + if (fieldsName.length == fieldsValue.length) { + const score = fieldsValue.reduce((accumulator, curr) => parseInt(accumulator) + parseInt(curr)) + scoreFields.map(item => { + item.classList.remove('active') + return item + }).filter(item => { + return score >= item.dataset.min && (item.dataset.max == "" || score <= item.dataset.max) + }).map(item => { + item.classList.add('active') + console.log(item.getElementsByClassName('score_' + form.dataset.id)) + Array.from(item.getElementsByClassName('score_' + form.dataset.id)).map(item => item.innerHTML = score) + }) + } + var all = form.querySelectorAll("input") + const scoreField = document.getElementsByClassName('score_' + form.dataset.id) + var score = 0 + for (let field of all) { + if (field.type != "submit" && field.type != "button") { + if (field.type=="radio" || field.type=="checkbox") { + if (field.checked) { + score = score + parseInt(field.value) + } + } + } + } + scoreField.innerHTML = score + }); + } +} + +main() diff --git a/assets/js/sw.js b/assets/js/sw.js new file mode 100644 index 0000000..5c99487 --- /dev/null +++ b/assets/js/sw.js @@ -0,0 +1,12 @@ +self.addEventListener('install', function(event) { + event.waitUntil( + caches.open('v1').then(function(cache) { + return cache.addAll([ + '/', + '/index.html', + '/styles/main.css', + '/js/main.js' + ]); + }) + ); +}); diff --git a/assets/styles/main.sass b/assets/styles/main.sass new file mode 100644 index 0000000..3794f44 --- /dev/null +++ b/assets/styles/main.sass @@ -0,0 +1,9 @@ +h1, h2 + text-align: center + +.score + display: none + margin: 1rem + + &.active + display: inherit diff --git a/config/_default/config.yml b/config/_default/config.yml new file mode 100644 index 0000000..9aa4ad4 --- /dev/null +++ b/config/_default/config.yml @@ -0,0 +1,42 @@ +languageCode: fr-fr + +title: Ceiba App + +theme: + - hugo-theme-lowtech + +defaultContentLanguage: fr + +disableKinds: + - taxonomy + - term + +# params: +# FaviconFile: /favicon.svg +# ImageSize: 1040x +# SocialImage: RESILIEN_LOGO_SLOGAN_disc_slogan.svg + +outputs: + page: + - json + section: + - json + home: + - html + +minify: + tdewolff: + html: + keepWhitespace: false + +markup: + goldmark: + parser: + attribute: + block: true + renderer: + unsafe: true + +disableHugoGeneratorInject: true + +enableRobotsTXT: true diff --git a/config/development/config.yml b/config/development/config.yml new file mode 100644 index 0000000..a0a27dc --- /dev/null +++ b/config/development/config.yml @@ -0,0 +1 @@ +baseURL: http://localhost:1313/ diff --git a/config/production/config.yml b/config/production/config.yml new file mode 100644 index 0000000..13c9e93 --- /dev/null +++ b/config/production/config.yml @@ -0,0 +1 @@ +baseURL: https://scores.ceiba-conseil.com/ diff --git a/config/staging/config.yml b/config/staging/config.yml new file mode 100644 index 0000000..adf54de --- /dev/null +++ b/config/staging/config.yml @@ -0,0 +1 @@ +baseURL: https://staging.scores.ceiba-conseil.com/ diff --git a/content/.drone.yml b/content/.drone.yml new file mode 100644 index 0000000..2020627 --- /dev/null +++ b/content/.drone.yml @@ -0,0 +1,167 @@ +--- +# drone encrypt weko/sisa-urfe_fr $REGISTRY_PASSWORD +kind: secret +name: REGISTRY_PASSWORD +data: g8m2Y3gcKcCC10HLLVQDTlsxIGBeAaNqAXXjOzFId3Ib88cvCGxqkE5su7Qvo97xvoqu/09jIWXjf30vecYiqum+pQv4imYfhuzzsrag + +--- +# drone encrypt weko/sisa-urfe_fr $REGISTRY_USER +kind: secret +name: REGISTRY_USER +data: pe0ODYOxonYnAjd2YR3O5LN/sHjWJc31Lmvom+VfnuKrrQ== + +--- +# drone encrypt weko/sisa-urfe_fr "{\"auths\":{\"https://registry.weko.io\":{\"auth\":\"$(echo -n "$REGISTRY_USER:$REGISTRY_PASSWORD" | base64)\",\"email\":\"$REGISTRY_USER\"}}}" +kind: secret +name: REGISTRY_CONFIG +data: i5xaNdkAH0n5IDgIn4OVRwViez97c62RHau8eELYJHnossMU797dow6bW77bGyMIx0ONwcOmdtDH92kpci/GeZmyPrCvODrXwt9pTAMEdVelQ3jy/mxpdtB/p5qJ6u+9CrUBw/S67ImY3yhr8o95pdpJFclkqWRsrjeg1BSHRF8RnEAQ9yBwXxoEXpSZBCnlSwG1z0cDY3JwFUH8LVQgldopiiaDAhk09dpk + +--- +# drone encrypt weko/sisa-urfe_fr $DIRECTUS_URL +kind: secret +name: DIRECTUS_URL +data: 3SzmP61E8oSo5PLSWnHRBUfUCa0Fe9cfc3C2ADXe7cvuY45sNXCn+YjVCL1M3yG5wJsEbEUh + +--- +# drone encrypt weko/sisa-urfe_fr $DIRECTUS_TOKEN +kind: secret +name: DIRECTUS_TOKEN +data: Dxlod5HBIa5S897CsQsaDPbZDqYLuIL7z4kQahf4jlWxyme79fsK7LhZVHPDRfQJf1HknAgGWJUUqhL3 + +# --- +# kind: pipeline +# type: docker +# name: prod +# +# platform: +# os: linux +# arch: arm64 +# +# steps: +# - name: install submodule +# image: drone/git +# commands: +# - git submodule update --init +# +# - name: install npm +# image: node:current-alpine +# volumes: +# - name: hugo-theme-lowtech_node_modules +# path: /drone/src/themes/hugo-theme-lowtech/node_modules +# # environment: +# # DIRECTUS_URL: +# # from_secret: DIRECTUS_URL +# # DIRECTUS_TOKEN: +# # from_secret: DIRECTUS_TOKEN +# commands: +# - (cd themes/hugo-theme-lowtech && npm i) +# # - node scripts/directus-to-markdown/index.js +# +# - name: build website +# image: jakejarvis/hugo-extended +# commands: +# - hugo --minify --environment production +# +# - name: typo +# image: node:current-alpine +# volumes: +# - name: hugo-theme-lowtech_node_modules +# path: /drone/src/themes/hugo-theme-lowtech/node_modules +# commands: +# - node themes/hugo-theme-lowtech/scripts/typo +# +# - name: push docker image on registry +# image: plugins/docker +# settings: +# username: +# from_secret: REGISTRY_USER +# password: +# from_secret: REGISTRY_PASSWORD +# repo: registry.weko.io/sisa-urfe_fr +# registry: registry.weko.io +# tags: +# - latest +# +# image_pull_secrets: +# - REGISTRY_CONFIG +# +# volumes: +# - name: hugo-theme-lowtech_node_modules +# host: +# path: /tmp/drone/cache/weko/sisa-urfe_fr/themes/hugo-theme-lowtech + +--- +kind: pipeline +type: docker +name: staging + +platform: + os: linux + arch: arm64 + +steps: +- name: install submodule + image: drone/git + commands: + - git submodule update --init + +- name: install npm + image: node:current-alpine + volumes: + - name: hugo-theme-lowtech_node_modules + path: /drone/src/themes/hugo-theme-lowtech/node_modules + - name: assets + path: /drone/src/assets/node_modules + environment: + DIRECTUS_URL: + from_secret: DIRECTUS_URL + DIRECTUS_TOKEN: + from_secret: DIRECTUS_TOKEN + commands: + - (cd themes/hugo-theme-lowtech && npm i) + - (cd assets && npm i) + - DRAFT=true node scripts/directus-to-markdown/index.js + +- name: build website + image: jakejarvis/hugo-extended + environment: + HUGO_PARAMS_DIRECTUS_URL: + from_secret: DIRECTUS_URL + HUGO_PARAMS_DIRECTUS_TOKEN: + from_secret: DIRECTUS_TOKEN + volumes: + - name: assets + path: /drone/src/assets/node_modules + commands: + - hugo --minify --buildDrafts --buildFuture --environment staging + +- name: typo + image: node:current-alpine + volumes: + - name: hugo-theme-lowtech_node_modules + path: /drone/src/themes/hugo-theme-lowtech/node_modules + commands: + - node themes/hugo-theme-lowtech/scripts/typo + +- name: push docker image on registry + image: plugins/docker + settings: + username: + from_secret: REGISTRY_USER + password: + from_secret: REGISTRY_PASSWORD + repo: registry.weko.io/sisa-urfe_fr + registry: registry.weko.io + tags: + - staging + +image_pull_secrets: +- REGISTRY_CONFIG + +volumes: +- name: assets + host: + path: /tmp/drone/cache/weko/sisa-urfe_fr/assets/node_modules +- name: hugo-theme-lowtech_node_modules + host: + path: /tmp/drone/cache/weko/sisa-urfe_fr/themes/hugo-theme-lowtech diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..dda1889 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,157 @@ +--- +id: 1 +sort: null +title: Facteurs de sécurité cavité ouverte sur tronc +results: + - id: 1 + sort: 0 + min: 0 + max: 2 + facteur: Très au delà de 5 + effets: Capacité de charge très supérieure à la charge de service + pde: Improbable + pde_qtra: 7 + - id: 2 + sort: 1 + min: 2.5 + max: 4.5 + facteur: Au delà de 5 + effets: Capacité de charge supérieure à la charge de service + pde: Très faible + pde_qtra: 6 + - id: 3 + sort: 2 + min: 5 + max: 7 + facteur: Entre 4 et 5 + effets: >- + Capacité de charge normalement (coef moyen) supérieure à la charge de + service + pde: Faible + pde_qtra: 5 + - id: 4 + sort: 3 + min: 7.5 + max: 9.5 + facteur: Entre 2 et 4 + effets: >- + Capacité de charge supérieure à la charge de service mais sous le coef + moyen + pde: Echec possible sous contraintes très anormales + pde_qtra: 4 + - id: 5 + sort: 4 + min: 10 + max: 12 + facteur: Entre 1 et 2 + effets: Capacité de charge s'approchant de la charge de service + pde: Echec possible sous contraintes anormales + pde_qtra: 3 + - id: 6 + sort: 5 + min: 12.5 + max: 14.5 + facteur: ~ 1 + effets: Capacité de charge plus ou moins égale à la charge de service + pde: Echec possible sous contraintes courantes + pde_qtra: 2 + - id: 7 + sort: 6 + min: 15 + max: null + facteur: < 1 + effets: Charge de service supérieure à la capacité de charge + pde: Echec imminent sous contraintes courantes ou masse propre + pde_qtra: 1 +questions: + - id: 9 + sort: 0 + title: Matériau résiduel (PRBS) + answers: + - id: 1 + sort: 0 + title: '= 25%' + weight: 1 + - id: 2 + sort: 1 + title: de 25 à 10 % + weight: 2 + - id: 3 + sort: 2 + title: < 10 % + weight: 4 + - id: 11 + sort: 1 + title: Adaptations géométriques + answers: + - id: 6 + sort: 0 + title: Très forte croissance accrue + weight: -1 + - id: 7 + sort: 1 + title: Forte croissance accrue + weight: 0 + - id: 8 + sort: 2 + title: Faibles croissance accrue + weight: 2 + - id: 9 + sort: 3 + title: Sans croissance accrue + weight: 5 + - id: 12 + sort: 2 + title: Rapport H/D (+-20% de marge) + answers: + - id: 10 + sort: 0 + title: < 15 + weight: 0 + - id: 11 + sort: 1 + title: Entre 15 et 30 + weight: 1 + - id: 12 + sort: 2 + title: Entre 30 et 50 + weight: 2 + - id: 13 + sort: 3 + title: Entre 50 et 70 + weight: 3 + - id: 14 + sort: 4 + title: '> 70' + weight: 4 + - id: 13 + sort: 3 + title: Organes de soutiens structurels + answers: + - id: 15 + sort: 0 + title: OSS caractérisés et intègres + weight: 1 + - id: 16 + sort: 1 + title: OSS relatifs et intègres + weight: 2 + - id: 17 + sort: 2 + title: OSS caractérisés, partiellement dégradés + weight: 3 + - id: 18 + sort: 3 + title: OSS relatifs et partiellement dégradés + weight: 4 + - id: 19 + sort: 4 + title: OSS insuffisants et intègres + weight: 5 + - id: 20 + sort: 5 + title: OSS insuffisants et dégradés + weight: 6 +--- + + diff --git a/data/ceiba.yml b/data/ceiba.yml new file mode 100644 index 0000000..080ce9a --- /dev/null +++ b/data/ceiba.yml @@ -0,0 +1,82 @@ +--- + +app: + categories: + houppier: + title: Houppier + tronc: + title: Tronc + recinaire: + title: Collet et départs racinaires + kpi: + - id: form_1 + title: Matériaux résiduels + choices: + - id: 1 + title: 100% + weight: 4 + order: 1 + - id: 2 + title: = 25 % + weight: 3 + order: 2 + - id: 3 + title: De 25 à 10 % + weight: 2 + order: 3 + - id: 4 + title: < 10 % + weight: 1 + order: 4 + - titles: Adaptations géométriques + choices: + - id: 5 + title: Caractérisées + weight: 3 + order: 1 + - id: 6 + title: Adaptatives + weight: 2 + order: 2 + - id: 7 + title: Relatives + weight: 2 + order: 3 + - id: 8 + title: Insuffisantes à nulles + weight: 1 + order: 4 + - titles: Rapport H/D + choices: + - title: < 15 + weight: 3 + order: 1 + - title: Entre 15 et 30 + weight: 2 + order: 2 + - title: Entre 30 et 50 + weight: 2 + order: 3 + - title: Entre 50 et 70 + weight: 1 + order: 4 + - title: > 70 + weight: 0 + order: 5 + - titles: Symptômes de pourriture évolutive + choices: + - title: Aucun + weight: 3 + order: 1 + - title: Supperficiels, locaux + weight: 2 + order: 2 + - title: Superficiels, + de 25 % + weight: 2 + order: 3 + - title: Dommageables, peu compensés + weight: 1 + order: 4 + - title: Dommageables, non compensés/démarqués + weight: 0 + order: 5 diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..a02d18d --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,28 @@ +version: "3.8" + +volumes: + ceiba-log: + name: ceiba-log + ceiba-stats: + name: ceiba-stats + +services: + scores_ceiba-prod: + container_name: ceiba-prod + build: . + image: registry.weko.io/scores_ceiba:latest + restart: always + labels: + traefik.enable: "true" + traefik.http.routers.ceiba.rule: "Host(`${URL}`)" + traefik.http.routers.ceiba.entrypoints: "web" + com.centurylinklabs.watchtower.enable: true + volumes: + - ceiba-log:/var/log/nginx + - ceiba-stats:/usr/share/nginx/html/stats + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + +networks: + default: + name: traefik diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml new file mode 100644 index 0000000..1e86fa3 --- /dev/null +++ b/docker-compose.staging.yml @@ -0,0 +1,20 @@ +version: "3.8" + +networks: + default: + name: traefik + +services: + scores_ceiba-staging: + container_name: ceiba-staging + build: . + image: registry.weko.io/scores_ceiba:staging + restart: always + labels: + traefik.enable: "true" + traefik.http.routers.ceiba-staging.rule: "Host(`staging.${URL}`)" + traefik.http.routers.ceiba-staging.entrypoints: "web" + com.centurylinklabs.watchtower.enable: true + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro diff --git a/layouts/_default/question.json.json b/layouts/_default/question.json.json new file mode 100644 index 0000000..41f0996 --- /dev/null +++ b/layouts/_default/question.json.json @@ -0,0 +1,3 @@ + { + "id": 1 + } diff --git a/layouts/api/item.json.json b/layouts/api/item.json.json new file mode 100644 index 0000000..f54af3e --- /dev/null +++ b/layouts/api/item.json.json @@ -0,0 +1,22 @@ + { + "id": {{ .Params.id }}, + "sort": {{ .Params.sort }}, + "title": "{{ .Title }}", + "questions": [{{ range $index, $question := .Params.questions }} + {{ if $index }}, {{ end }} + { + "id": {{ $question.id }}, + "sort": {{ $index }}, + "title": "{{ $question.title }}", + "answers": [{{ range $i, $answer := $question.answers }} + { + "id": {{ $answer.id }}, + "sort": {{ $i }}, + "title": "{{ $answer.title }}", + "weight": "{{ $answer.weight }}", + } + {{ end }}] + } + {{ end }}] + "permalink" : "{{ .Permalink }}" + } diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..38b1b95 --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,34 @@ + + + + + Hello World + + {{ $style := resources.Get "styles/main.sass" }} + {{ with $style }} + {{ $styleCSS := . | toCSS }} + + {{ end }} + + + + + +

Ceiba App

+ + {{ partial "scores" . }} + + {{ $js := resources.Get "js/sw.js" }} + {{ with $js }} + {{ $secureJS := . | js.Build }} + + {{ end }} + + {{ $js := resources.Get "js/main.js" }} + {{ with $js }} + {{ $secureJS := . | js.Build }} + + {{ end }} + + + diff --git a/layouts/partials/scores.html b/layouts/partials/scores.html new file mode 100644 index 0000000..833aa33 --- /dev/null +++ b/layouts/partials/scores.html @@ -0,0 +1,29 @@ +{{ $formId := .Params.id }} +
+

{{ .Title }}

+
+ {{ range .Params.questions }} +
+ {{ .title }} + {{ $questionId := .id }} + {{ range .answers }} +
+ +
+ {{ end }} +
+ {{ end }} + + {{ range .Params.results }} +
+ Score :
+ Facteur de sécurité : {{ .facteur }}
+ Effets sur la capacité de charge : {{ .effets }}
+ Probabilité d'échec (PdE) : {{ .pde }}
+ PdE QTRA : {{ .pde_qtra }} +
+ {{ end }} +
+
diff --git a/run b/run new file mode 100755 index 0000000..bf27f5c --- /dev/null +++ b/run @@ -0,0 +1,24 @@ +#!/bin/bash + +# -e Exit immediately if a command exits with a non-zero status. +# -u Treat unset variables as an error when substituting. +set -eu + +. ./.env +. ./themes/hugo-theme-lowtech/scripts/run + +echo " ____ _ _ _ " +echo "| _ \ ___ ___(_) | (_) ___ _ __ " +echo "| |_) / _ \/ __| | | | |/ _ \ '_ \ " +echo "| _ < __/\__ \ | |___| | __/ | | |" +echo "|_| \_\___||___/_|_____|_|\___|_| |_|" +echo +echo + +if [ $# -ge 1 ]; then + $@ +else + help_generic +fi + +end diff --git a/scripts/directus-to-markdown/index.js b/scripts/directus-to-markdown/index.js new file mode 100644 index 0000000..57c6781 --- /dev/null +++ b/scripts/directus-to-markdown/index.js @@ -0,0 +1,81 @@ +import DirectusToMarkdown from '@resilien/directus-to-markdown' +import urlslug from 'url-slug' + +const getTranslation = (translations, lang, field) => { + const match = translations.filter(translation => translation.languages_code == lang || translation.languages_id == lang) + return match.length > 0 ? match[0][field] : undefined +} + +const formatQuestions = (questions, lang) => { + + const formated = [] + for (const [i, question] of questions.entries()) { + formated.push({ + id: question.questions_id.id, + sort: question.sort, + title: getTranslation(question.questions_id.translations, lang, 'title'), + answers: formatAnswers(question.questions_id.answers, lang) + }) + } + + return formated +} + +const formatAnswers = (answers, lang) => { + const formated = [] + for (const [i, answer] of answers.entries()) { + formated.push({ + id: answer.answers_id.id, + sort: answer.sort, + title: getTranslation(answer.answers_id.translations, lang, 'title'), + weight: answer.answers_id.weight + }) + } + + return formated +} + +const formatScore = (score, lang) => { + score.title = getTranslation(score.translations, lang, 'title') + delete score.translations + + return score +} + +const formatResults = (results, lang) => { + const formated = [] + for (const [i, result] of results.entries()) { + formated.push({ + id: result.results_id.id, + sort: result.sort, + min: result.results_id.min, + max: result.results_id.max, + facteur: getTranslation(result.results_id.translations, lang, 'facteur'), + effets: getTranslation(result.results_id.translations, lang, 'effets'), + pde: getTranslation(result.results_id.translations, lang, 'pde'), + pde_qtra: result.results_id.pde_qtra, + }) + } + + return formated +} + +const config = { + collections: { + scores: { + readByQueryOption: { + fields: ['*', 'translations.*', 'questions.sort', 'questions.questions_id.*', 'questions.questions_id.translations.*', 'questions.questions_id.answers.*', 'questions.questions_id.answers.answers_id.*', 'questions.questions_id.answers.answers_id.translations.*', 'results.*', 'results.results_id.*', 'results.results_id.translations.*'] + }, + pathBuilder: (score) => { + const lang = 'fr-FR' + score = formatScore(score, lang) + score.questions = formatQuestions(score.questions, lang) + score.results = formatResults(score.results, lang) + return `./content`; + }, + deleteFields: ['path'] + } + } +} + +new DirectusToMarkdown(config).export(); diff --git a/scripts/directus-to-markdown/node_modules/@resilien/directus-to-markdown b/scripts/directus-to-markdown/node_modules/@resilien/directus-to-markdown new file mode 120000 index 0000000..fceff24 --- /dev/null +++ b/scripts/directus-to-markdown/node_modules/@resilien/directus-to-markdown @@ -0,0 +1 @@ +../../../../themes/hugo-theme-lowtech/node_modules/@resilien/directus-to-markdown \ No newline at end of file diff --git a/scripts/directus-to-markdown/node_modules/url-slug b/scripts/directus-to-markdown/node_modules/url-slug new file mode 120000 index 0000000..44b3fc9 --- /dev/null +++ b/scripts/directus-to-markdown/node_modules/url-slug @@ -0,0 +1 @@ +../../../themes/hugo-theme-lowtech/node_modules/url-slug \ No newline at end of file diff --git a/scripts/directus-to-markdown/package.json b/scripts/directus-to-markdown/package.json new file mode 100644 index 0000000..007610d --- /dev/null +++ b/scripts/directus-to-markdown/package.json @@ -0,0 +1,11 @@ +{ + "name": "directus-to-markdown", + "version": "0.0.0", + "description": "Translates content from Directus.io to gohugo.io", + "main": "index.js", + "type": "module", + "dependencies": { + "@resilien/directus-to-markdown": "file:../../themes/hugo-theme-lowtech/node_modules/@resilien/directus-to-markdown", + "url-slug": "file:../../themes/hugo-theme-lowtech/node_modules/url-slug" + } +} diff --git a/static/images/pwa-icon-256.png b/static/images/pwa-icon-256.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5b41d11530c6e65b0b97945212c12e36052761 GIT binary patch literal 7379 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 literal 0 HcmV?d00001 diff --git a/static/images/pwa-icon-512.png b/static/images/pwa-icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..26e9fa27f704cf394c220f53dda08e82a5d0c154 GIT binary patch literal 16609 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 literal 0 HcmV?d00001 diff --git a/static/manifest.json b/static/manifest.json new file mode 100644 index 0000000..2848777 --- /dev/null +++ b/static/manifest.json @@ -0,0 +1,25 @@ +{ + "name": "My First Progressive Web app", + "short_name": "First PWA", + "theme_color": "#eb5252", + "background_color": "#000000", + "display": "fullscreen", + "Scope": "/", + "orientation": "portrait", + "icons": [ + { + "src": "/images/pwa-icon-256.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/images/pwa-icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "lang": "fr-FR", + "start_url": "index.html" +} diff --git a/themes/hugo-theme-lowtech b/themes/hugo-theme-lowtech new file mode 160000 index 0000000..d5c0ebd --- /dev/null +++ b/themes/hugo-theme-lowtech @@ -0,0 +1 @@ +Subproject commit d5c0ebda145e1c4c6c474d0e58823332ab3d8b1e