From 413abccd3c4031bcdb60935de34d1c932515b1dd Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 2 Apr 2020 13:19:56 +0200 Subject: [PATCH 01/11] Add default order to dossier.dossier_operation_logs --- app/models/dossier.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index c8e13c658..1411b5df7 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -43,7 +43,7 @@ class Dossier < ApplicationRecord has_many :previous_followers_instructeurs, -> { distinct }, through: :previous_follows, source: :instructeur has_many :avis, inverse_of: :dossier, dependent: :destroy - has_many :dossier_operation_logs, dependent: :nullify + has_many :dossier_operation_logs, -> { order(:created_at) }, dependent: :nullify, inverse_of: :dossier belongs_to :groupe_instructeur has_one :procedure, through: :groupe_instructeur From 725cfa45d3995199d1778b53be89cc22b22edb93 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 2 Apr 2020 15:03:39 +0200 Subject: [PATCH 02/11] Do not set processed_at if already defined --- app/models/dossier.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 1411b5df7..adb1de4fd 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -729,7 +729,7 @@ class Dossier < ApplicationRecord self.en_construction_at = Time.zone.now elsif en_instruction? && !self.en_instruction_at self.en_instruction_at = Time.zone.now - elsif TERMINE.include?(state) + elsif TERMINE.include?(state) && !self.processed_at self.processed_at = Time.zone.now end end From ca6c97bf0f432175b14277274791736895ea4f67 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 2 Apr 2020 15:07:30 +0200 Subject: [PATCH 03/11] Refactor expired dossiers deletion service --- .../expired_dossiers_deletion_service_spec.rb | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/spec/services/expired_dossiers_deletion_service_spec.rb b/spec/services/expired_dossiers_deletion_service_spec.rb index aecca6f64..3961bbd68 100644 --- a/spec/services/expired_dossiers_deletion_service_spec.rb +++ b/spec/services/expired_dossiers_deletion_service_spec.rb @@ -1,14 +1,18 @@ describe ExpiredDossiersDeletionService do + let(:warning_period) { 1.month + 5.days } + let(:conservation_par_defaut) { 3.months } + let(:user) { create(:user) } + let(:procedure) { create(:procedure, :published) } + let(:procedure_2) { create(:procedure, :published) } + describe '#process_expired_dossiers_brouillon' do - let(:draft_expiration) { 1.month + 5.days } - let!(:today) { Time.zone.now.at_midnight } - let!(:procedure) { create(:procedure, :published, duree_conservation_dossiers_dans_ds: 6) } - let!(:date_close_to_expiration) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months + 1.month } - let!(:date_expired) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months - 6.days } - let!(:date_not_expired) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months + 2.months } + let(:today) { Time.zone.now.at_midnight } + let(:date_close_to_expiration) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months + 1.month } + let(:date_expired) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months - 6.days } + let(:date_not_expired) { Date.today - procedure.duree_conservation_dossiers_dans_ds.months + 2.months } context 'send messages for dossiers expiring soon and delete expired' do - let!(:expired_brouillon) { create(:dossier, procedure: procedure, created_at: date_expired, brouillon_close_to_expiration_notice_sent_at: today - (draft_expiration + 1.day)) } + let!(:expired_brouillon) { create(:dossier, procedure: procedure, created_at: date_expired, brouillon_close_to_expiration_notice_sent_at: today - (warning_period + 1.day)) } let!(:brouillon_close_to_expiration) { create(:dossier, procedure: procedure, created_at: date_close_to_expiration) } let!(:brouillon_close_but_with_notice_sent) { create(:dossier, procedure: procedure, created_at: date_close_to_expiration, brouillon_close_to_expiration_notice_sent_at: Time.zone.now) } let!(:valid_brouillon) { create(:dossier, procedure: procedure, created_at: date_not_expired) } @@ -25,7 +29,7 @@ describe ExpiredDossiersDeletionService do expect(DossierMailer).to have_received(:notify_brouillon_near_deletion).with([brouillon_close_to_expiration], brouillon_close_to_expiration.user.email) end - it 'dossier state should change' do + it 'dossier brouillon_close_to_expiration_notice_sent_at should change' do expect(brouillon_close_to_expiration.reload.brouillon_close_to_expiration_notice_sent_at).not_to be_nil end @@ -39,8 +43,6 @@ describe ExpiredDossiersDeletionService do end describe '#send_brouillon_expiration_notices' do - let!(:conservation_par_defaut) { 3.months } - before { Timecop.freeze(Time.zone.now) } after { Timecop.return } @@ -49,7 +51,7 @@ describe ExpiredDossiersDeletionService do end context 'with a single dossier' do - let!(:dossier) { create(:dossier, created_at: created_at) } + let!(:dossier) { create(:dossier, procedure: procedure, created_at: created_at) } before { ExpiredDossiersDeletionService.send_brouillon_expiration_notices } @@ -70,9 +72,8 @@ describe ExpiredDossiersDeletionService do end context 'with 2 dossiers to notice' do - let!(:user) { create(:user) } - let!(:dossier_1) { create(:dossier, user: user, created_at: (conservation_par_defaut - 1.month + 1.day).ago) } - let!(:dossier_2) { create(:dossier, user: user, created_at: (conservation_par_defaut - 1.month + 1.day).ago) } + let!(:dossier_1) { create(:dossier, procedure: procedure, user: user, created_at: (conservation_par_defaut - 1.month + 1.day).ago) } + let!(:dossier_2) { create(:dossier, procedure: procedure_2, user: user, created_at: (conservation_par_defaut - 1.month + 1.day).ago) } before { ExpiredDossiersDeletionService.send_brouillon_expiration_notices } @@ -82,8 +83,6 @@ describe ExpiredDossiersDeletionService do end describe '#delete_expired_brouillons_and_notify' do - let!(:warning_period) { 1.month + 5.days } - before { Timecop.freeze(Time.zone.now) } after { Timecop.return } @@ -92,7 +91,7 @@ describe ExpiredDossiersDeletionService do end context 'with a single dossier' do - let!(:dossier) { create(:dossier, brouillon_close_to_expiration_notice_sent_at: notice_sent_at) } + let!(:dossier) { create(:dossier, procedure: procedure, brouillon_close_to_expiration_notice_sent_at: notice_sent_at) } before { ExpiredDossiersDeletionService.delete_expired_brouillons_and_notify } @@ -121,9 +120,8 @@ describe ExpiredDossiersDeletionService do end context 'with 2 dossiers to delete' do - let!(:user) { create(:user) } - let!(:dossier_1) { create(:dossier, user: user, brouillon_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } - let!(:dossier_2) { create(:dossier, user: user, brouillon_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } + let!(:dossier_1) { create(:dossier, procedure: procedure, user: user, brouillon_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } + let!(:dossier_2) { create(:dossier, procedure: procedure_2, user: user, brouillon_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } before { ExpiredDossiersDeletionService.delete_expired_brouillons_and_notify } @@ -133,8 +131,6 @@ describe ExpiredDossiersDeletionService do end describe '#send_en_construction_expiration_notices' do - let!(:conservation_par_defaut) { 3.months } - before { Timecop.freeze(Time.zone.now) } after { Timecop.return } @@ -144,7 +140,7 @@ describe ExpiredDossiersDeletionService do end context 'with a single dossier' do - let!(:dossier) { create(:dossier, :en_construction, :followed, en_construction_at: en_construction_at) } + let!(:dossier) { create(:dossier, :en_construction, :followed, procedure: procedure, en_construction_at: en_construction_at) } before { ExpiredDossiersDeletionService.send_en_construction_expiration_notices } @@ -170,9 +166,8 @@ describe ExpiredDossiersDeletionService do end context 'with 2 dossiers to notice' do - let!(:user) { create(:user) } - let!(:dossier_1) { create(:dossier, :en_construction, user: user, en_construction_at: (conservation_par_defaut - 1.month + 1.day).ago) } - let!(:dossier_2) { create(:dossier, :en_construction, user: user, en_construction_at: (conservation_par_defaut - 1.month + 1.day).ago) } + let!(:dossier_1) { create(:dossier, :en_construction, procedure: procedure, user: user, en_construction_at: (conservation_par_defaut - 1.month + 1.day).ago) } + let!(:dossier_2) { create(:dossier, :en_construction, procedure: procedure_2, user: user, en_construction_at: (conservation_par_defaut - 1.month + 1.day).ago) } let!(:instructeur) { create(:instructeur) } @@ -190,7 +185,6 @@ describe ExpiredDossiersDeletionService do end context 'when an instructeur is also administrateur' do - let!(:procedure) { create(:procedure, :published) } let!(:administrateur) { procedure.administrateurs.first } let!(:dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: (conservation_par_defaut - 1.month + 1.day).ago) } @@ -217,7 +211,7 @@ describe ExpiredDossiersDeletionService do end context 'with a single dossier' do - let!(:dossier) { create(:dossier, :en_construction, :followed, en_construction_close_to_expiration_notice_sent_at: notice_sent_at) } + let!(:dossier) { create(:dossier, :en_construction, :followed, procedure: procedure, en_construction_close_to_expiration_notice_sent_at: notice_sent_at) } let(:deleted_dossier) { DeletedDossier.find_by(dossier_id: dossier.id) } before { ExpiredDossiersDeletionService.delete_expired_en_construction_and_notify } @@ -253,9 +247,8 @@ describe ExpiredDossiersDeletionService do end context 'with 2 dossiers to delete' do - let!(:user) { create(:user) } - let!(:dossier_1) { create(:dossier, :en_construction, user: user, en_construction_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } - let!(:dossier_2) { create(:dossier, :en_construction, user: user, en_construction_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } + let!(:dossier_1) { create(:dossier, :en_construction, procedure: procedure, user: user, en_construction_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } + let!(:dossier_2) { create(:dossier, :en_construction, procedure: procedure_2, user: user, en_construction_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) } let(:deleted_dossier_1) { DeletedDossier.find_by(dossier_id: dossier_1.id) } let(:deleted_dossier_2) { DeletedDossier.find_by(dossier_id: dossier_2.id) } From aa56cfd7a012ebb97c59b93a8d86b6ffe08b106d Mon Sep 17 00:00:00 2001 From: kara Diaby Date: Thu, 26 Mar 2020 10:34:25 +0100 Subject: [PATCH 04/11] migrate map to mapbox-gl with a react component --- app/javascript/components/MapReader.js | 114 +++++++ app/javascript/loaders/MapReader.js | 3 + app/views/shared/champs/carte/_show.html.haml | 5 +- config/initializers/assets.rb | 1 + .../initializers/content_security_policy.rb | 2 +- config/webpack/environment.js | 3 + package.json | 2 + yarn.lock | 278 +++++++++++++++++- 8 files changed, 402 insertions(+), 6 deletions(-) create mode 100644 app/javascript/components/MapReader.js create mode 100644 app/javascript/loaders/MapReader.js diff --git a/app/javascript/components/MapReader.js b/app/javascript/components/MapReader.js new file mode 100644 index 000000000..3f2eaa681 --- /dev/null +++ b/app/javascript/components/MapReader.js @@ -0,0 +1,114 @@ +import React from 'react'; +import ReactMapboxGl, { ZoomControl, GeoJSONLayer } from 'react-mapbox-gl'; +import { LngLatBounds } from 'mapbox-gl'; +import PropTypes from 'prop-types'; + +const Map = ReactMapboxGl({}); + +const MapReader = ({ geoData }) => { + let [selectionCollection, cadastresCollection] = [[], []]; + + for (let selection of geoData.selection.coordinates) { + selectionCollection.push({ + type: 'Feature', + geometry: { + type: 'Polygon', + coordinates: selection + } + }); + } + + for (let cadastre of geoData.cadastres) { + cadastresCollection.push({ + type: 'Feature', + geometry: { + type: 'Polygon', + coordinates: cadastre.geometry.coordinates[0] + } + }); + } + + const selectionData = { + type: 'geojson', + data: { + type: 'FeatureCollection', + features: selectionCollection + } + }; + + const cadastresData = { + type: 'geojson', + data: { + type: 'FeatureCollection', + features: cadastresCollection + } + }; + + const polygonSelectionFill = { + 'fill-color': '#EC3323', + 'fill-opacity': 0.5 + }; + + const polygonSelectionLine = { + 'line-color': 'rgba(255, 0, 0, 1)', + 'line-width': 4 + }; + + const polygonCadastresFill = { + 'fill-color': '#9CA090', + 'fill-opacity': 0.5 + }; + + const polygonCadastresLine = { + 'line-color': 'rgba(156, 160, 144, 255)', + 'line-width': 2, + 'line-dasharray': [1, 1] + }; + + let bounds = new LngLatBounds(); + + for (let selection of selectionCollection) { + for (let coordinate of selection.geometry.coordinates[0]) { + bounds.extend(coordinate); + } + } + let [swCoords, neCoords] = [ + Object.values(bounds._sw), + Object.values(bounds._ne) + ]; + const boundData = [swCoords, neCoords]; + + return ( + + + + + + ); +}; + +MapReader.propTypes = { + geoData: PropTypes.shape({ + position: PropTypes.object, + selection: PropTypes.object, + cadastres: PropTypes.array + }) +}; + +export default MapReader; diff --git a/app/javascript/loaders/MapReader.js b/app/javascript/loaders/MapReader.js new file mode 100644 index 000000000..adb90193f --- /dev/null +++ b/app/javascript/loaders/MapReader.js @@ -0,0 +1,3 @@ +import Loadable from '../components/Loadable'; + +export default Loadable(() => import('../components/MapReader')); diff --git a/app/views/shared/champs/carte/_show.html.haml b/app/views/shared/champs/carte/_show.html.haml index 224d79cb0..8aa9b4dbf 100644 --- a/app/views/shared/champs/carte/_show.html.haml +++ b/app/views/shared/champs/carte/_show.html.haml @@ -1,4 +1,7 @@ - if champ.to_s.present? - .carte{ data: { geo: geo_data(champ) } } + - if supported_browser? + = react_component("MapReader", { geoData: champ.to_render_data } ) + - else + %p La carte n'est pas compatible avec votre navigateur. Afin de l'afficher, nous vous conseillons d'utiliser Chrome, Firefox ou Safari .geo-areas = render partial: 'shared/champs/carte/geo_areas', locals: { champ: champ, error: false } diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 1535e55ba..82025de9c 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -6,6 +6,7 @@ Rails.application.config.assets.version = '1.0' # Add additional assets to the asset load path Rails.application.config.assets.paths << Rails.root.join('node_modules', 'trix', 'dist') Rails.application.config.assets.paths << Rails.root.join('node_modules', 'select2', 'dist', 'css') +Rails.application.config.assets.paths << Rails.root.join('node_modules', 'mapbox-gl', 'dist') # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 63eaa7b7a..0f48a942b 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -8,7 +8,7 @@ Rails.application.config.content_security_policy do |policy| # c'est trop compliqué pour être rectifié immédiatement (et sans valeur ajoutée: # c'est hardcodé dans les vues, donc pas injectable). policy.style_src :self, "*.crisp.chat", "crisp.chat", :unsafe_inline - policy.connect_src :self, "wss://*.crisp.chat", "*.crisp.chat", "*.demarches-simplifiees.fr", "in-automate.sendinblue.com", "app.franceconnect.gouv.fr", "sentry.io", "geo.api.gouv.fr", "api-adresse.data.gouv.fr" + policy.connect_src :self, "wss://*.crisp.chat", "*.crisp.chat", "*.demarches-simplifiees.fr", "in-automate.sendinblue.com", "app.franceconnect.gouv.fr", "sentry.io", "geo.api.gouv.fr", "api-adresse.data.gouv.fr", "openmaptiles.geo.data.gouv.fr", "openmaptiles.github.io" # Pour tout le reste, par défaut on accepte uniquement ce qui vient de chez nous # et dans la notification on inclue la source de l'erreur policy.default_src :self, :data, :report_sample, "fonts.gstatic.com", "in-automate.sendinblue.com", "player.vimeo.com", "app.franceconnect.gouv.fr", "sentry.io", "static.demarches-simplifiees.fr", "*.crisp.chat", "crisp.chat", "*.crisp.help", "*.sibautomation.com", "sibautomation.com", "data" diff --git a/config/webpack/environment.js b/config/webpack/environment.js index 97e4aa14c..971d33c08 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -9,6 +9,9 @@ const resolve = { environment.splitChunks(); environment.config.merge({ resolve }); +environment.loaders.get( + 'nodeModules' +).exclude = /(?:@?babel(?:\/|\\{1,2}|-).+)|regenerator-runtime|core-js|^webpack$|^webpack-assets-manifest$|^webpack-cli$|^webpack-sources$|^@rails\/webpacker$|^mapbox-gl$|/; // Uncoment next lines to run webpack-bundle-analyzer // const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); diff --git a/package.json b/package.json index 3c5f81061..5cfd2b229 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,13 @@ "jquery": "^3.4.1", "leaflet": "^1.6.0", "leaflet-freedraw": "^2.12.0", + "mapbox-gl": "^1.9.0", "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", "react-intersection-observer": "^8.25.2", "react-loadable": "^5.5.0", + "react-mapbox-gl": "^4.8.3", "react-scroll-to-component": "^1.0.2", "react-sortable-hoc": "^1.11.0", "react_ujs": "^2.6.1", diff --git a/yarn.lock b/yarn.lock index cf106e02f..bddc579ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -895,6 +895,65 @@ dependencies: prop-types "^15.5.10" +"@mapbox/geojson-area@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz#18d7814aa36bf23fbbcc379f8e26a22927debf10" + integrity sha1-GNeBSqNr8j+7zDefjiaiKSfevxA= + dependencies: + wgs84 "0.0.0" + +"@mapbox/geojson-rewind@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.4.1.tgz#357d79300adb7fec7c1f091512988bca6458f068" + integrity sha512-mxo2MEr7izA1uOXcDsw99Kgg6xW3P4H2j4n1lmldsgviIelpssvP+jQDivFKOHrOVJDpTTi5oZJvRcHtU9Uufw== + dependencies: + "@mapbox/geojson-area" "0.2.2" + concat-stream "~1.6.0" + minimist "^1.2.5" + sharkdown "^0.1.0" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^1.4.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.1.1.tgz#16a20c470741bfe9191deb336f46e194da4a91ff" + integrity sha512-Ihn1nZcGIswJ5XGbgFAvVumOgWpvIjBX9jiRlIl46uQG9vJOF51ViBYHF95rEZupuyQbEmhLaDPLQlU7fUTsBg== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + "@rails/actiontext@^6.0.2-1": version "6.0.2-1" resolved "https://registry.yarnpkg.com/@rails/actiontext/-/actiontext-6.0.2-1.tgz#6ca7750f98b5321ea6ec0cd81c1a3d3c2c9046e5" @@ -1025,6 +1084,18 @@ "@turf/helpers" "6.x" "@turf/meta" "6.x" +"@turf/bbox@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-4.7.3.tgz#e3ad4f10a7e9b41b522880d33083198199059067" + integrity sha1-461PEKfptBtSKIDTMIMZgZkFkGc= + dependencies: + "@turf/meta" "^4.7.3" + +"@turf/helpers@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-4.7.3.tgz#bc312ac43cab3c532a483151c4c382c5649429e9" + integrity sha1-vDEqxDyrPFMqSDFRxMOCxWSUKek= + "@turf/helpers@6.x": version "6.1.4" resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.1.4.tgz#d6fd7ebe6782dd9c87dca5559bda5c48ae4c3836" @@ -1037,6 +1108,11 @@ dependencies: "@turf/helpers" "6.x" +"@turf/meta@^4.7.3": + version "4.7.4" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.7.4.tgz#6de2f1e9890b8f64b669e4b47c09b20893063977" + integrity sha1-beLx6YkLj2S2aeS0fAmyCJMGOXc= + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -1047,6 +1123,11 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/geojson@*": + version "7946.0.7" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad" + integrity sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ== + "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -1076,6 +1157,13 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/supercluster@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/supercluster/-/supercluster-5.0.2.tgz#6d01faed39b5381a1c696f8133a26418a68abde4" + integrity sha512-5PONNyiZXHS6oiW0H1rsNQ+Apkg+cqp3jP4HRhCAcgASIj3ifrFsdj1QB5TvArqT5N8RetK6UH7873COgRZwoQ== + dependencies: + "@types/geojson" "*" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1431,6 +1519,11 @@ ansi-wrap@0.1.0, ansi-wrap@^0.1.0: resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2131,6 +2224,14 @@ caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1" integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g== +cardinal@~0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-0.4.4.tgz#ca5bb68a5b511b90fe93b9acea49bdee5c32bfe2" + integrity sha1-ylu2iltRG5D+k7ms6km97lwyv+I= + dependencies: + ansicolors "~0.2.1" + redeyed "~0.4.0" + case-sensitive-paths-webpack-plugin@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e" @@ -2527,7 +2628,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -2849,6 +2950,11 @@ css-what@^2.1.2: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +csscolorparser@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -3011,7 +3117,7 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-equal@^1.0.1: +deep-equal@1.0.1, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= @@ -3215,6 +3321,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +earcut@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.2.tgz#41b0bc35f63e0fe80da7cddff28511e7e2e80d11" + integrity sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ== + ease-component@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ease-component/-/ease-component-1.0.0.tgz#b375726db0b5b04595b77440396fec7daa5d77c9" @@ -3559,6 +3670,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esprima@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= + esquery@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" @@ -4122,6 +4238,11 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -4166,6 +4287,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gl-matrix@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.2.1.tgz#2d8e35125bf854f49abded8a0c8350b1a4907a26" + integrity sha512-YYVO8jUSf6+SakL4AJmx9Jc7zAZhkJQ+WhdtX3VQe5PJdCOX6/ybY4x1vk+h94ePnjRn6uml68+QxTAJneUpvA== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -4311,6 +4437,11 @@ graceful-fs@^4.2.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + gulp-exclude-gitignore@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gulp-exclude-gitignore/-/gulp-exclude-gitignore-1.2.0.tgz#341aeb62faab428af5550da9359ceff99388f1d0" @@ -4649,7 +4780,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -ieee754@^1.1.4: +ieee754@^1.1.12, ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== @@ -5322,6 +5453,11 @@ junit-report-builder@^1.3.1: mkdirp "^0.5.0" xmlbuilder "^10.0.0" +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -5605,6 +5741,35 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mapbox-gl@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.9.0.tgz#53e3e13c99483f362b07a8a763f2d61d580255a5" + integrity sha512-PKpoiB2pPUMrqFfBJpt/oA8On3zcp0adEoDS2YIC2RA6o4EZ9Sq2NPZocb64y7ra3mLUvEb7ps1pLVlPMh6y7w== + dependencies: + "@mapbox/geojson-rewind" "^0.4.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.4.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.0" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.2" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.0.0" + grid-index "^1.1.0" + minimist "0.0.8" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.0" + vt-pbf "^3.1.1" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -5766,6 +5931,11 @@ minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" +minimist@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" + integrity sha1-16oye87PUY+RBqxrjwA/o7zqhWY= + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -5912,6 +6082,11 @@ multimatch@^2.0.0: arrify "^1.0.0" minimatch "^3.0.0" +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -6644,6 +6819,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbf@^3.0.5, pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -7392,6 +7575,11 @@ postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.23: source-map "^0.6.1" supports-color "^6.1.0" +potpack@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" + integrity sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -7448,6 +7636,11 @@ prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.2, object-assign "^4.1.1" react-is "^16.8.1" +protocol-buffers-schema@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz#2f0ea31ca96627d680bf2fefae7ebfa2b6453eae" + integrity sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA== + proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" @@ -7561,6 +7754,11 @@ querystringify@^2.0.0: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -7630,6 +7828,17 @@ react-loadable@^5.5.0: dependencies: prop-types "^15.5.0" +react-mapbox-gl@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/react-mapbox-gl/-/react-mapbox-gl-4.8.3.tgz#11f5901fe26a4c704a6a22e797bd69404c320e47" + integrity sha512-o5PrNjIyvF04G77/pWfHJI5G9yM4/IUEsNfGhyC5DTm+Ye/b61jJMAt1A6WLClpWeBXnDY5W7eVC6A2INMbgVA== + dependencies: + "@turf/bbox" "4.7.3" + "@turf/helpers" "4.7.3" + "@types/supercluster" "^5.0.1" + deep-equal "1.0.1" + supercluster "^7.0.0" + react-scroll-to-component@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/react-scroll-to-component/-/react-scroll-to-component-1.0.2.tgz#f260dc936c62a53e772786d7832fe0884e195354" @@ -7732,6 +7941,13 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redeyed@~0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-0.4.4.tgz#37e990a6f2b21b2a11c2e6a48fd4135698cba97f" + integrity sha1-N+mQpvKyGyoRwuakj9QTVpjLqX8= + dependencies: + esprima "~1.0.4" + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -7925,6 +8141,13 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8015,6 +8238,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -8250,6 +8478,15 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +sharkdown@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sharkdown/-/sharkdown-0.1.1.tgz#64484bd0f08f347f8319e9ff947a670f6b48b1b2" + integrity sha512-exwooSpmo5s45lrexgz6Q0rFQM574wYIX3iDZ7RLLqOb7IAoQZu9nxlZODU972g19sR69OIpKP2cpHTzU+PHIg== + dependencies: + cardinal "~0.4.2" + minimist "0.0.5" + split "~0.2.10" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -8464,6 +8701,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split@~0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + integrity sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc= + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -8707,6 +8951,13 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +supercluster@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.0.0.tgz#75d474fafb0a055db552ed7bd7bbda583f6ab321" + integrity sha512-8VuHI8ynylYQj7Qf6PBMWy1PdgsnBiIxujOgc9Z83QvJ8ualIYWNx2iMKyKeC4DZI5ntD9tz/CIwwZvIelixsA== + dependencies: + kdbush "^3.0.0" + supports-color@6.1.0, supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" @@ -8863,7 +9114,7 @@ through2@^3.0.0: dependencies: readable-stream "2 || 3" -through@^2.3.6: +through@2, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -8895,6 +9146,11 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== +tinyqueue@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9341,6 +9597,15 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vt-pbf@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.1.tgz#b0f627e39a10ce91d943b898ed2363d21899fb82" + integrity sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.0.5" + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -9522,6 +9787,11 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== +wgs84@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" + integrity sha1-NP3FVZF7blfPKigu0ENxDASc3HY= + whatwg-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" From 7f629ffca182b7a7c14256b7632247f45c8fbb6d Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Tue, 31 Mar 2020 16:25:21 +0200 Subject: [PATCH 05/11] identite: mark the radio buttons as actually required --- app/views/users/dossiers/identite.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/dossiers/identite.html.haml b/app/views/users/dossiers/identite.html.haml index 6e5d4cc16..1df6224d1 100644 --- a/app/views/users/dossiers/identite.html.haml +++ b/app/views/users/dossiers/identite.html.haml @@ -17,10 +17,10 @@ = f.label :gender, class: "required" .radios %label - = f.radio_button :gender, Individual::GENDER_MALE + = f.radio_button :gender, Individual::GENDER_MALE, required: true = Individual::GENDER_MALE %label - = f.radio_button :gender, Individual::GENDER_FEMALE + = f.radio_button :gender, Individual::GENDER_FEMALE, required: true = Individual::GENDER_FEMALE .flex From e166f89aa01b14b14d8e38b4bef9620ca83269ee Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Tue, 31 Mar 2020 16:26:00 +0200 Subject: [PATCH 06/11] identite: remove the "*" for required labels When all fields are required, it's better to say nothing. --- app/views/users/dossiers/identite.html.haml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app/views/users/dossiers/identite.html.haml b/app/views/users/dossiers/identite.html.haml index 1df6224d1..844714530 100644 --- a/app/views/users/dossiers/identite.html.haml +++ b/app/views/users/dossiers/identite.html.haml @@ -8,13 +8,9 @@ %p.mb-1 Merci de remplir vos informations personnelles pour accéder à la démarche. - %span.form-label - %span.mandatory * - champs requis - %fieldset %legend - = f.label :gender, class: "required" + = f.label :gender .radios %label = f.radio_button :gender, Individual::GENDER_MALE, required: true @@ -25,14 +21,14 @@ .flex .inline-champ - = f.label :prenom, class: "required" + = f.label :prenom = f.text_field :prenom, class: "small", required: true, autocomplete: 'given-name' .inline-champ - = f.label :nom, class: "required" + = f.label :nom = f.text_field :nom, class: "small", required: true, autocomplete: 'family-name' - if @dossier.procedure.ask_birthday? - = f.label :birthdate, class: "required" + = f.label :birthdate = f.date_field :birthdate, value: @dossier.individual.birthdate, placeholder: 'format : AAAA-MM-JJ', required: true, class: "small" = f.submit "Continuer", class: "button large primary expand" From 290edd9e691c72d7c31403f4d4f2f5de6d7e412c Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Thu, 2 Apr 2020 15:54:31 +0200 Subject: [PATCH 07/11] =?UTF-8?q?ameliore=20la=20d=C3=A9couvrabilit=C3=A9?= =?UTF-8?q?=20du=20fichier=20t=C3=A9l=C3=A9charg=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/instructeurs/procedures_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/instructeurs/procedures_controller.rb b/app/controllers/instructeurs/procedures_controller.rb index 7d02e0069..70386ed68 100644 --- a/app/controllers/instructeurs/procedures_controller.rb +++ b/app/controllers/instructeurs/procedures_controller.rb @@ -207,7 +207,7 @@ module Instructeurs format.js do @procedure = procedure assign_exports - flash.notice = "L’export au format \"#{export_format}\" est prêt." + flash.notice = "L’export au format \"#{export_format}\" est prêt. Vous pouvez le télécharger" end format.html do From 4fcbfffec1fd565f202395c5e3d16526c3eb3357 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Thu, 2 Apr 2020 16:06:00 +0200 Subject: [PATCH 08/11] =?UTF-8?q?laisse=20afficher=20le=20message=20flash?= =?UTF-8?q?=20avec=20le=20fichier=20=C3=A0=20t=C3=A9l=C3=A9charger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/instructeurs/procedures/download_export.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/instructeurs/procedures/download_export.js.erb b/app/views/instructeurs/procedures/download_export.js.erb index d25101ffc..1011c5162 100644 --- a/app/views/instructeurs/procedures/download_export.js.erb +++ b/app/views/instructeurs/procedures/download_export.js.erb @@ -7,4 +7,4 @@ <% end %> <% end %> -<%= render_flash(timeout: 20000) %> +<%= render_flash %> From 91260e28679ca6a8c640f997950fde5de13c6cf3 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Thu, 2 Apr 2020 17:30:59 +0200 Subject: [PATCH 09/11] dossier: fix upload route of piece_justificative in repetitions In repetitions, `form.index` doesn't make much sense. Turns out we don't really need the index of the champ: we can just use the champ id. --- app/helpers/champ_helper.rb | 2 +- app/javascript/new_design/dossiers/auto-upload-controller.js | 2 +- config/routes.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/champ_helper.rb b/app/helpers/champ_helper.rb index ca6aa40b6..3eb709454 100644 --- a/app/helpers/champ_helper.rb +++ b/app/helpers/champ_helper.rb @@ -34,7 +34,7 @@ module ChampHelper def auto_attach_url(form, object) if feature_enabled?(:autoupload_dossier_attachments) && object.is_a?(Champ) && object.public? - champs_piece_justificative_url(form.index) + champs_piece_justificative_url(object.id) end end end diff --git a/app/javascript/new_design/dossiers/auto-upload-controller.js b/app/javascript/new_design/dossiers/auto-upload-controller.js index 1a5b91282..3707f4078 100644 --- a/app/javascript/new_design/dossiers/auto-upload-controller.js +++ b/app/javascript/new_design/dossiers/auto-upload-controller.js @@ -70,7 +70,7 @@ export default class AutoUploadController { const attachmentRequest = { url: autoAttachUrl, type: 'PUT', - data: `champ_id=${champId}&blob_signed_id=${blobSignedId}` + data: `blob_signed_id=${blobSignedId}` }; await ajax(attachmentRequest); diff --git a/config/routes.rb b/config/routes.rb index 273880d2f..4081570cb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -121,7 +121,7 @@ Rails.application.routes.draw do get ':position/dossier_link', to: 'dossier_link#show', as: :dossier_link post ':position/carte', to: 'carte#show', as: :carte post ':position/repetition', to: 'repetition#show', as: :repetition - put ':position/piece_justificative', to: 'piece_justificative#update', as: :piece_justificative + put 'piece_justificative/:champ_id', to: 'piece_justificative#update', as: :piece_justificative end get 'attachments/:id', to: 'attachments#show', as: :attachment From c506402dcb6e9cdd26ff7e84cce68d7f1a9fe240 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Thu, 2 Apr 2020 17:44:48 +0200 Subject: [PATCH 10/11] dossier: remove the now unused `champId` in auto-upload --- .../dossiers/auto-upload-controller.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app/javascript/new_design/dossiers/auto-upload-controller.js b/app/javascript/new_design/dossiers/auto-upload-controller.js index 3707f4078..b26601468 100644 --- a/app/javascript/new_design/dossiers/auto-upload-controller.js +++ b/app/javascript/new_design/dossiers/auto-upload-controller.js @@ -23,18 +23,12 @@ export default class AutoUploadController { throw new Error('L’attribut "data-auto-attach-url" est manquant'); } - const champ = this.input.closest('.editable-champ[data-champ-id]'); - if (!champ) { - throw new Error('Impossible de trouver l’élément ".editable-champ"'); - } - const champId = champ.dataset.champId; - // Upload the file (using Direct Upload) let blobSignedId = await this._upload(); // Attach the blob to the champ // (The request responds with Javascript, which displays the attachment HTML fragment). - await this._attach(champId, blobSignedId, autoAttachUrl); + await this._attach(blobSignedId, autoAttachUrl); // Everything good: clear the original file input value this.input.value = null; @@ -60,10 +54,14 @@ export default class AutoUploadController { return await uploader.start(); } - async _attach(champId, blobSignedId, autoAttachUrl) { + async _attach(blobSignedId, autoAttachUrl) { // Now that the upload is done, display a new progress bar // to show that the attachment request is still pending. - const progressBar = new ProgressBar(this.input, champId, this.file); + const progressBar = new ProgressBar( + this.input, + `${this.input.id}-progress-bar`, + this.file + ); progressBar.progress(100); progressBar.end(); From ded65cfdb91c5ab2f419964ca59c104905b99b42 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Thu, 2 Apr 2020 17:33:54 +0200 Subject: [PATCH 11/11] dossier: fix rendering of piece_justificative in repetition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In repetitions we can't render the piece_justificative champ in the way we do for normal champs (which was already a bit hackish). Instead we render the whole form partial – and then extract the champ from the form. In this way, we're sure to render the champ as it appears in the form, without any hacks to reproduce the form structure. --- app/helpers/application_helper.rb | 9 +++++++++ app/helpers/champ_helper.rb | 2 +- app/views/champs/piece_justificative/show.js.erb | 13 +------------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e45d95781..acdabec8a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -49,6 +49,15 @@ module ApplicationHelper end end + def render_champ(champ) + champ_selector = ".editable-champ[data-champ-id=\"#{champ.id}\"]" + form_html = render 'shared/dossiers/edit', dossier: champ.dossier, apercu: false + champ_html = Nokogiri::HTML.fragment(form_html).at_css(champ_selector).to_s + # rubocop:disable Rails/OutputSafety + raw("document.querySelector('#{champ_selector}').outerHTML = \"#{escape_javascript(champ_html)}\";") + # rubocop:enable Rails/OutputSafety + end + def remove_element(selector, timeout: 0, inner: false) script = "(function() {"; script << "var el = document.querySelector('#{selector}');" diff --git a/app/helpers/champ_helper.rb b/app/helpers/champ_helper.rb index 3eb709454..1e51c662d 100644 --- a/app/helpers/champ_helper.rb +++ b/app/helpers/champ_helper.rb @@ -33,7 +33,7 @@ module ChampHelper end def auto_attach_url(form, object) - if feature_enabled?(:autoupload_dossier_attachments) && object.is_a?(Champ) && object.public? + if feature_enabled?(:autoupload_dossier_attachments) && object.is_a?(Champ) && object.persisted? && object.public? champs_piece_justificative_url(object.id) end end diff --git a/app/views/champs/piece_justificative/show.js.erb b/app/views/champs/piece_justificative/show.js.erb index e921f9556..80b454204 100644 --- a/app/views/champs/piece_justificative/show.js.erb +++ b/app/views/champs/piece_justificative/show.js.erb @@ -1,15 +1,4 @@ -<% dossier = @champ.dossier %> - -<%= fields_for dossier do |form| %> - <%= form.fields_for :champs, dossier.champs.where(id: @champ.id), include_id: false do |champ_form| %> - <% render_to_element(".editable-champ[data-champ-id=\"#{@champ.id}\"]", - partial: 'shared/dossiers/editable_champs/editable_champ', - locals: { - champ: @champ, - form: champ_form - }) %> - <% end %> -<% end %> +<%= render_champ(@champ) %> <% attachment = @champ.piece_justificative_file.attachment %> <% if attachment.virus_scanner.pending? %>