Merge pull request #7100 from betagouv/main

2022-03-31-02
This commit is contained in:
mfo 2022-03-31 14:19:12 +02:00 committed by GitHub
commit bcb95a85a8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 231 additions and 160 deletions

View file

@ -0,0 +1,4 @@
module Manager
class ArchivesController < Manager::ApplicationController
end
end

View file

@ -0,0 +1,46 @@
require "administrate/base_dashboard"
class ArchiveDashboard < Administrate::BaseDashboard
# ATTRIBUTE_TYPES
# a hash that describes the type of each of the model's fields.
#
# Each different type represents an Administrate::Field object,
# which determines how the attribute is displayed
# on pages throughout the dashboard.
ATTRIBUTE_TYPES = {
id: Field::Number,
created_at: Field::DateTime,
updated_at: Field::DateTime,
status: Field::String,
file: Field::HasOne
}.freeze
# COLLECTION_ATTRIBUTES
# an array of attributes that will be displayed on the model's index page.
#
# By default, it's limited to four items to reduce clutter on index pages.
# Feel free to add, remove, or rearrange items.
COLLECTION_ATTRIBUTES = [
:id,
:created_at,
:updated_at,
:status
].freeze
# SHOW_PAGE_ATTRIBUTES
# an array of attributes that will be displayed on the model's show page.
SHOW_PAGE_ATTRIBUTES = [
:id,
:created_at,
:updated_at,
:status,
:file
].freeze
# Overwrite this method to customize how users are displayed
# across all pages of the admin dashboard.
#
def display_resource(archive)
"Archive : #{archive&.file.&byte_size}"
end
end

View file

@ -5,6 +5,7 @@ import React, {
useContext, useContext,
createContext, createContext,
useEffect, useEffect,
useId,
useLayoutEffect, useLayoutEffect,
MutableRefObject, MutableRefObject,
ReactNode, ReactNode,
@ -18,7 +19,6 @@ import {
ComboboxOption, ComboboxOption,
ComboboxPopover ComboboxPopover
} from '@reach/combobox'; } from '@reach/combobox';
import { useId } from '@reach/auto-id';
import '@reach/combobox/styles.css'; import '@reach/combobox/styles.css';
import { matchSorter } from 'match-sorter'; import { matchSorter } from 'match-sorter';
import { XIcon } from '@heroicons/react/outline'; import { XIcon } from '@heroicons/react/outline';
@ -89,7 +89,8 @@ export default function ComboMultiple({
const [term, setTerm] = useState(''); const [term, setTerm] = useState('');
const [selections, setSelections] = useState(selected); const [selections, setSelections] = useState(selected);
const [newValues, setNewValues] = useState<string[]>([]); const [newValues, setNewValues] = useState<string[]>([]);
const inputId = useId(id); const internalId = useId();
const inputId = id ?? internalId;
const removedLabelledby = `${inputId}-remove`; const removedLabelledby = `${inputId}-remove`;
const selectedLabelledby = `${inputId}-selected`; const selectedLabelledby = `${inputId}-selected`;

View file

@ -1,5 +1,9 @@
import React, { useState, useRef, ChangeEventHandler } from 'react'; import React, {
import { useDebounce } from 'use-debounce'; useState,
useRef,
useDeferredValue,
ChangeEventHandler
} from 'react';
import { useQuery } from 'react-query'; import { useQuery } from 'react-query';
import { import {
Combobox, Combobox,
@ -59,7 +63,7 @@ function ComboSearch<Result>({
const [, setExternalId] = useHiddenField(group, 'external_id'); const [, setExternalId] = useHiddenField(group, 'external_id');
const initialValue = externalValue ? externalValue : controlledValue; const initialValue = externalValue ? externalValue : controlledValue;
const [searchTerm, setSearchTerm] = useState(''); const [searchTerm, setSearchTerm] = useState('');
const [debouncedSearchTerm] = useDebounce(searchTerm, 300); const debouncedSearchTerm = useDeferredValue(searchTerm);
const [value, setValue] = useState(initialValue); const [value, setValue] = useState(initialValue);
const resultsMap = useRef< const resultsMap = useRef<
Record<string, { key: string; value: string; result: Result }> Record<string, { key: string; value: string; result: Result }>

View file

@ -1,8 +1,7 @@
import React, { useState } from 'react'; import React, { useState, useId } from 'react';
import { fire } from '@utils'; import { fire } from '@utils';
import type { Feature } from 'geojson'; import type { Feature } from 'geojson';
import { PlusIcon, LocationMarkerIcon } from '@heroicons/react/outline'; import { PlusIcon, LocationMarkerIcon } from '@heroicons/react/outline';
import { useId } from '@reach/auto-id';
import CoordinateInput from 'react-coordinate-input'; import CoordinateInput from 'react-coordinate-input';
export function PointInput() { export function PointInput() {

View file

@ -1,9 +1,8 @@
import React, { useState } from 'react'; import React, { useState, useId } from 'react';
import { Popover, RadioGroup } from '@headlessui/react'; import { Popover, RadioGroup } from '@headlessui/react';
import { usePopper } from 'react-popper'; import { usePopper } from 'react-popper';
import { MapIcon } from '@heroicons/react/outline'; import { MapIcon } from '@heroicons/react/outline';
import { Slider } from '@reach/slider'; import { Slider } from '@reach/slider';
import { useId } from '@reach/auto-id';
import '@reach/slider/styles.css'; import '@reach/slider/styles.css';
import { LayersMap, NBS } from './styles'; import { LayersMap, NBS } from './styles';

View file

@ -2,8 +2,14 @@ class ArchiveCreationJob < ApplicationJob
queue_as :archives queue_as :archives
def perform(procedure, archive, instructeur) def perform(procedure, archive, instructeur)
archive.restart! if archive.failed? # restart for AASM
ProcedureArchiveService ProcedureArchiveService
.new(procedure) .new(procedure)
.collect_files_archive(archive, instructeur) .make_and_upload_archive(archive, instructeur)
archive.make_available!
InstructeurMailer.send_archive(instructeur, procedure, archive).deliver_later
rescue => e
archive.fail! # fail for observability
raise e # re-raise for retryable behaviour
end end
end end

View file

@ -35,16 +35,24 @@ class Archive < ApplicationRecord
enum status: { enum status: {
pending: 'pending', pending: 'pending',
generated: 'generated' generated: 'generated',
failed: 'failed'
} }
aasm whiny_persistence: true, column: :status, enum: true do aasm whiny_persistence: true, column: :status, enum: true do
state :pending, initial: true state :pending, initial: true
state :generated state :generated
state :failed
event :make_available do event :make_available do
transitions from: :pending, to: :generated transitions from: :pending, to: :generated
end end
event :restart do
transitions from: :failed, to: :pending
end
event :fail do
transitions from: :pending, to: :failed
end
end end
def available? def available?

View file

@ -15,7 +15,7 @@ class ProcedureArchiveService
Archive.find_or_create_archive(type, month, groupe_instructeurs) Archive.find_or_create_archive(type, month, groupe_instructeurs)
end end
def collect_files_archive(archive, instructeur) def make_and_upload_archive(archive, instructeur)
dossiers = Dossier.visible_by_administration dossiers = Dossier.visible_by_administration
.where(groupe_instructeur: archive.groupe_instructeurs) .where(groupe_instructeur: archive.groupe_instructeurs)
@ -30,8 +30,6 @@ class ProcedureArchiveService
ArchiveUploader.new(procedure: @procedure, archive: archive, filepath: zip_filepath) ArchiveUploader.new(procedure: @procedure, archive: archive, filepath: zip_filepath)
.upload .upload
end end
archive.make_available!
InstructeurMailer.send_archive(instructeur, @procedure, archive).deliver_later
end end
def self.procedure_files_size(procedure) def self.procedure_files_size(procedure)

View file

@ -20,6 +20,8 @@ Rails.application.routes.draw do
get 'export_mail_brouillons', on: :member get 'export_mail_brouillons', on: :member
end end
resources :archives, only: [:index, :show]
resources :dossiers, only: [:index, :show] do resources :dossiers, only: [:index, :show] do
post 'discard', on: :member post 'discard', on: :member
post 'restore', on: :member post 'restore', on: :member

View file

@ -2,17 +2,17 @@
"dependencies": { "dependencies": {
"@babel/preset-react": "^7.14.5", "@babel/preset-react": "^7.14.5",
"@babel/preset-typescript": "^7.16.7", "@babel/preset-typescript": "^7.16.7",
"@headlessui/react": "^1.3.0", "@headlessui/react": "^1.5.0",
"@heroicons/react": "^1.0.1", "@heroicons/react": "^1.0.6",
"@mapbox/mapbox-gl-draw": "^1.3.0", "@mapbox/mapbox-gl-draw": "^1.3.0",
"@popperjs/core": "^2.9.2", "@popperjs/core": "^2.11.4",
"@rails/actiontext": "^6.1.4-1", "@rails/actiontext": "^6.1.4-1",
"@rails/activestorage": "^6.1.4-1", "@rails/activestorage": "^6.1.4-1",
"@rails/ujs": "^6.1.4-1", "@rails/ujs": "^6.1.4-1",
"@rails/webpacker": "5.4.3", "@rails/webpacker": "5.4.3",
"@reach/auto-id": "^0.16.0", "@reach/auto-id": "^0.16.0",
"@reach/combobox": "^0.13.0", "@reach/combobox": "^0.16.5",
"@reach/slider": "^0.15.0", "@reach/slider": "^0.16.0",
"@sentry/browser": "6.12.0", "@sentry/browser": "6.12.0",
"@tmcw/togeojson": "^4.3.0", "@tmcw/togeojson": "^4.3.0",
"babel-plugin-macros": "^2.8.0", "babel-plugin-macros": "^2.8.0",
@ -29,12 +29,12 @@
"maplibre-gl": "^1.15.2", "maplibre-gl": "^1.15.2",
"match-sorter": "^6.2.0", "match-sorter": "^6.2.0",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^17.0.1", "react": "^18.0.0",
"react-coordinate-input": "^1.0.0", "react-coordinate-input": "^1.0.0",
"react-dom": "^17.0.1", "react-dom": "^18.0.0",
"react-intersection-observer": "^8.31.0", "react-intersection-observer": "^8.31.0",
"react-popper": "^2.2.5", "react-popper": "^2.2.5",
"react-query": "^3.9.7", "react-query": "^3.34.19",
"react-sortable-hoc": "^1.11.0", "react-sortable-hoc": "^1.11.0",
"tiny-invariant": "^1.2.0", "tiny-invariant": "^1.2.0",
"trix": "^1.2.3", "trix": "^1.2.3",
@ -50,8 +50,8 @@
"@types/is-hotkey": "^0.1.7", "@types/is-hotkey": "^0.1.7",
"@types/mapbox__mapbox-gl-draw": "^1.2.3", "@types/mapbox__mapbox-gl-draw": "^1.2.3",
"@types/rails__ujs": "^6.0.1", "@types/rails__ujs": "^6.0.1",
"@types/react": "^17.0.38", "@types/react": "^17.0.43",
"@types/react-dom": "^17.0.11", "@types/react-dom": "^17.0.14",
"@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/eslint-plugin": "^5.8.1",
"@typescript-eslint/parser": "^5.8.1", "@typescript-eslint/parser": "^5.8.1",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",

View file

@ -0,0 +1,41 @@
describe ArchiveCreationJob, type: :job do
describe 'perform' do
let(:archive) { create(:archive, status: status, groupe_instructeurs: [procedure.groupe_instructeurs.first]) }
let(:instructeur) { create(:instructeur) }
let(:procedure) { create(:procedure, instructeurs: [instructeur]) }
let(:job) { ArchiveCreationJob.new(procedure, archive, instructeur) }
context 'when it fails' do
let(:status) { :pending }
let(:mailer) { double('mailer', deliver_later: true) }
before { expect(InstructeurMailer).not_to receive(:send_archive) }
it 'does not send email and forward error for retry' do
allow_any_instance_of(ProcedureArchiveService).to receive(:download_and_zip).and_raise(StandardError, "kaboom")
expect { job.perform_now }.to raise_error(StandardError, "kaboom")
expect(archive.reload.failed?).to eq(true)
end
end
context 'when it works' do
let(:mailer) { double('mailer', deliver_later: true) }
before do
allow_any_instance_of(ProcedureArchiveService).to receive(:download_and_zip).and_return(true)
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
end
context 'when archive failed previously' do
let(:status) { :failed }
it 'restarts and works from failed states' do
expect { job.perform_now }.to change { archive.reload.failed? }.from(true).to(false)
end
end
context 'when archive start from pending state' do
let(:status) { :pending }
it 'restarts and works from failed states' do
expect { job.perform_now }.to change { archive.reload.generated? }.from(false).to(true)
end
end
end
end
end

View file

@ -33,7 +33,7 @@ describe ProcedureArchiveService do
end end
end end
describe '#collect_files_archive' do describe '#make_and_upload_archive' do
let!(:dossier) { create_dossier_for_month(year, month) } let!(:dossier) { create_dossier_for_month(year, month) }
let!(:dossier_2020) { create_dossier_for_month(2020, month) } let!(:dossier_2020) { create_dossier_for_month(2020, month) }
@ -42,13 +42,12 @@ describe ProcedureArchiveService do
context 'for a specific month' do context 'for a specific month' do
let(:archive) { create(:archive, time_span_type: 'monthly', status: 'pending', month: date_month, groupe_instructeurs: groupe_instructeurs) } let(:archive) { create(:archive, time_span_type: 'monthly', status: 'pending', month: date_month, groupe_instructeurs: groupe_instructeurs) }
let(:year) { 2021 } let(:year) { 2021 }
let(:mailer) { double('mailer', deliver_later: true) }
it 'collects files with success' do it 'collects files with success' do
allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://opengraph.githubassets.com/d0e7862b24d8026a3c03516d865b28151eb3859029c6c6c2e86605891fbdcd7a/socketry/async-io") allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://opengraph.githubassets.com/d0e7862b24d8026a3c03516d865b28151eb3859029c6c6c2e86605891fbdcd7a/socketry/async-io")
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
VCR.use_cassette('archive/new_file_to_get_200') do VCR.use_cassette('archive/new_file_to_get_200') do
service.collect_files_archive(archive, instructeur) service.make_and_upload_archive(archive, instructeur)
end end
archive.file.open do |f| archive.file.open do |f|
@ -68,9 +67,9 @@ describe ProcedureArchiveService do
it 'retry errors files with errors' do it 'retry errors files with errors' do
allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://www.demarches-simplifiees.fr/error_1") allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://www.demarches-simplifiees.fr/error_1")
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
VCR.use_cassette('archive/new_file_to_get_400.html') do VCR.use_cassette('archive/new_file_to_get_400.html') do
service.collect_files_archive(archive, instructeur) service.make_and_upload_archive(archive, instructeur)
end end
archive.file.open do |f| archive.file.open do |f|
files = ZipTricks::FileReader.read_zip_structure(io: f) files = ZipTricks::FileReader.read_zip_structure(io: f)
@ -113,11 +112,11 @@ describe ProcedureArchiveService do
end end
it 'collect files without raising exception' do it 'collect files without raising exception' do
expect { service.collect_files_archive(archive, instructeur) }.not_to raise_exception expect { service.make_and_upload_archive(archive, instructeur) }.not_to raise_exception
end end
it 'add bug report to archive' do it 'add bug report to archive' do
service.collect_files_archive(archive, instructeur) service.make_and_upload_archive(archive, instructeur)
archive.file.open do |f| archive.file.open do |f|
zip_entries = ZipTricks::FileReader.read_zip_structure(io: f) zip_entries = ZipTricks::FileReader.read_zip_structure(io: f)
@ -144,14 +143,12 @@ describe ProcedureArchiveService do
context 'for all months' do context 'for all months' do
let(:archive) { create(:archive, time_span_type: 'everything', status: 'pending', groupe_instructeurs: groupe_instructeurs) } let(:archive) { create(:archive, time_span_type: 'everything', status: 'pending', groupe_instructeurs: groupe_instructeurs) }
let(:mailer) { double('mailer', deliver_later: true) }
it 'collect files' do it 'collect files' do
allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://opengraph.githubassets.com/5e61989aecb78e369c93674f877d7bf4ecde378850114a9563cdf8b6a2472536/typhoeus/typhoeus/issues/110") allow_any_instance_of(ActiveStorage::Attached::One).to receive(:url).and_return("https://opengraph.githubassets.com/5e61989aecb78e369c93674f877d7bf4ecde378850114a9563cdf8b6a2472536/typhoeus/typhoeus/issues/110")
expect(InstructeurMailer).to receive(:send_archive).and_return(mailer)
VCR.use_cassette('archive/old_file_to_get_200') do VCR.use_cassette('archive/old_file_to_get_200') do
service.collect_files_archive(archive, instructeur) service.make_and_upload_archive(archive, instructeur)
end end
archive = Archive.last archive = Archive.last

View file

@ -12,6 +12,7 @@
"skipLibCheck": true, "skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
"strict": true, "strict": true,
"types": ["react/next", "react-dom/next"],
"paths": { "paths": {
"~/*": ["./app/javascript/*"], "~/*": ["./app/javascript/*"],
"@utils": ["./app/javascript/shared/utils.ts"] "@utils": ["./app/javascript/shared/utils.ts"]

215
yarn.lock
View file

@ -1259,15 +1259,15 @@
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
"@headlessui/react@^1.3.0": "@headlessui/react@^1.5.0":
version "1.4.2" version "1.5.0"
resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.4.2.tgz#87e264f190dbebbf8dfdd900530da973dad24576" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.5.0.tgz#483b44ba2c8b8d4391e1d2c863898d7dd0cc0296"
integrity sha512-N8tv7kLhg9qGKBkVdtg572BvKvWhmiudmeEpOCyNwzOsZHCXBtl8AazGikIfUS+vBoub20Fse3BjawXDVPPdug== integrity sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==
"@heroicons/react@^1.0.1": "@heroicons/react@^1.0.6":
version "1.0.5" version "1.0.6"
resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.5.tgz#2fe4df9d33eb6ce6d5178a0f862e97b61c01e27d" resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.6.tgz#35dd26987228b39ef2316db3b1245c42eb19e324"
integrity sha512-UDMyLM2KavIu2vlWfMspapw9yii7aoLwzI2Hudx4fyoPwfKfxU8r3cL8dEBXOjcLG0/oOONZzbT14M1HoNtEcg== integrity sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==
"@humanwhocodes/config-array@^0.5.0": "@humanwhocodes/config-array@^0.5.0":
version "0.5.0" version "0.5.0"
@ -1939,10 +1939,10 @@
dependencies: dependencies:
"@octokit/openapi-types" "^11.2.0" "@octokit/openapi-types" "^11.2.0"
"@popperjs/core@^2.9.2": "@popperjs/core@^2.11.4":
version "2.11.0" version "2.11.4"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.0.tgz#6734f8ebc106a0860dff7f92bf90df193f0935d7" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503"
integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ== integrity sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==
"@rails/actiontext@^6.1.4-1": "@rails/actiontext@^6.1.4-1":
version "6.1.4" version "6.1.4"
@ -2007,23 +2007,7 @@
webpack-cli "^3.3.12" webpack-cli "^3.3.12"
webpack-sources "^1.4.3" webpack-sources "^1.4.3"
"@reach/auto-id@0.13.2": "@reach/auto-id@0.16.0", "@reach/auto-id@^0.16.0":
version "0.13.2"
resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.13.2.tgz#6c7fe7142285707b0f38b2f556f32accb467df32"
integrity sha512-dWeXt6xxjN+NPRoZFXgmNkF89t8MEPsWLYjIIDf3gNXA/Dxaoytc9YBOIfVGpDSpdOwxPpxOu8rH+4Y3Jk2gHA==
dependencies:
"@reach/utils" "0.13.2"
tslib "^2.1.0"
"@reach/auto-id@0.15.3":
version "0.15.3"
resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.15.3.tgz#23b6ae8de3bf7520044c95a85c992ae46cdcef9c"
integrity sha512-lbLUI9mrn74qVis141ib0Rsyhgk+gzUMtpplRmjy06cUWDFZyiBATNWMUxN5T+0fU4tpfgcjkAuPeTCCGThKtQ==
dependencies:
"@reach/utils" "0.15.3"
tslib "^2.3.0"
"@reach/auto-id@^0.16.0":
version "0.16.0" version "0.16.0"
resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.16.0.tgz#dfabc3227844e8c04f8e6e45203a8e14a8edbaed" resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.16.0.tgz#dfabc3227844e8c04f8e6e45203a8e14a8edbaed"
integrity sha512-5ssbeP5bCkM39uVsfQCwBBL+KT8YColdnMN5/Eto6Rj7929ql95R3HZUOkKIvj7mgPtEb60BLQxd1P3o6cjbmg== integrity sha512-5ssbeP5bCkM39uVsfQCwBBL+KT8YColdnMN5/Eto6Rj7929ql95R3HZUOkKIvj7mgPtEb60BLQxd1P3o6cjbmg==
@ -2031,87 +2015,72 @@
"@reach/utils" "0.16.0" "@reach/utils" "0.16.0"
tslib "^2.3.0" tslib "^2.3.0"
"@reach/combobox@^0.13.0": "@reach/combobox@^0.16.5":
version "0.13.2" version "0.16.5"
resolved "https://registry.yarnpkg.com/@reach/combobox/-/combobox-0.13.2.tgz#f0a38c685a2704f6a189709e63cd7e25809da1e4" resolved "https://registry.yarnpkg.com/@reach/combobox/-/combobox-0.16.5.tgz#3493647950b4e0838d9442156fd5d6a52ea2f41d"
integrity sha512-onfUd3qG0j46dmdrXcr7+a7d0mabLMZEDDAy1qlWA8OzyuXnce0asRxmUHhIXtCKiJa0tOOIWL3+6UG4nC9wuw== integrity sha512-Csm79qZN3aGpIHnqMYcDH0Y75Z0K8u3j1DzQiRa3w8aDwdmQFocBIo3p9veEytiKm28Dccj/wmmvrCpgVMVH9Q==
dependencies: dependencies:
"@reach/auto-id" "0.13.2" "@reach/auto-id" "0.16.0"
"@reach/descendants" "0.13.2" "@reach/descendants" "0.16.1"
"@reach/popover" "0.13.2" "@reach/popover" "0.16.2"
"@reach/portal" "0.13.2" "@reach/portal" "0.16.2"
"@reach/utils" "0.13.2" "@reach/utils" "0.16.0"
highlight-words-core "1.2.2"
prop-types "^15.7.2" prop-types "^15.7.2"
tslib "^2.1.0" tiny-warning "^1.0.3"
tslib "^2.3.0"
"@reach/descendants@0.13.2": "@reach/descendants@0.16.1":
version "0.13.2" version "0.16.1"
resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.13.2.tgz#14cebb203a017d4a316345048deece75caa920b4" resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.16.1.tgz#fa3d89c0503565369707f32985d87eef61985d9f"
integrity sha512-8FdcYF48U3RXeMTlaYPO0JZ7RD01z8pUl6sCAXcDBw1Hony4ZgiubjZOHD9c+fOZrC9kHqD+yJfIb6K+T+vabw== integrity sha512-3WZgRnD9O4EORKE31rrduJDiPFNMOjUkATx0zl192ZxMq3qITe4tUj70pS5IbJl/+v9zk78JwyQLvA1pL7XAPA==
dependencies: dependencies:
"@reach/utils" "0.13.2" "@reach/utils" "0.16.0"
tslib "^2.1.0" tslib "^2.3.0"
"@reach/observe-rect@1.2.0": "@reach/observe-rect@1.2.0":
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2"
integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==
"@reach/popover@0.13.2": "@reach/popover@0.16.2":
version "0.13.2" version "0.16.2"
resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.13.2.tgz#0c257d3ab21d8bfa62a3c5571d8824a3e7771d97" resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.16.2.tgz#71d7af3002ca49d791476b22dee1840dd1719c19"
integrity sha512-L94le+9az8Vy6syF6ZUUN0FIz3E6AMpDtJYwJuIJKVU44E/XVK9xB0CFwLyZ8bsvbbMaego9mLBbYQDWNS0Qbg== integrity sha512-IwkRrHM7Vt33BEkSXneovymJv7oIToOfTDwRKpuYEB/BWYMAuNfbsRL7KVe6MjkgchDeQzAk24cYY1ztQj5HQQ==
dependencies: dependencies:
"@reach/portal" "0.13.2" "@reach/portal" "0.16.2"
"@reach/rect" "0.13.2" "@reach/rect" "0.16.0"
"@reach/utils" "0.13.2" "@reach/utils" "0.16.0"
tabbable "^4.0.0" tabbable "^4.0.0"
tslib "^2.1.0" tslib "^2.3.0"
"@reach/portal@0.13.2": "@reach/portal@0.16.2":
version "0.13.2" version "0.16.2"
resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.13.2.tgz#6f2a6f4afc14894bde9c6435667bb9b660887ed9" resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.16.2.tgz#ca83696215ee03acc2bb25a5ae5d8793eaaf2f64"
integrity sha512-g74BnCdtuTGthzzHn2cWW+bcyIYb0iIE/yRsm89i8oNzNgpopbkh9UY8TPbhNlys52h7U60s4kpRTmcq+JqsTA== integrity sha512-9ur/yxNkuVYTIjAcfi46LdKUvH0uYZPfEp4usWcpt6PIp+WDF57F/5deMe/uGi/B/nfDweQu8VVwuMVrCb97JQ==
dependencies: dependencies:
"@reach/utils" "0.13.2" "@reach/utils" "0.16.0"
tslib "^2.1.0" tiny-warning "^1.0.3"
tslib "^2.3.0"
"@reach/rect@0.13.2": "@reach/rect@0.16.0":
version "0.13.2" version "0.16.0"
resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.13.2.tgz#a7fb8ebc3685504306b324b3abc92dcec0e00044" resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.16.0.tgz#78cf6acefe2e83d3957fa84f938f6e1fc5700f16"
integrity sha512-Vr1J2CzXWEGVMLxHblPMt8pgwW0d7s28SflFNCdFlbHwjgWSvnKwHue9p90bYRb4W/5u6gYjYX6znzSMxv/8ZA== integrity sha512-/qO9jQDzpOCdrSxVPR6l674mRHNTqfEjkaxZHluwJ/2qGUtYsA0GSZiF/+wX/yOWeBif1ycxJDa6HusAMJZC5Q==
dependencies: dependencies:
"@reach/observe-rect" "1.2.0" "@reach/observe-rect" "1.2.0"
"@reach/utils" "0.13.2" "@reach/utils" "0.16.0"
prop-types "^15.7.2"
tslib "^2.1.0"
"@reach/slider@^0.15.0":
version "0.15.3"
resolved "https://registry.yarnpkg.com/@reach/slider/-/slider-0.15.3.tgz#0d2545aa5146c4f60c7d9fa47e8918cac0da6f36"
integrity sha512-YjLNJNOHwjnd83vyV8DLWR1A4aB/3oCD7F/XrU3M6UXbKtPJAj+2I1mjMzqSP6/mpBjJseB4kxO9c1UeKxaJMQ==
dependencies:
"@reach/auto-id" "0.15.3"
"@reach/utils" "0.15.3"
prop-types "^15.7.2" prop-types "^15.7.2"
tiny-warning "^1.0.3" tiny-warning "^1.0.3"
tslib "^2.3.0" tslib "^2.3.0"
"@reach/utils@0.13.2": "@reach/slider@^0.16.0":
version "0.13.2" version "0.16.0"
resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.13.2.tgz#87e8fef8ebfe583fa48250238a1a3ed03189fcc8" resolved "https://registry.yarnpkg.com/@reach/slider/-/slider-0.16.0.tgz#1887f9a0f399de4c16394260d56efbfeedbef715"
integrity sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ== integrity sha512-RdJTndvn5TMJXrt9ut5xpFTXTaIllE9H+zyFT5awmNqC+0r6/kt7fFxMPAy4UI0CTFMcQXRfj6qA/TVe/vf5Tw==
dependencies:
"@types/warning" "^3.0.0"
tslib "^2.1.0"
warning "^4.0.3"
"@reach/utils@0.15.3":
version "0.15.3"
resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.15.3.tgz#200f42adba9d1463b1c6a75ee2aaf9f0cba84f9d"
integrity sha512-HFyjw8LZ4/RRk5bcMpDAeEc3aOeLR/vWRDsljlE3cHI5GfFlZcG3DDLSW8C2ba74RCFp/4X3Nz0nOrd4JdkZ1w==
dependencies: dependencies:
"@reach/auto-id" "0.16.0"
"@reach/utils" "0.16.0"
prop-types "^15.7.2"
tiny-warning "^1.0.3" tiny-warning "^1.0.3"
tslib "^2.3.0" tslib "^2.3.0"
@ -2495,14 +2464,14 @@
resolved "https://registry.yarnpkg.com/@types/rails__ujs/-/rails__ujs-6.0.1.tgz#83c5aa1dad88ca869de05a9523eff58041ab307a" resolved "https://registry.yarnpkg.com/@types/rails__ujs/-/rails__ujs-6.0.1.tgz#83c5aa1dad88ca869de05a9523eff58041ab307a"
integrity sha512-CVwNOdzTQ9qn6X6HPwx6ikH1T9ueJTdfjwFlXFhGvzXsQuESUksibfSosgxs1D/Q1kVEpjxeXD2RzqJv0Ma5Gw== integrity sha512-CVwNOdzTQ9qn6X6HPwx6ikH1T9ueJTdfjwFlXFhGvzXsQuESUksibfSosgxs1D/Q1kVEpjxeXD2RzqJv0Ma5Gw==
"@types/react-dom@^17.0.11": "@types/react-dom@^17.0.14":
version "17.0.11" version "17.0.14"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.14.tgz#c8f917156b652ddf807711f5becbd2ab018dea9f"
integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q== integrity sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react@*", "@types/react@^17.0.38": "@types/react@*":
version "17.0.38" version "17.0.38"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd"
integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==
@ -2511,6 +2480,15 @@
"@types/scheduler" "*" "@types/scheduler" "*"
csstype "^3.0.2" csstype "^3.0.2"
"@types/react@^17.0.43":
version "17.0.43"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55"
integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/resolve@1.17.1": "@types/resolve@1.17.1":
version "1.17.1" version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@ -2540,11 +2518,6 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc"
integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==
"@types/warning@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=
"@types/yargs-parser@*": "@types/yargs-parser@*":
version "20.2.1" version "20.2.1"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129"
@ -7127,11 +7100,6 @@ highcharts@^9.0.0:
resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-9.3.2.tgz#20b34f7277169a48d7b5691f74705e8addc78cd3" resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-9.3.2.tgz#20b34f7277169a48d7b5691f74705e8addc78cd3"
integrity sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg== integrity sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg==
highlight-words-core@1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/highlight-words-core/-/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa"
integrity sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==
hmac-drbg@^1.0.1: hmac-drbg@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@ -11281,14 +11249,13 @@ react-coordinate-input@^1.0.0:
optionalDependencies: optionalDependencies:
prop-types ">=15.0.0" prop-types ">=15.0.0"
react-dom@^17.0.1: react-dom@^18.0.0:
version "17.0.2" version "18.0.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==
dependencies: dependencies:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.1" scheduler "^0.21.0"
scheduler "^0.20.2"
react-fast-compare@^3.0.1: react-fast-compare@^3.0.1:
version "3.2.0" version "3.2.0"
@ -11318,10 +11285,10 @@ react-popper@^2.2.5:
react-fast-compare "^3.0.1" react-fast-compare "^3.0.1"
warning "^4.0.2" warning "^4.0.2"
react-query@^3.9.7: react-query@^3.34.19:
version "3.34.5" version "3.34.19"
resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.5.tgz#a145c02f58088c5c83c91697cece50e89b4dbfd8" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.19.tgz#0ff049b6e0d2ed148e9abfdd346625d0e88dc229"
integrity sha512-qk1hYo+y90LGY5W4kNEYT5yCk8gyL1fVTMoRZfzBTaSdaZWOcdvij36MmkhIqiPdXoEt5pBvX2ejokazwq8haw== integrity sha512-JO0Ymi58WKmvnhgg6bGIrYIeKb64KsKaPWo8JcGnmK2jJxAs2XmMBzlP75ZepSU7CHzcsWtIIyhMrLbX3pb/3w==
dependencies: dependencies:
"@babel/runtime" "^7.5.5" "@babel/runtime" "^7.5.5"
broadcast-channel "^3.4.1" broadcast-channel "^3.4.1"
@ -11336,13 +11303,12 @@ react-sortable-hoc@^1.11.0:
invariant "^2.2.4" invariant "^2.2.4"
prop-types "^15.5.7" prop-types "^15.5.7"
react@^17.0.1: react@^18.0.0:
version "17.0.2" version "18.0.0"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==
dependencies: dependencies:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.1"
read-cache@^1.0.0: read-cache@^1.0.0:
version "1.0.0" version "1.0.0"
@ -11877,13 +11843,12 @@ sax@^1.2.4, sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
scheduler@^0.20.2: scheduler@^0.21.0:
version "0.20.2" version "0.21.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820"
integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==
dependencies: dependencies:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.1"
schema-utils@^1.0.0: schema-utils@^1.0.0:
version "1.0.0" version "1.0.0"
@ -13111,7 +13076,7 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.1.0, tslib@^2.3.0: tslib@^2.3.0:
version "2.3.1" version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
@ -13534,7 +13499,7 @@ wait-port@^0.2.2:
commander "^3.0.2" commander "^3.0.2"
debug "^4.1.1" debug "^4.1.1"
warning@^4.0.2, warning@^4.0.3: warning@^4.0.2:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==