diff --git a/package.json b/package.json index 816a9771..e5c2083c 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "i18next-http-backend": "^2.2.0", "lodash.chunk": "^4.2.0", "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", "lodash.unionby": "^4.8.0", "lodash.uniqueid": "^4.0.1", "prop-types": "^15.8.1", "react": "^18.2.0", + "react-ace-builds": "^7.4.1", "react-bootstrap": "^0.33.1", "react-dom": "^18.2.0", "react-form-stepper": "^2.0.3", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index c9cf075b..d2d67653 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -55,10 +55,10 @@ "formerly": "auparavant", "on": "le", "Begin typing to see a list of suggestions": "Commencez à saisir pour voir une liste de suggestions", - "Select the context in which you are developing your data management plan" : "Sélectionnez le contexte dans lequel vous élaborez votre plan de gestion de données", - "For a research project" : "Pour un projet de recherche", - "For a research entity" : "Pour une entité de recherche", - "Confirm my choice" : "Valider mon choix", + "Select the context in which you are developing your data management plan": "Sélectionnez le contexte dans lequel vous élaborez votre plan de gestion de données", + "For a research project": "Pour un projet de recherche", + "For a research entity": "Pour une entité de recherche", + "Confirm my choice": "Valider mon choix", "Default template": "Modèle par défaut", "Your organisation": "Votre organisme", "Other organisation": "Autre organisme", @@ -73,7 +73,7 @@ "Research Entity Details": "Renseignements sur l'entité de recherche", "Test Plan (e.g. as part of a training course)": "Plan test (par ex, dans le cadre d'une formation)", "Click here if you have a funded project": "Cliquez ici si vous avez un projet financé", - "Click here to select the guidance of your plan":"Cliquez ici pour sélectionner les recommandations appliquées à votre plan", + "Click here to select the guidance of your plan": "Cliquez ici pour sélectionner les recommandations appliquées à votre plan", "If your project is financed by one of the funders on the list, you can automatically retrieve the administrative information you entered when applying for a grant.": "Si votre projet est financé par l’un des financeurs de la liste, vous pouvez récupérer automatiquement les informations administratives que vous avez déjà saisies lors de la demande de subvention.", "'{{projectTitle}}' project data has successfully been imported": "Données du projet '{{projectTitle}}' ont été importées avec succès.", "An error occurred during the import of the project information": "Une erreur s'est produite lors de l'import des données projet", @@ -128,7 +128,7 @@ "Attributed roles (Associated research outputs)": "Rôles attribués (Produits de recherche associés)", "Add: person or organisation": "Ajouter : personne ou organisation", "Edit: person or organisation": "Modifier : personne ou organisation", - "A problem has occurred while deleting the {{record}}" : "Un problème s'est produit lors de la suppression du {{record}}", + "A problem has occurred while deleting the {{record}}": "Un problème s'est produit lors de la suppression du {{record}}", "comment": "commentaire", "contributor": "contributeur", "You are leading or participating in a research project, you are carrying out a research activity, you are preparing a doctorate.": "Vous dirigez ou participez à un projet de recherche, vous menez une activité de recherche, vous préparez un doctorat.", @@ -158,12 +158,12 @@ "Select plan language": "Sélectionnez la langue du plan", "Create your plan in 3 steps": "Créez votre plan en 3 étapes", "Read article": "Lire l'article", - "Registration was successful !" :"L’enregistrement a été effectué avec succès !", - "List of customized forms" : "Liste de formulaires personnalisés", - "Cancel" : "Annuler", + "Registration was successful !": "L’enregistrement a été effectué avec succès !", + "List of customized forms": "Liste de formulaires personnalisés", + "Cancel": "Annuler", "Templates from others organizations () or funders ()": "Autres modèles: financeurs () ou organismes de recherche ()", - "The template will be in English" : "Le modèle sera en anglais", - "The template will be in French":"Le modèle sera en français", + "The template will be in English": "Le modèle sera en anglais", + "The template will be in French": "Le modèle sera en français", "Français": "Français", "English (GB)": "English (GB)", "Finish": "Terminer", @@ -201,5 +201,22 @@ "Search...": "Rechercher...", "Your plan does not yet include any research output": "Votre plan ne comporte encore aucun produit de recherche", "Create a research output": "Créer un produit de recherche", - "A ‘type’ is required to create a search product.": "Un \"type\" est nécessaire pour créer un produit de recherche." -} + "A ‘type’ is required to create a search product.": "Un \"type\" est nécessaire pour créer un produit de recherche.", + "Template Mappings": "Correspondances de modèles", + "of": "sur", + "elements": "éléments", + "Filter": "Filtrer", + "Here you can map the sections of a structured template to the sections of a classic template.": "Ici, vous pouvez faire correspondre les sections d'un modèle structuré aux sections d'un modèle classique.", + "Target": "Cible", + "Target Template": "Modèle cible", + "Source Template": "Modèle source", + "Created At": "Créé le", + "Updated At": "Mis à jour le", + "No template mappings found": "Aucune correspondance de modèle trouvée", + "New Mapping": "Nouvelle correspondance", + "All Mappings": "Toutes les correspondances", + "Create Mapping": "Créer", + "Save mapping": "Enregistrer", + "Open a question in the target template to get started.": "Ouvrez une question dans le modèle cible pour commencer.", + "Edit Export Template": "Modifier le modèle d'export" +} \ No newline at end of file diff --git a/src/__tests__/SectionsContent.test.js b/src/__tests__/SectionsContent.test.js index d2c155f4..0fbb5396 100644 --- a/src/__tests__/SectionsContent.test.js +++ b/src/__tests__/SectionsContent.test.js @@ -3,7 +3,7 @@ import { render, act } from "@testing-library/react"; import { BrowserRouter as Router } from "react-router-dom"; import "@testing-library/jest-dom/extend-expect"; import WritePlan from "../components/WritePlan/WritePlan"; -import { writePlan } from "../services"; +import { sectionsContent } from "../services"; import Global from "../components/context/Global"; jest.mock("../services/DmpWritePlanApi.js"); @@ -259,7 +259,7 @@ const mockSectionsData = { }; describe("Redaction component", () => { beforeEach(() => { - writePlan.getPlanData.mockResolvedValue(mockSectionsData); + sectionsContent.getPlanData.mockResolvedValue(mockSectionsData); }); afterEach(() => { diff --git a/src/__tests__/WritePlan.test.js b/src/__tests__/WritePlan.test.js index fc2d6696..6c8c2919 100644 --- a/src/__tests__/WritePlan.test.js +++ b/src/__tests__/WritePlan.test.js @@ -1,7 +1,7 @@ import React from "react"; import { render, fireEvent, screen, act } from "@testing-library/react"; import WritePlan from "../components/WritePlan/WritePlan"; -import { writePlan } from "../services"; +import { sectionsContent } from "../services"; import { GlobalContext } from "../components/context/Global"; import "@testing-library/jest-dom"; import { BrowserRouter as Router } from "react-router-dom"; @@ -26,7 +26,7 @@ const globalState = { describe("WritePlan", () => { beforeEach(() => { - writePlan.getPlanData.mockResolvedValue({ + sectionsContent.getPlanData.mockResolvedValue({ data: { plan: { id: 1, diff --git a/src/components/FormComponents/SelectWithCreate.jsx b/src/components/FormComponents/DropdownsToEntryTable.jsx similarity index 72% rename from src/components/FormComponents/SelectWithCreate.jsx rename to src/components/FormComponents/DropdownsToEntryTable.jsx index 9c37c5dc..44b30ba0 100644 --- a/src/components/FormComponents/SelectWithCreate.jsx +++ b/src/components/FormComponents/DropdownsToEntryTable.jsx @@ -11,8 +11,8 @@ import { GlobalContext } from '../context/Global.jsx'; import { createOptions, createRegistryPlaceholder, -} from '../../utils/GeneratorUtils'; -import { service } from '../../services'; +} from '../../utils/GeneratorUtils.js'; +import { service } from '../../services/index.js'; import * as styles from '../assets/css/form.module.css'; import CustomSelect from '../Shared/CustomSelect.jsx'; import FragmentList from './FragmentList.jsx'; @@ -21,8 +21,11 @@ import ModalForm from '../Forms/ModalForm.jsx'; import swalUtils from '../../utils/swalUtils.js'; import { getErrorMessage } from '../../utils/utils.js'; import { checkFragmentExists } from '../../utils/JsonFragmentsUtils.js'; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; +import CustomButton from '../Styled/CustomButton.jsx'; +import MappingButton from './MappingButton.jsx'; -function SelectWithCreate({ +function DropdownsToEntryTable({ label, formLabel, propName, @@ -32,6 +35,7 @@ function SelectWithCreate({ registries, overridable = false, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const { @@ -39,6 +43,9 @@ function SelectWithCreate({ loadedRegistries, setLoadedRegistries, loadedTemplates, setLoadedTemplates, } = useContext(GlobalContext); + + const { mapping } = useSectionsMapping(); + const { control } = useFormContext(); const { field } = useController({ control, name: propName }); const [show, setShow] = useState(false); @@ -208,66 +215,77 @@ function SelectWithCreate({ {error} {/* ************Select ref************** */} -
- {registries && registries.length > 1 && ( -
-
-
- ({ - value: registry, - label: registry, - }))} - name={propName} - selectedOption={ - selectedRegistry ? { value: selectedRegistry, label: selectedRegistry } : null - } - isDisabled={readonly} - placeholder={t("Select a registry")} - /> + {mapping + ? + :
+ {registries && registries.length > 1 && ( +
+
+
+ ({ + value: registry, + label: registry, + }))} + name={propName} + selectedOption={ + selectedRegistry ? { value: selectedRegistry, label: selectedRegistry } : null + } + isDisabled={readonly} + placeholder={t("Select a registry")} + /> + +
-
- )} + )} -
1 ? "col-md-6" : "col-md-12"}> -
-
- {options && ( - ASYNC_SELECT_OPTION_THRESHOLD} - placeholder={createRegistryPlaceholder(registries, overridable, 'complex', t)} - overridable={false} - /> +
1 ? "col-md-6" : "col-md-12"}> +
+
+ {options && ( + <> + ASYNC_SELECT_OPTION_THRESHOLD} + placeholder={createRegistryPlaceholder(registries, overridable, 'complex', t)} + overridable={false} + /> + + + )} +
+ {!readonly && overridable && ( +
+ + { + setShow(true); + setIndex(null); + }} + className={styles.icon} + /> +
)}
- {!readonly && overridable && ( -
- - { - setShow(true); - setIndex(null); - }} - className={styles.icon} - /> -
- )}
-
+ } {error} {template && ( )}
); } -export default SelectWithCreate; +export default DropdownsToEntryTable; diff --git a/src/components/FormComponents/InputText.jsx b/src/components/FormComponents/InputText.jsx index 2aff995c..16f0c88b 100644 --- a/src/components/FormComponents/InputText.jsx +++ b/src/components/FormComponents/InputText.jsx @@ -3,6 +3,8 @@ import { useFormContext } from 'react-hook-form'; import { Tooltip as ReactTooltip } from 'react-tooltip'; import uniqueId from 'lodash.uniqueid'; import * as styles from '../assets/css/form.module.css'; +import MappingButton from './MappingButton'; +import useSectionsMapping from '../../hooks/useSectionsMapping'; /** * It's a function that takes in a bunch of props and returns @@ -19,43 +21,60 @@ function InputText({ defaultValue = null, readonly = false, min, + jsonPath = null, + disableMapping = false, + onChange, }) { - const { register } = useFormContext(); + const { mapping } = useSectionsMapping(); + const { register, setValue } = useFormContext(); const [isRequired] = useState(false); const tooltipedLabelId = uniqueId('input_text_tooltip_id_'); + const handleChange = (event) => { + const newValue = event.target.value; + setValue(propName, newValue); + if (onChange) { + onChange(newValue); + } + }; + return (
{hidden === false && (
- { - tooltip && ( - - ) - } + {tooltip && ( + + )}
)} - +
+ {(!mapping || disableMapping) && ( + + )} + {!disableMapping && } +
); } + export default InputText; diff --git a/src/components/FormComponents/InputTextArray.jsx b/src/components/FormComponents/InputTextList.jsx similarity index 81% rename from src/components/FormComponents/InputTextArray.jsx rename to src/components/FormComponents/InputTextList.jsx index 0a334737..4653d6ec 100644 --- a/src/components/FormComponents/InputTextArray.jsx +++ b/src/components/FormComponents/InputTextList.jsx @@ -1,17 +1,22 @@ -import React, { useEffect, useState } from 'react'; +import React, { } from 'react'; import { useFormContext, useFieldArray } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { Tooltip as ReactTooltip } from 'react-tooltip'; import uniqueId from 'lodash.uniqueid'; -import { FaPlus, FaXmark } from 'react-icons/fa6'; +import { FaXmark } from 'react-icons/fa6'; import * as styles from '../assets/css/form.module.css'; import CustomButton from '../Styled/CustomButton'; +import useSectionsMapping from '../../hooks/useSectionsMapping'; +import MappingButton from './MappingButton'; -/* A React component that renders a form with a text input and a button. -When the button is clicked, a new text input is added to the form. When the text -input is changed, the form is updated. */ -function InputTextArray({ label, propName, tooltip, readonly }) { +/** + * A React component that renders a form with a text input and a button. + * When the button is clicked, a new text input is added to the form. When the text + * input is changed, the form is updated. + */ +function InputTextList({ label, propName, tooltip, readonly, jsonPath = null }) { + // --- STATE --- const { t } = useTranslation(); const { register } = useFormContext({ defaultValues: { @@ -20,7 +25,9 @@ function InputTextArray({ label, propName, tooltip, readonly }) { }); const { fields, append, remove } = useFieldArray({ name: propName }); const inputTextTooltipId = uniqueId('input_text_dynamicaly_tooltip_id_'); - + + + // --- RENDER --- return (
@@ -75,6 +82,8 @@ function InputTextArray({ label, propName, tooltip, readonly }) {
))} + + {!readonly && ( append('')} @@ -87,4 +96,4 @@ function InputTextArray({ label, propName, tooltip, readonly }) { ); } -export default InputTextArray; +export default InputTextList; diff --git a/src/components/FormComponents/MappingButton.jsx b/src/components/FormComponents/MappingButton.jsx new file mode 100644 index 00000000..e30e1075 --- /dev/null +++ b/src/components/FormComponents/MappingButton.jsx @@ -0,0 +1,28 @@ +import { t } from "i18next"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; +import CustomButton from "../Styled/CustomButton"; + +function MappingButton({ path, label }) { + // --- STATE --- + const { mapping, handleInsert, editorRef } = useSectionsMapping(); + + // --- RENDER --- + return ( + <> + {mapping && + (editorRef && editorRef.current + ? + handleInsert({ path, label })} + buttonColor="white" + /> + : +

{t('Open a question in the target template to get started.')}

+ ) + } + + ) +} + +export default MappingButton; \ No newline at end of file diff --git a/src/components/FormComponents/ModalTemplate.jsx b/src/components/FormComponents/ModalTemplateTable.jsx similarity index 93% rename from src/components/FormComponents/ModalTemplate.jsx rename to src/components/FormComponents/ModalTemplateTable.jsx index 790eafb4..757cbf97 100644 --- a/src/components/FormComponents/ModalTemplate.jsx +++ b/src/components/FormComponents/ModalTemplateTable.jsx @@ -7,7 +7,7 @@ import { Tooltip as ReactTooltip } from 'react-tooltip'; import uniqueId from 'lodash.uniqueid'; import { GlobalContext } from '../context/Global.jsx'; -import { service } from '../../services'; +import { service } from '../../services/index.js'; import CustomButton from '../Styled/CustomButton.jsx'; import * as styles from '../assets/css/form.module.css'; import FragmentList from './FragmentList.jsx'; @@ -15,6 +15,7 @@ import ModalForm from '../Forms/ModalForm.jsx'; import swalUtils from '../../utils/swalUtils.js'; import { getErrorMessage } from '../../utils/utils.js'; import { checkFragmentExists } from '../../utils/JsonFragmentsUtils.js'; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; /** * It takes a template name as an argument, loads the template file, and then @@ -22,7 +23,7 @@ import { checkFragmentExists } from '../../utils/JsonFragmentsUtils.js'; * * @returns A React component. */ -function ModalTemplate({ +function ModalTemplateTable({ label, formLabel, propName, @@ -30,12 +31,14 @@ function ModalTemplate({ header, templateName, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const [show, setShow] = useState(false); const { loadedTemplates, setLoadedTemplates, } = useContext(GlobalContext); + const { mapping } = useSectionsMapping(); const { control } = useFormContext(); const { field } = useController({ control, name: propName }); const [editedFragment, setEditedFragment] = useState({}) @@ -155,27 +158,27 @@ function ModalTemplate({ }
{error} - {template && ( - - )} - {!readonly && ( + {(!readonly || mapping) && ( { setEditedFragment(null); setShow(true); setIndex(null); }} - title={t("Add an element")} + title={t(mapping ? "Open element modal" : "Add an element")} buttonColor="rust" position="start" - > + /> + )} + {template && ( + )}
{template && show && ( @@ -187,9 +190,10 @@ function ModalTemplate({ show={show} handleSave={handleSave} handleClose={handleClose} + jsonPath={jsonPath} />)} ); } -export default ModalTemplate; +export default ModalTemplateTable; diff --git a/src/components/FormComponents/SelectContributorMultiple.jsx b/src/components/FormComponents/SelectContributorMultiple.jsx index 77c83284..67d80d56 100644 --- a/src/components/FormComponents/SelectContributorMultiple.jsx +++ b/src/components/FormComponents/SelectContributorMultiple.jsx @@ -17,6 +17,7 @@ import PersonsList from './PersonsList.jsx'; import ModalForm from '../Forms/ModalForm.jsx'; import swalUtils from '../../utils/swalUtils.js'; import { getErrorMessage } from '../../utils/utils.js'; +import MappingButton from './MappingButton.jsx'; function SelectContributorMultiple({ label, @@ -26,6 +27,7 @@ function SelectContributorMultiple({ templateName, defaultValue = null, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const { control } = useFormContext(); @@ -70,9 +72,13 @@ function SelectContributorMultiple({ }, [persons]) const fetchPersons = () => { - service.getPersons(dmpId).then((res) => { - setPersons(res.data.results); - }); + if(dmpId) { + service.getPersons(dmpId).then((res) => { + setPersons(res.data.results); + }); + } else { + setPersons([]); + } } const fetchRoles = () => { @@ -262,6 +268,7 @@ function SelectContributorMultiple({ isDisabled={readonly} placeholder={t("Select a value from the list or create a new one by clicking on +")} /> +
{!readonly && (
@@ -307,6 +314,7 @@ function SelectContributorMultiple({ handleSave={handleSave} handleClose={handleClose} externalImport={['ror', 'orcid']} + jsonPath={jsonPath} /> )} diff --git a/src/components/FormComponents/SelectContributorSingle.jsx b/src/components/FormComponents/SelectContributorSingle.jsx index b81f0bba..cf597d83 100644 --- a/src/components/FormComponents/SelectContributorSingle.jsx +++ b/src/components/FormComponents/SelectContributorSingle.jsx @@ -17,6 +17,7 @@ import PersonsList from './PersonsList.jsx'; import ModalForm from '../Forms/ModalForm.jsx'; import swalUtils from '../../utils/swalUtils.js'; import { getErrorMessage } from '../../utils/utils.js'; +import MappingButton from './MappingButton.jsx'; function SelectContributorSingle({ propName, @@ -25,6 +26,7 @@ function SelectContributorSingle({ templateName, defaultValue = null, readonly = false, + jsonPath = null, }) { const { t } = useTranslation(); const { control } = useFormContext(); @@ -70,9 +72,13 @@ function SelectContributorSingle({ }, [persons]) const fetchPersons = () => { - service.getPersons(dmpId).then((res) => { - setPersons(res.data.results); - }); + if(dmpId) { // TODO: use mode + service.getPersons(dmpId).then((res) => { + setPersons(res.data.results); + }); + } else { + setPersons([]); + } } const fetchRoles = () => { @@ -241,7 +247,9 @@ function SelectContributorSingle({ name={propName} isDisabled={readonly} placeholder={t("Select a value from the list or create a new one by clicking on +")} + jsonPath={jsonPath} /> +
{!readonly && (
@@ -273,6 +281,7 @@ function SelectContributorSingle({ tableHeader={t('Selected value')} overridable={overridableRole} readonly={readonly} + jsonPath={jsonPath} > )}
@@ -287,6 +296,7 @@ function SelectContributorSingle({ handleSave={handleSave} handleClose={handleClose} externalImport={['ror', 'orcid']} + jsonPath={jsonPath} /> )} diff --git a/src/components/FormComponents/SelectMultipleList.jsx b/src/components/FormComponents/SelectMultipleList.jsx index 03455118..11f6729b 100644 --- a/src/components/FormComponents/SelectMultipleList.jsx +++ b/src/components/FormComponents/SelectMultipleList.jsx @@ -13,6 +13,7 @@ import * as styles from '../assets/css/form.module.css'; import CustomSelect from '../Shared/CustomSelect.jsx'; import { ASYNC_SELECT_OPTION_THRESHOLD } from '../../config.js'; import swalUtils from '../../utils/swalUtils.js'; +import MappingButton from './MappingButton.jsx'; function SelectMultipleList({ label, @@ -22,6 +23,7 @@ function SelectMultipleList({ registries, overridable = false, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const { control } = useFormContext(); @@ -147,7 +149,9 @@ function SelectMultipleList({ } isDisabled={readonly} placeholder={t("Select a registry")} + jsonPath={jsonPath} /> +
@@ -165,6 +169,7 @@ function SelectMultipleList({ async={options.length > ASYNC_SELECT_OPTION_THRESHOLD} placeholder={createRegistryPlaceholder(registries, overridable, 'simple', t)} overridable={overridable} + jsonPath={jsonPath} /> )} diff --git a/src/components/FormComponents/SelectSingleList.jsx b/src/components/FormComponents/SelectSingleList.jsx index 33647f0e..75646157 100644 --- a/src/components/FormComponents/SelectSingleList.jsx +++ b/src/components/FormComponents/SelectSingleList.jsx @@ -15,6 +15,7 @@ import { ASYNC_SELECT_OPTION_THRESHOLD } from '../../config'; import NestedForm from '../Forms/NestedForm.jsx'; import { fragmentEmpty, getErrorMessage } from '../../utils/utils.js'; import swalUtils from '../../utils/swalUtils.js'; +import MappingButton from './MappingButton.jsx'; /* This is a functional component in JavaScript React that renders a select list with options fetched from a registry. It takes in several props such as label, name, changeValue, tooltip, registry, and schemaId. It uses the useState and useEffect hooks to manage the state of the options and to fetch @@ -30,6 +31,7 @@ function SelectSingleList({ defaultValue = null, overridable = false, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const { control } = useFormContext(); @@ -134,14 +136,14 @@ function SelectSingleList({ setEditedFragment({}); setShowNestedForm(false); } - + const handleDeleteList = (e) => { e.preventDefault(); e.stopPropagation(); Swal.fire(swalUtils.defaultConfirmConfig(t)).then((result) => { if (result.isConfirmed) { field.onChange({ id: field.value.id, action: 'delete' }); - + setEditedFragment({}); setShowNestedForm(false); } @@ -186,7 +188,9 @@ function SelectSingleList({ } isDisabled={readonly} placeholder={t("Select a registry")} + jsonPath={jsonPath} /> + @@ -196,15 +200,19 @@ function SelectSingleList({
{options && ( - ASYNC_SELECT_OPTION_THRESHOLD} - placeholder={createRegistryPlaceholder(registries, overridable, registryType, t)} - overridable={registryType === 'complex' ? false : overridable} - /> + <> + ASYNC_SELECT_OPTION_THRESHOLD} + placeholder={createRegistryPlaceholder(registries, overridable, registryType, t)} + overridable={registryType === 'complex' ? false : overridable} + jsonPath={jsonPath} + /> + + )}
{!readonly && overridable && registryType === 'complex' && !showNestedForm && ( diff --git a/src/components/FormComponents/SubForm.jsx b/src/components/FormComponents/SubForm.jsx index 44cbd2d9..9717e470 100644 --- a/src/components/FormComponents/SubForm.jsx +++ b/src/components/FormComponents/SubForm.jsx @@ -13,6 +13,7 @@ import { parsePattern } from '../../utils/GeneratorUtils.js'; import { GlobalContext } from '../context/Global.jsx'; import CustomButton from '../Styled/CustomButton.jsx'; import swalUtils from '../../utils/swalUtils.js'; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; function SubForm({ label, @@ -20,6 +21,7 @@ function SubForm({ tooltip, templateName, readonly = false, + jsonPath = null }) { const { t } = useTranslation(); const { control } = useFormContext(); @@ -27,9 +29,11 @@ function SubForm({ const { loadedTemplates, setLoadedTemplates, } = useContext(GlobalContext); + const { mapping } = useSectionsMapping(); const [showNestedForm, setShowNestedForm] = useState(false); const [editedFragment, setEditedFragment] = useState({}); const [template, setTemplate] = useState({}); + const [error, setError] = useState(null); const tooltipId = uniqueId('sub_form_tooltip_id_'); const ViewEditComponent = readonly ? FaEye : FaPenToSquare; @@ -87,9 +91,9 @@ function SubForm({
- {showNestedForm && ( + {(showNestedForm || mapping) && ( )} diff --git a/src/components/FormComponents/TinyArea.jsx b/src/components/FormComponents/TinyArea.jsx index dc6e4dd5..e1fb1a30 100644 --- a/src/components/FormComponents/TinyArea.jsx +++ b/src/components/FormComponents/TinyArea.jsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React, { useRef, forwardRef } from 'react'; import { useFormContext, useController } from 'react-hook-form'; import { Editor } from '@tinymce/tinymce-react'; import { Tooltip as ReactTooltip } from 'react-tooltip'; @@ -7,6 +7,8 @@ import DOMPurify from 'dompurify'; import styled from 'styled-components'; import * as styles from '../assets/css/form.module.css'; +import MappingButton from './MappingButton'; +import useSectionsMapping from '../../hooks/useSectionsMapping'; const ReadDiv = styled.div` border: solid; @@ -22,20 +24,25 @@ const ReadDiv = styled.div` background: #f2f2f2; `; -/* This is a React functional component that renders a TinyMCE editor for text input. It receives several props including `label`, `name`, `changeValue`, -`tooltip` and `schemaId`. It uses the `useContext` hook to access the `form` and `temp` values from the `GlobalContext`. It also uses the -`useState` hook to set the initial state of the `text` variable to `

`. */ -function TinyArea({ +/** + * This is a React functional component that renders a TinyMCE editor for text input. It receives several props including `label`, `name`, `changeValue`, + * `tooltip` and `schemaId`. It uses the `useContext` hook to access the `form` and `temp` values from the `GlobalContext`. It also uses the + * `useState` hook to set the initial state of the `text` variable to `

`. + */ +function TinyArea ({ label, propName, tooltip, defaultValue = null, readonly = false, + jsonPath = null, }) { + const { mapping } = useSectionsMapping(); const { control } = useFormContext(); const { field } = useController({ control, name: propName }); const { onChange, ...newField } = field; const tinyAreaLabelId = uniqueId('tiny_area_tooltip_id_'); + const editorRef = useRef(null); return ( @@ -94,15 +101,17 @@ function TinyArea({ skin_url: '/tinymce/skins/oxide', content_css: [], }} + onInit={(_evt, editor) => editorRef.current = editor} /> )} - {readonly && ( + {readonly && !mapping && ( )} +
diff --git a/src/components/Forms/DynamicForm.jsx b/src/components/Forms/DynamicForm.jsx index 4120d88b..be2e890d 100644 --- a/src/components/Forms/DynamicForm.jsx +++ b/src/components/Forms/DynamicForm.jsx @@ -14,7 +14,8 @@ import CustomButton from '../Styled/CustomButton.jsx'; import FormSelector from './FormSelector'; import { ExternalImport } from '../ExternalImport'; import { getErrorMessage } from '../../utils/utils.js'; -import { writePlan } from "../../services"; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; +import { sectionsContent } from '../../services'; function DynamicForm({ fragmentId, @@ -27,6 +28,7 @@ function DynamicForm({ formSelector = {}, readonly, fetchAnswersData = false, + id, }) { const { t } = useTranslation(); const { @@ -38,60 +40,77 @@ function DynamicForm({ setQuestionsWithGuidance, planData, } = useContext(GlobalContext); + + const { + mapping, + forms + } = useSectionsMapping(); + const methods = useForm({ defaultValues: formData }); const [loading, setLoading] = useState(false); const [error] = useState(null); const [template, setTemplate] = useState(null); const [externalImports, setExternalImports] = useState({}); + const [currentJsonPath, setCurrentJsonPath] = useState(null); useEffect(() => { setLoading(true); - if (fragmentId) { - if (formData[fragmentId]) { - if(loadedTemplates[formData[fragmentId].template_name]) { - setTemplate(loadedTemplates[formData[fragmentId].template_name]); + if (mapping) { + service.getSchema(madmpSchemaId).then((res) => { + setTemplate(res.data); + // console.log(res.data) + setCurrentJsonPath(`$.${res.data.property_name}`); + setLoadedTemplates({ ...loadedTemplates, [template?.name]: res.data }); + }).catch(console.error) + .finally(() => setLoading(false)); + } else { + if (fragmentId) { + if (formData[fragmentId]) { + if (loadedTemplates[formData[fragmentId].template_name]) { + setTemplate(loadedTemplates[formData[fragmentId].template_name]); + } else { + service.getSchemaByName(formData[fragmentId].template_name).then((res) => { + setTemplate(res.data); + setExternalImports(template?.schema?.externalImports || {}); + setLoadedTemplates({ ...loadedTemplates, [template?.name]: res.data }); + }).catch(console.error) + .finally(() => setLoading(false)); + } + methods.reset(formData[fragmentId]); } else { - service.getSchema(formData[fragmentId].template_name).then((res) => { - setTemplate(res.data); - setExternalImports(template?.schema?.externalImports || {}); - setLoadedTemplates({ ...loadedTemplates, [formData[fragmentId].template_name]: res.data }); + service.getFragment(fragmentId).then((res) => { + setTemplate(res.data.template); + setLoadedTemplates({ ...loadedTemplates, [res.data.template.name]: res.data.schema }); + setFormData({ [fragmentId]: res.data.fragment }); + methods.reset(res.data.fragment); }).catch(console.error) .finally(() => setLoading(false)); } - methods.reset(formData[fragmentId]); } else { - service.getFragment(fragmentId).then((res) => { + service.createFragment(null, madmpSchemaId, dmpId, questionId, displayedResearchOutput.id).then((res) => { + const updatedResearchOutput = { ...displayedResearchOutput }; setTemplate(res.data.template); - setLoadedTemplates({ ...loadedTemplates, [res.data.template.name]: res.data.schema }); - setFormData({ [fragmentId]: res.data.fragment }); - methods.reset(res.data.fragment); + const fragment = res.data.fragment; + const answerId = res.data.answer_id + setLoadedTemplates({ ...loadedTemplates, [fragment?.template.name]: res?.data?.schema }); + setFormData({ [fragment.id]: fragment }); + setFragmentId(fragment.id); + setAnswerId(answerId); + updatedResearchOutput.answers.push({ answer_id: answerId, question_id: questionId, fragment_id: fragment.id }) + setResearchOutputs(unionBy(researchOutputs, [updatedResearchOutput], 'id')); }).catch(console.error) .finally(() => setLoading(false)); } - } else { - service.createFragment(null, madmpSchemaId, dmpId, questionId, displayedResearchOutput.id).then((res) => { - const updatedResearchOutput = { ...displayedResearchOutput }; - setTemplate(res.data.template); - const fragment = res.data.fragment; - const answerId = res.data.answer_id - setLoadedTemplates({ ...loadedTemplates, [fragment?.template.name]: res?.data?.schema }); - setFormData({ [fragment.id]: fragment }); - setFragmentId(fragment.id); - setAnswerId(answerId); - updatedResearchOutput.answers.push({ answer_id: answerId, question_id: questionId, fragment_id: fragment.id }) - setResearchOutputs(unionBy(researchOutputs, [updatedResearchOutput], 'id')); - }).catch(console.error) - .finally(() => setLoading(false)); - } - if(fetchAnswersData) { - writePlan.getPlanData(planData.id) - .then((res) => { - const { questions_with_guidance } = res.data; - setQuestionsWithGuidance(questions_with_guidance || []); - }) - .catch(() => setQuestionsWithGuidance([])); - setLoading(false); + if (fetchAnswersData) { + sectionsContent.getPlanData(planData.id) + .then((res) => { + const { questions_with_guidance } = res.data; + setQuestionsWithGuidance(questions_with_guidance || []); + }) + .catch(() => setQuestionsWithGuidance([])); + setLoading(false); + } } }, [fragmentId]); @@ -142,30 +161,42 @@ function DynamicForm({ <> {loading && ()} {error &&

error

} - {!error && template && ( - <> - {!readonly && Object.keys(externalImports)?.length > 0 && } - {!readonly && } - -
handleSaveForm(data))}> -
- -
- {!readonly && } - -
- - )} + {(forms[id] ? forms[id]?.structured : true) + ? + <> + {!error && template && ( + <> + {!readonly && Object.keys(externalImports)?.length > 0 && } + {!readonly && } + + +
handleSaveForm(data))}> +
+ +
+ {!readonly && } + +
+ + + )} + + : +

Display of unstructured plan questions is not supported.

+ // Not working as it returns and display an independant html page that affects the global page + needs url parameters + //
+ } ); } diff --git a/src/components/Forms/FormBuilder.jsx b/src/components/Forms/FormBuilder.jsx index 80bb6877..9781530c 100644 --- a/src/components/Forms/FormBuilder.jsx +++ b/src/components/Forms/FormBuilder.jsx @@ -1,227 +1,157 @@ import React, { useContext } from 'react'; - import { GlobalContext } from '../context/Global.jsx'; import InputText from '../FormComponents/InputText.jsx'; -import InputTextArray from '../FormComponents/InputTextArray.jsx'; -import ModalTemplate from '../FormComponents/ModalTemplate'; +import InputTextList from '../FormComponents/InputTextList.jsx'; +import ModalTemplateTable from '../FormComponents/ModalTemplateTable.jsx'; import SelectContributorMultiple from '../FormComponents/SelectContributorMultiple.jsx'; import SelectContributorSingle from '../FormComponents/SelectContributorSingle.jsx'; import SelectMultipleList from '../FormComponents/SelectMultipleList'; import SelectSingleList from '../FormComponents/SelectSingleList'; -import SelectWithCreate from '../FormComponents/SelectWithCreate'; +import DropdownsToEntryTable from '../FormComponents/DropdownsToEntryTable.jsx'; import TinyArea from '../FormComponents/TinyArea'; import SubForm from '../FormComponents/SubForm.jsx'; import { createFormLabel } from '../../utils/GeneratorUtils.js'; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; -function FormBuilder({ template, readonly }) { +function FormBuilder({ template, readonly, jsonPath = null }) { const { locale } = useContext(GlobalContext); if (!template) return false; + + const { + mapping, buildJsonPath + } = useSectionsMapping(); + const properties = template.properties; const defaults = template.default?.[locale]; const formFields = []; - // si type shema is an object - // retun est code html + // if the schema is object type + // it returns html code if (template.type === 'object') { + // console.log(properties); for (const [key, prop] of Object.entries(properties)) { - const formLabel = createFormLabel(prop, locale); + const currentJsonPath = buildJsonPath(jsonPath, key, prop.type); + + const formLabel = createFormLabel(prop, locale, mapping); const tooltip = prop[`tooltip@${locale}`]; const defaultValue = defaults?.[key]; const isConst = prop['isConst']; + /** * REGISTRIES */ - if (prop.inputType === "dropdown" && - (prop.hasOwnProperty("registry_name") || prop.hasOwnProperty("registries")) - ) { - // COMPLEX REGISTRY, ONE VALUE SELECTABLE - if (prop.template_name && prop.type === 'object') { - formFields.push( - , - ); - continue; - } - // COMPLEX REGISTRY, MULTIPLE VALUES SELECTABLE - if (prop.items?.template_name && prop.type === 'array') { - formFields.push( - , - ); - continue; - } - // SIMPLE REGISTRY, ONE VALUE SELECTABLE - if (prop.type === 'string') { - formFields.push( - , - ); - continue; - } - // MULTIPLE VALUES SELECTABLE - if (prop.type === 'array') { - formFields.push( - - ); - continue; - } - } - /** - * SUB FRAGMENTS - */ + if (prop.inputType === "dropdown") { + const registries = prop["registries"] || [prop["registry_name"]]; + const registryType = prop.type === 'string' + ? "simple" + : "complex"; + + const Component = prop.type === 'array' + ? (prop.items?.template_name + ? DropdownsToEntryTable // COMPLEX REGISTRY, MULTIPLE VALUES SELECTABLE + : SelectMultipleList) // MULTIPLE VALUES SELECTABLE + : SelectSingleList; // ONE VALUE SELECTABLE + + formFields.push( + + ); // CONTRIBUTOR - if (prop.class === 'Contributor' || prop.class === 'ContributorStandard') { + } else if (prop.class === 'Contributor' || prop.class === 'ContributorStandard') { + const Component = prop.type === 'array' + ? SelectContributorMultiple + : SelectContributorSingle; + formFields.push( - , + jsonPath={currentJsonPath} + /> ); - continue; - } - if(prop.template_name && prop.type === 'object') { + } else if (prop.template_name && prop.type === 'object') { formFields.push( - ) - continue; - } - - /** - * SUB FRAGMENTS LIST - */ - if (prop.type === 'array' && prop.items.type === 'object' && prop.items.template_name) { - if (prop.items.class === 'Contributor' || prop.items.class === 'ContributorStandard') { - formFields.push( - , - ); - } else { - // FRAGMENT LIST EDITABLE WITH MODAL - formFields.push( - , - ); - } - continue; - } - + ); + // FRAGMENT LIST EDITABLE WITH MODAL + } else if (prop.type === 'array' && prop.items.type === 'object' && prop.items.template_name) { + formFields.push( + + ); /** * ARRAY FIELDS */ - if (prop.type === 'array' && prop.items.type === 'string') { + } else if (prop.type === 'array' && prop.items.type === 'string') { formFields.push( - , + jsonPath={currentJsonPath} + /> ); - continue; - } - /** * TEXT FIELDS * TEXT & TEXTAREA */ - if (prop.type === 'string' || prop.type === 'number') { - // TEXTAREA - if (prop.inputType === 'textarea') { - formFields.push( - , - ); - continue; - } else { - // TEXT FIELDS - formFields.push( - - ); - } - continue; + } else if (prop.type === 'string' || prop.type === 'number') { + const InputType = prop.inputType === 'textarea' + ? TinyArea // TEXTAREA + : InputText; // TEXT FIELDS + + formFields.push( + + ); } } } diff --git a/src/components/Forms/ModalForm.jsx b/src/components/Forms/ModalForm.jsx index 55c5e02a..537e63d7 100644 --- a/src/components/Forms/ModalForm.jsx +++ b/src/components/Forms/ModalForm.jsx @@ -5,7 +5,7 @@ import FormBuilder from './FormBuilder'; import { useTranslation } from 'react-i18next'; import { ExternalImport } from '../ExternalImport'; -function ModalForm({ data, template, label, readonly, show, handleSave, handleClose }) { +function ModalForm({ data, template, label, readonly, show, handleSave, handleClose, jsonPath = null }) { const { t } = useTranslation(); const methods = useForm({ defaultValues: data }); @@ -49,6 +49,7 @@ function ModalForm({ data, template, label, readonly, show, handleSave, handleCl diff --git a/src/components/Forms/NestedForm.jsx b/src/components/Forms/NestedForm.jsx index 0b3e6b09..d8a181b5 100644 --- a/src/components/Forms/NestedForm.jsx +++ b/src/components/Forms/NestedForm.jsx @@ -7,10 +7,12 @@ import { Button } from 'react-bootstrap'; import { ExternalImport } from '../ExternalImport'; import * as styles from '../assets/css/form.module.css'; import FormBuilder from './FormBuilder'; +import useSectionsMapping from '../../hooks/useSectionsMapping'; -function NestedForm({ propName, data, template, readonly, handleSave, handleClose }) { +function NestedForm({ propName, data, template, readonly, handleSave, handleClose, jsonPath = null }) { const { t } = useTranslation(); const methods = useForm({ defaultValues: data }); + const { mapping } = useSectionsMapping(); const externalImports = template?.schema?.externalImports || {}; @@ -34,10 +36,13 @@ function NestedForm({ propName, data, template, readonly, handleSave, handleClos const setValues = (data) => Object.keys(data) .forEach((k) => methods.setValue(k, data[k], { shouldDirty: true })); + const targetElement = document.getElementById(`nested-form-${propName}`); + if (!targetElement) return null; + return ( createPortal( <> - {Object.keys(externalImports)?.length > 0 && ( + {!mapping && Object.keys(externalImports)?.length > 0 (
@@ -47,24 +52,28 @@ function NestedForm({ propName, data, template, readonly, handleSave, handleClos
- - {!readonly && ( - - )} + {!mapping && + <> + + {!readonly && ( + + )} + + }
, - document.getElementById(`nested-form-${propName}`) + targetElement ) ) } - export default NestedForm; diff --git a/src/components/GeneralInfo/GeneralInfo.jsx b/src/components/GeneralInfo/GeneralInfo.jsx index 3ecd995f..3c171e13 100644 --- a/src/components/GeneralInfo/GeneralInfo.jsx +++ b/src/components/GeneralInfo/GeneralInfo.jsx @@ -10,6 +10,7 @@ import { GlobalContext } from "../context/Global"; import DynamicForm from "../Forms/DynamicForm"; import FunderImport from "./FunderImport"; import { getErrorMessage } from "../../utils/utils"; +import { TemplateProvider } from "../context/TemplateContext"; function GeneralInfo({ planId, @@ -52,11 +53,11 @@ function GeneralInfo({ return toast.success(response?.data?.msg); }; - + return ( <> {!readonly && researchContext === 'research_project' && ( - + )} - {projectFragmentId && } + {projectFragmentId && + + + + }
- {metaFragmentId && } + {metaFragmentId && + + + + } diff --git a/src/components/GeneralInfo/GeneralInfoLayout.jsx b/src/components/GeneralInfo/GeneralInfoLayout.jsx index 22cec8fd..e07b4bc2 100644 --- a/src/components/GeneralInfo/GeneralInfoLayout.jsx +++ b/src/components/GeneralInfo/GeneralInfoLayout.jsx @@ -5,6 +5,8 @@ import GeneralInfo from './GeneralInfo.jsx'; import GuidanceChoice from '../WritePlan/GuidanceChoice.jsx'; import '../../i18n.js'; import { Toaster } from 'react-hot-toast'; +import { SectionsMappingProvider } from '../context/SectionsMappingContext.jsx'; +import { TemplateProvider } from '../context/TemplateContext.jsx'; const toastOptions = { duration: 5000, @@ -23,20 +25,24 @@ function GeneralInfoLayout({ currentOrgName, readonly = false, }) { - return( + return ( - {isClassic && } - - + + + {isClassic && } + + + + ) } diff --git a/src/components/PlanCreation/PlanCreationLayout.jsx b/src/components/PlanCreation/PlanCreationLayout.jsx index 3aac0f1f..4540951b 100644 --- a/src/components/PlanCreation/PlanCreationLayout.jsx +++ b/src/components/PlanCreation/PlanCreationLayout.jsx @@ -1,22 +1,28 @@ import React from 'react'; import { QueryClient, QueryClientProvider } from 'react-query'; +import '../../i18n'; import Global from '../context/Global.jsx'; import PlanCreation from './PlanCreation.jsx'; -import '../../i18n'; +import { SectionsMappingProvider } from '../context/SectionsMappingContext.jsx'; +import { TemplateProvider } from '../context/TemplateContext.jsx'; const queryClient = new QueryClient(); function PlanCreationLayout({ locale, currentOrgId, currentOrgName }) { return ( - - - + + + + + + + ); } diff --git a/src/components/ResearchOutput/ResearchOutput.jsx b/src/components/ResearchOutput/ResearchOutput.jsx new file mode 100644 index 00000000..21372606 --- /dev/null +++ b/src/components/ResearchOutput/ResearchOutput.jsx @@ -0,0 +1,81 @@ +import React, { useContext, useState } from 'react'; +import ResearchOutputInfobox from "./ResearchOutputInfobox"; +import ResearchOutputModal from "./ResearchOutputModal"; +import useSectionsMapping from '../../hooks/useSectionsMapping'; +import { GlobalContext } from '../context/Global'; +import Swal from 'sweetalert2'; +import { useTranslation } from 'react-i18next'; +import { researchOutput } from '../../services'; + +function ResearchOutput({ planId, readonly }) { + // --- STATE --- + const { + setResearchOutputs, + displayedResearchOutput, setDisplayedResearchOutput, + } = useContext(GlobalContext); + + const { mapping } = useSectionsMapping(); + + const { t } = useTranslation(); + + const [show, setShow] = useState(false); + const [edit, setEdit] = useState(false); + + + // --- BEHAVIOURS --- + /** + * The function handles the deletion of a product from a research output and displays a confirmation message using the SweetAlert library. + */ + const handleDelete = (e) => { + e.preventDefault(); + e.stopPropagation(); + Swal.fire({ + title: t("Do you confirm the deletion?"), + text: t("By deleting this research output, the associated answers will also be deleted"), + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33", + cancelButtonText: t("Close"), + confirmButtonText: t("Yes, delete!"), + }).then((result) => { + if (result.isConfirmed) { + //delete + researchOutput.deleteResearchOutput(displayedResearchOutput.id, planId).then(({ data }) => { + setResearchOutputs(data.research_outputs); + + const updatedOpenedQuestions = { ...openedQuestions }; + delete updatedOpenedQuestions[displayedResearchOutput.id]; + setOpenedQuestions(updatedOpenedQuestions); + + setDisplayedResearchOutput(data.research_outputs[0]); + setUrlParams({ research_output: data.research_outputs[0].id }); + toast.success(t("Research output was successfully deleted.")); + }) + .catch((error) => setError(error)); + } + }); + }; + + const handleEdit = (e) => { + e.preventDefault(); + e.stopPropagation(); + setShow(true); + setEdit(true); + }; + + const handleClose = (e) => { + setShow(false); + setEdit(false); + } + + // --- RENDER --- + return ( + <> + {show && } + {!mapping && } + + ) +} + +export default ResearchOutput; \ No newline at end of file diff --git a/src/components/ResearchOutput/ResearchOutputModal.jsx b/src/components/ResearchOutput/ResearchOutputModal.jsx index bead75cd..f3428c5c 100644 --- a/src/components/ResearchOutput/ResearchOutputModal.jsx +++ b/src/components/ResearchOutput/ResearchOutputModal.jsx @@ -4,7 +4,6 @@ import { useTranslation } from "react-i18next"; import { Tabs } from "react-bootstrap"; import DOMPurify from "dompurify"; import AddResearchOutput from "./AddResearchOutput"; -import ImportResearchOutput from "./ImportResearchOutput"; import * as styles from "../assets/css/modal.module.css"; /* This is a functional component in JavaScript React that renders a modal window with two tabs: "Créer" and "Importer". The component takes in three diff --git a/src/components/Shared/ContentHeading.jsx b/src/components/Shared/ContentHeading.jsx new file mode 100644 index 00000000..e99d7809 --- /dev/null +++ b/src/components/Shared/ContentHeading.jsx @@ -0,0 +1,27 @@ +import React from "react"; + +function ContentHeading({ title, leftChildren, rightChildren}) { + const stickyStyle = { + position: "sticky", + top: "60px", // Replace with navbar height constant + zIndex: 10, + backgroundColor: "white", + // border: "2px solid #C6503D", + // borderTopWidth: "0", + borderRadius: "0 0 5px 5px", + }; + + return ( +
+
+

+ {leftChildren && (
{leftChildren}
)} + {title} + {rightChildren && (
{rightChildren}
)} +

+
+
+ ); +} + +export default ContentHeading; \ No newline at end of file diff --git a/src/components/Shared/CustomSelect.jsx b/src/components/Shared/CustomSelect.jsx index 92269091..77072b88 100644 --- a/src/components/Shared/CustomSelect.jsx +++ b/src/components/Shared/CustomSelect.jsx @@ -5,17 +5,20 @@ import AsyncCreatableSelect from "react-select/async-creatable"; import CreatableSelect from "react-select/creatable"; import { filterOptions } from "../../utils/GeneratorUtils"; import { useTranslation } from 'react-i18next'; +import useSectionsMapping from "../../hooks/useSectionsMapping"; function CustomSelect({ - propName = null, - options, - selectedOption = null, - onSelectChange, - async = false, - isDisabled = false, - placeholder = null, - overridable = false, + propName = null, + options, + selectedOption = null, + onSelectChange, + async = false, + isDisabled = false, + placeholder = null, + overridable = false, + disableMappingBtn = false }) { + const { mapping } = useSectionsMapping(); const { t } = useTranslation(); const SelectComponent = getSelectComponent(); const { Option } = components; @@ -45,26 +48,31 @@ function CustomSelect({ ); - return( - ({ ...base, zIndex: 9999, color: "var(--dark-blue)" }), - singleValue: (base) => ({ ...base, color: "var(--dark-blue)" }), - control: (base) => ({ ...base, borderRadius: "8px", borderWidth: "1px", borderColor: "var(--dark-blue)", marginRight: "2px" }), - }} - name={propName} - components={{ Option: CustomOption }} - options={options} - onChange={onSelectChange} - value={selectedOption} - placeholder={placeholder} - loadOptions={async ? (value) => filterOptions(options, value) : undefined} - defaultOptions={async ? options.slice(0, 100) : undefined} - cacheOptions - isDisabled={isDisabled} - noOptionsMessage={() => t('No results found.')} - /> + return ( + <> + {(disableMappingBtn || !mapping) && + ({ ...base, zIndex: 9999, color: "var(--dark-blue)" }), + singleValue: (base) => ({ ...base, color: "var(--dark-blue)" }), + control: (base) => ({ ...base, borderRadius: "8px", borderWidth: "1px", borderColor: "var(--dark-blue)", marginRight: "2px" }), + }} + name={propName} + components={{ Option: CustomOption }} + options={options} + onChange={onSelectChange} + value={selectedOption} + placeholder={placeholder} + loadOptions={async ? (value) => filterOptions(options, value) : undefined} + defaultOptions={async ? options.slice(0, 100) : undefined} + cacheOptions + isDisabled={isDisabled} + noOptionsMessage={() => t('No results found.')} + /> + } + {/* {!disableMappingBtn && } */} + ); } diff --git a/src/components/Shared/Question/DynamicFormContainer.jsx b/src/components/Shared/Question/DynamicFormContainer.jsx new file mode 100644 index 00000000..c7abd28f --- /dev/null +++ b/src/components/Shared/Question/DynamicFormContainer.jsx @@ -0,0 +1,73 @@ +import React from "react"; +import { Label } from "react-bootstrap"; +import DynamicForm from "../../Forms/DynamicForm"; +import useSectionsMapping from "../../../hooks/useSectionsMapping"; +import useQuestionModals from "../../../hooks/useQuestionModals"; +import useQuestionIcons from "../../../hooks/useQuestionIcons"; +import useQuestionState from "../../../hooks/useQuestionState"; +import { TemplateProvider } from "../../context/TemplateContext"; + + + +export function DynamicFormContainer({ question, readonly, id }) { + // --- STATE --- + const { + showFormSelectorModal, setShowFormSelectorModal + } = useQuestionModals(); + + const { + setFillFormSelectorIconColor + } = useQuestionIcons(); + + const { + fragmentId, setFragmentId, + answerId, setAnswerId, + setScriptsData + } = useQuestionState(); + + const { mapping } = useSectionsMapping(); + + + // --- RENDER --- + return ( + <> + + {fragmentId && answerId ? ( + + ) : (readonly && !mapping) ? ( + + ) : ( + + )} + + + ); +} diff --git a/src/components/Shared/Question/IconComponent.jsx b/src/components/Shared/Question/IconComponent.jsx new file mode 100644 index 00000000..15b78aac --- /dev/null +++ b/src/components/Shared/Question/IconComponent.jsx @@ -0,0 +1,26 @@ +import React from "react"; +import { Tooltip as ReactTooltip } from "react-tooltip"; +import * as styles from "../../assets/css/write_plan.module.css"; + + + +export function IconComponent({ tooltipId, icon, onClick, tooltipContent }) { + return ( +
+ +
+ {icon} +
+
+ ); +} diff --git a/src/components/Shared/Question/IconsBar.jsx b/src/components/Shared/Question/IconsBar.jsx new file mode 100644 index 00000000..ab4851cb --- /dev/null +++ b/src/components/Shared/Question/IconsBar.jsx @@ -0,0 +1,71 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import { TfiAngleDown, TfiAngleUp } from "react-icons/tfi"; +import { BsGear } from "react-icons/bs"; +import { TbBulbFilled } from "react-icons/tb"; +import { IoShuffleOutline } from "react-icons/io5"; +import { CommentSVG } from "../../Styled/svg"; +import { IconComponent } from "./IconComponent"; +import useQuestionIcons from "../../../hooks/useQuestionIcons"; +import useQuestionState from "../../../hooks/useQuestionState"; + + +export function IconsBar({ isQuestionOpened, questionsWithGuidance, questionId, formSelectors, handleIconClick, handleQuestionCollapse }) { + // --- STATE --- + const { + fillRunsIconColor, + fillCommentIconColor, + fillGuidanceIconColor, + fillFormSelectorIconColor, + } = useQuestionIcons(); + + const { + fragmentId, + answerId, + scriptsData, + } = useQuestionState(); + + const { t } = useTranslation(); + + // --- RENDER --- + return ( + <> + {isQuestionOpened() && + <> + {questionsWithGuidance.length > 0 && questionsWithGuidance.includes(questionId) && ( + } + onClick={(e) => handleIconClick(e, "guidance")} + tooltipContent={t("Guidance")} /> + )} + {fragmentId && answerId && ( + } + onClick={(e) => { + handleQuestionCollapse(true); + handleIconClick(e, "comment"); + }} + tooltipContent={t("Comments")} /> + )} + {formSelectors[fragmentId] && ( + } + onClick={(e) => handleIconClick(e, "formSelector")} + tooltipContent={t('List of customized forms')} /> + )} + {scriptsData.scripts.length > 0 && ( + } + onClick={(e) => handleIconClick(e, "runs")} + tooltipContent={t("Tools")} /> + )} + } + : } /> + + ); +} diff --git a/src/components/Shared/Question/ModalsContainer.jsx b/src/components/Shared/Question/ModalsContainer.jsx new file mode 100644 index 00000000..267155b1 --- /dev/null +++ b/src/components/Shared/Question/ModalsContainer.jsx @@ -0,0 +1,65 @@ +import React from "react"; +import GuidanceModal from "../SectionsContent/GuidanceModal"; +import CommentModal from "../../WritePlan/CommentModal"; +import RunsModal from "../../WritePlan/RunsModal"; +import useQuestionModals from "../../../hooks/useQuestionModals"; +import useQuestionIcons from "../../../hooks/useQuestionIcons"; +import useQuestionState from "../../../hooks/useQuestionState"; + + + +export function ModalsContainer({ question, readonly, displayedResearchOutput, planData, questionId, questionsWithGuidance }) { + // --- STATE --- + const { + showGuidanceModal, setShowGuidanceModal, + showCommentModal, setShowCommentModal, + showRunsModal, setShowRunsModal + } = useQuestionModals(); + + const { + setFillRunsIconColor, + setFillCommentIconColor, + setFillGuidanceIconColor, + } = useQuestionIcons(); + + const { + fragmentId, + answerId, + scriptsData, + } = useQuestionState(); + + // --- BEHAVIOURS --- + + // --- RENDER --- + return ( + <> + {!readonly && scriptsData.scripts.length > 0 && ( + + )} + {displayedResearchOutput && ( + + )} + {questionsWithGuidance.includes(question.id) && ( + + )} + + ); +} diff --git a/src/components/Shared/Question/Question.jsx b/src/components/Shared/Question/Question.jsx new file mode 100644 index 00000000..9e5d7e1c --- /dev/null +++ b/src/components/Shared/Question/Question.jsx @@ -0,0 +1,268 @@ +import React, { useContext, useEffect, useRef, useState } from "react"; +import DOMPurify from "dompurify"; +import { Panel } from "react-bootstrap"; + +import { GlobalContext } from "../../context/Global"; +import * as styles from "../../assets/css/write_plan.module.css"; +import { IconsBar } from "./IconsBar"; +import { ModalsContainer } from "./ModalsContainer"; +import { DynamicFormContainer } from "./DynamicFormContainer"; +import useQuestionModals from "../../../hooks/useQuestionModals"; +import useQuestionIcons from "../../../hooks/useQuestionIcons"; +import useQuestionState from "../../../hooks/useQuestionState"; +import useSectionsMapping from "../../../hooks/useSectionsMapping"; +import { useForm } from "react-hook-form"; +import MappingEditor from "../../TemplateMappingComponents/MappingEditor"; +import { set } from "date-fns"; +import { t } from "i18next"; + +function Question({ + question, + questionIdx, + sectionId, + sectionNumber, + readonly, + id, +}) { + // --- STATE --- + const { + planData, + openedQuestions, + setOpenedQuestions, + displayedResearchOutput, + questionsWithGuidance, + setUrlParams, + formSelectors, + } = useContext(GlobalContext); + + const { + showGuidanceModal, setShowGuidanceModal, + showCommentModal, setShowCommentModal, + showRunsModal, setShowRunsModal, + showFormSelectorModal, setShowFormSelectorModal, + closeAllModals + } = useQuestionModals(); + + const { + setFillRunsIconColor, + setFillCommentIconColor, + setFillGuidanceIconColor, + setFillFormSelectorIconColor, + resetIconColors + } = useQuestionIcons(); + + const { + setFragmentId, + setAnswerId + } = useQuestionState(); + + const { + mapping, + forms, + setEditorRef, + USAGE_TARGET, + DEFAULT_REF, + setCurrentlyOpenedQuestion, + } = useSectionsMapping(); + + const currentEditorRef = useRef(null); + + const [questionId] = useState(question.id); // ??? questionId et question.id both used in different ways ??? + + const DRO_ID = displayedResearchOutput?.id || id || 0; + + // --- BEHAVIOURS --- + useEffect(() => { + if (displayedResearchOutput) { + const answer = displayedResearchOutput.answers?.find( + (answer) => question?.id === answer?.question_id + ); + setAnswerId(answer?.answer_id); + setFragmentId(answer?.fragment_id); + } + + const queryParameters = new URLSearchParams(window.location.search); + setUrlParams({ research_output: queryParameters.get('research_output') }); + + handleIconClick(null, 'formSelector'); + }, [displayedResearchOutput, question.id]); + + /** + * Handles toggling the open/collapse state of a question. + * This function is called when a question is collapsed or expanded. + * It updates the state of opened questions based on the changes. + * @param {boolean} expanded - The new state of the question (collapsed or expanded). + */ + const handleQuestionCollapse = (expanded) => { + closeAllModals(); + + let updatedState = { ...openedQuestions }; + + if (forms[id]?.usage === USAGE_TARGET || !updatedState[DRO_ID]) + updatedState[DRO_ID] = {}; // Set/Reset the state of opened questions for the current DRO + + updatedState[DRO_ID][sectionId] = { ...updatedState[DRO_ID][sectionId], [questionId]: expanded }; + setOpenedQuestions(updatedState); + + const queryParameters = new URLSearchParams(window.location.search); + setUrlParams({ research_output: queryParameters.get('research_output') }); + handleIconClick(null, 'formSelector'); + + if (forms[id]?.usage === USAGE_TARGET) { + setEditorRef(expanded ? currentEditorRef : DEFAULT_REF); + setCurrentlyOpenedQuestion(expanded + ? questionId + : null + ); + } + }; + + /** + * Handles the click event for showing modals and updating icon colors based on the modal type. + * + * @param {Event} e - The click event object.handleIconClick + * @param {string} modalType - The type of modal to show ('comment', 'guidance', or 'runs'). + */ + const handleIconClick = (e, modalType) => { + e?.stopPropagation(); + e?.preventDefault(); + + // Check if the current modal type is the same as the one that is about to be opened + const modalStateMap = { + comment: showCommentModal, + guidance: showGuidanceModal, + runs: showRunsModal, + formSelector: showFormSelectorModal + }; + const isModalOpen = modalStateMap[modalType]; + + // If the current modal is the same as the one about to be opened, close it + if (isModalOpen) { + resetIconColors(); + return closeAllModals(); + } + + // Open the specified modal and update icon colors + const setModalFunction = { + comment: setShowCommentModal, + guidance: setShowGuidanceModal, + runs: setShowRunsModal, + formSelector: setShowFormSelectorModal + }; + + const setIconColorFunction = { + comment: setFillCommentIconColor, + guidance: setFillGuidanceIconColor, + runs: setFillRunsIconColor, + formSelector: setFillFormSelectorIconColor + }; + + Object.keys(modalStateMap).forEach(key => { + setModalFunction[key](modalType === key); + setIconColorFunction[key](modalType === key ? 'var(--rust)' : 'var(--dark-blue)'); + }); + }; + + + /** + * Checks if a specific question is opened based on its identifiers within the nested object structure. + * + * @returns {boolean} True if the question is opened, false otherwise. + */ + const isQuestionOpened = () => { + return !!openedQuestions?.[DRO_ID]?.[sectionId]?.[questionId]; + }; + + + // --- RENDER --- + return ( + handleQuestionCollapse(expanded)} + > + + +
+
+
+ {sectionNumber}.{questionIdx} +
+
+
+
+ +
+
+ + + + {isQuestionOpened() && + + }{/* LEFT : surely DynamicForm */} + {/* RIGHT : surely NOT DynamicForm */} + {isQuestionOpened() && question.madmp_schema ? ( + + ) : ( + <> + {forms[id].usage === USAGE_TARGET && + + } + + ) + } + + + ); +} + +export default Question; \ No newline at end of file diff --git a/src/components/WritePlan/GuidanceModal.jsx b/src/components/Shared/SectionsContent/GuidanceModal.jsx similarity index 96% rename from src/components/WritePlan/GuidanceModal.jsx rename to src/components/Shared/SectionsContent/GuidanceModal.jsx index b6733191..7fd60a89 100644 --- a/src/components/WritePlan/GuidanceModal.jsx +++ b/src/components/Shared/SectionsContent/GuidanceModal.jsx @@ -3,12 +3,12 @@ import React, { useContext, useEffect, useState, useRef } from "react"; import { useTranslation } from "react-i18next"; import { Tooltip as ReactTooltip } from 'react-tooltip'; -import { GlobalContext } from "../context/Global"; -import { guidances } from "../../services"; -import CustomError from "../Shared/CustomError"; -import CustomSpinner from "../Shared/CustomSpinner"; -import { NavBody, NavBodyText, ScrollNav, Theme, SubTitle } from "./styles/GuidanceModalStyles"; -import InnerModal from "../Shared/InnerModal/InnerModal"; +import { GlobalContext } from "../../context/Global"; +import { guidances } from "../../../services"; +import CustomError from "../CustomError"; +import CustomSpinner from "../CustomSpinner"; +import { NavBody, NavBodyText, ScrollNav, Theme, SubTitle } from "../../WritePlan/styles/GuidanceModalStyles"; +import InnerModal from "../InnerModal/InnerModal"; const locales = { fr: 'fr-FR', diff --git a/src/components/Shared/SectionsContent/Section.jsx b/src/components/Shared/SectionsContent/Section.jsx new file mode 100644 index 00000000..a9c67b33 --- /dev/null +++ b/src/components/Shared/SectionsContent/Section.jsx @@ -0,0 +1,108 @@ +import React, { useContext, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { GlobalContext } from "../../context/Global"; +import * as styles from "../../assets/css/write_plan.module.css"; +import Question from "../Question/Question"; +import { QuestionModalsProvider } from "../../context/QuestionModalsContext"; +import { QuestionIconsProvider } from "../../context/QuestionIconsContext"; +import { QuestionStateProvider } from "../../context/QuestionStateContext"; +import useSectionsMapping from "../../../hooks/useSectionsMapping"; + +function Section({ section, readonly, id }) { + const { mapping } = useSectionsMapping(); + const { t } = useTranslation(); + const { openedQuestions, setOpenedQuestions, displayedResearchOutput } = useContext(GlobalContext); + + const [sectionId, setSectionId] = useState(section.id); + + useEffect(() => { + setSectionId(section.id); + }, [section]); + + /** + * Toggle the state of questions within a section to the provided boolean value. + * + * @param {boolean} boolVal - The boolean value to set for all questions in the section. + */ + const toggleQuestionsInSection = (boolVal) => { + const queryParameters = new URLSearchParams(window.location.search); + + const currentResearchOutput = queryParameters.get('research_output'); + + const updatedState = { + ...openedQuestions[currentResearchOutput], + [sectionId]: section.questions.reduce((acc, question) => { + acc[question.id] = boolVal; + return acc; + }, {}) + }; + + setOpenedQuestions({ + ...openedQuestions, + [currentResearchOutput]: updatedState + }); + }; + + return ( + <> +

+ {section.number}. {section.title} +

+ {!mapping && +
+
+ + | + +
+
+ } + {section.questions.filter((question) => { + if (question?.madmp_schema?.classname === 'personal_data_issues') { + return displayedResearchOutput && displayedResearchOutput.hasPersonalData; + } + return true; + }).map((question, idx) => ( + + + + + + + + ))} + + ); +} + +export default Section; diff --git a/src/components/Shared/SectionsContent/SectionsContent.jsx b/src/components/Shared/SectionsContent/SectionsContent.jsx new file mode 100644 index 00000000..229cdd3f --- /dev/null +++ b/src/components/Shared/SectionsContent/SectionsContent.jsx @@ -0,0 +1,71 @@ +import React, { useContext, useEffect, useState } from "react"; +// import { sectionsContent } from "../../../services"; +import CustomSpinner from "../CustomSpinner"; +import { GlobalContext } from "../../context/Global"; +import CustomError from "../CustomError"; +import Section from "./Section"; +import * as styles from "../../assets/css/write_plan.module.css"; +import useSectionsMapping from "../../../hooks/useSectionsMapping"; +import useTemplate from "../../../hooks/useTemplate"; + +function SectionsContent({ templateId, readonly, afterFetchTreatment, children, id = null, hiddenFields, mappingUsage }) { + // --- STATE --- + const { + openedQuestions, + displayedResearchOutput, + } = useContext(GlobalContext); + + const { setIsStructuredModel, setIsHiddenQuestionsFields, setUsage } = useSectionsMapping(); + + const { + loading, setLoading, + error, + sectionsData, setSectionsData, + fetchAndProcessSectionsData, + } = useTemplate(); + + // --- BEHAVIOURS --- + + /** + * A useEffect hook that is called when the component is mounted. + */ + useEffect(() => { + async function fetchAndProcess() { + setLoading(true); + const res = await fetchAndProcessSectionsData(templateId, afterFetchTreatment, [openedQuestions, displayedResearchOutput]); + setSectionsData(res.data); + setIsStructuredModel(id, res.data.structured); + setIsHiddenQuestionsFields(id, hiddenFields); + setUsage(id, mappingUsage); + } + + fetchAndProcess(); + }, [templateId]); + + // --- RENDER --- + return ( +
+
+ {loading ? ( + + ) : error ? ( + + ) : ( + <> + {children} + {sectionsData?.sections?.map((section) => ( +
+ ))} + + )} +
+
+ ); +} + +export default SectionsContent; diff --git a/src/components/Shared/TableList.jsx b/src/components/Shared/TableList.jsx new file mode 100644 index 00000000..366183af --- /dev/null +++ b/src/components/Shared/TableList.jsx @@ -0,0 +1,164 @@ +import React, { useEffect, useState } from 'react'; +import { capitalizeFirstLetter } from '../../utils/utils.js'; +import { t } from 'i18next'; +import TableOptionsBar from './TableOptionsBar.jsx'; + +function TableList ({ columns, actions, defaultSortKey, onRowClick, dataCatcher, itemsPerPage = 10 }) { + const [data, setData] = useState([]); + const [filter, setFilter] = useState(''); + const [expanded, setExpanded] = useState({}); + const [sortConfig, setSortConfig] = useState({ + key: defaultSortKey, + direction: 'ascending', + icon: 'fas fa-sort-up' + }); + const [currentPage, setCurrentPage] = useState(1); + + useEffect(() => { + dataCatcher() + .then(response => { + const initialMappings = response.data.mappings; + setData(initialMappings); + sortArray(initialMappings, sortConfig.key, sortConfig.direction); + }) + .catch(error => { + console.error('There was an error fetching the mappings:', error); + }); + }, []); + + const requestSort = (key) => { + let direction = 'ascending'; + let icon = 'fas fa-sort-up'; + if (sortConfig.key === key && sortConfig.direction === 'ascending') { + direction = 'descending'; + icon = 'fas fa-sort-down'; + } + setSortConfig({ key, direction, icon }); + sortArray(data, key, direction); + }; + + const sortArray = (data, key, direction) => { + if (!data.length) return; + let sortedData = [...data]; + sortedData.sort((a, b) => { + if (a[key] < b[key]) { + return direction === 'ascending' ? -1 : 1; + } + if (a[key] > b[key]) { + return direction === 'ascending' ? 1 : -1; + } + return 0; + }); + setData(sortedData); + }; + + const toggleExpand = (id, key) => { + const currentKey = `${id}-${key}`; + setExpanded(prev => ({ + ...prev, + [currentKey]: !prev[currentKey] + })); + }; + + const formatValue = (value, type, formatter, id, key) => { + if (formatter) return formatter(value); + if (type === 'date') { + return new Date(value).toLocaleDateString(); + } + + const stringValue = capitalizeFirstLetter(value.toString()); + if (stringValue.length <= 30) return stringValue; + + const isExpanded = expanded[`${id}-${key}`]; + const collapseData = !isExpanded + ? { + text: `${stringValue.substring(0, 30)}...`, + buttonClass: 'fas fa-sort-down', + } + : { + text: stringValue, + buttonClass: 'fas fa-sort-up', + }; + + return ( + <> + toggleExpand(id, key)} style={{ cursor: 'pointer' }}> + {collapseData.text} + + + ); + }; + + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = Math.min(startIndex + itemsPerPage, data.length); + const totalItems = data.length; + + const filteredData = data.filter(item => { + return columns.some(column => formatValue(item[column.key], column.type, column.formatter, item.id, column.key).toString().toLowerCase().includes(filter.toLowerCase())); + }); + + const currentData = filteredData.slice(startIndex, endIndex); + const totalPages = Math.ceil(filteredData.length / itemsPerPage); + + return ( +
+ + + + + {columns.map((column) => ( + + ))} + + + + + {currentData.length === 0 && ( + + + + )} + {currentData.map(item => ( + onRowClick && onRowClick(item.id)} style={{ cursor: onRowClick ? 'pointer' : 'initial' }}> + {columns.map(column => ( + + ))} + + + ))} + +
requestSort(column.key)}> + {capitalizeFirstLetter(t(column.label))} + + {t('Actions')}
+ {t('No data found')} +
{formatValue(item[column.key], column.type, column.formatter, item.id, column.key)} +
+ + +
+
+
+ ); +}; + +export default TableList; \ No newline at end of file diff --git a/src/components/Shared/TableOptionsBar.jsx b/src/components/Shared/TableOptionsBar.jsx new file mode 100644 index 00000000..dca1b28a --- /dev/null +++ b/src/components/Shared/TableOptionsBar.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { t } from 'i18next'; + +function TableOptionsBar({ filter, setFilter, startIndex, endIndex, totalItems, currentPage, setCurrentPage, totalPages }) { + return
+
+
+ + + + setFilter(e.target.value)} + placeholder={`${t('Filter')}...`} + name="search" + id="search" /> +
+
+
+ {`${totalItems > 0 ? startIndex + 1 : 0}-${endIndex} ${t('of')} ${totalItems} ${t('elements')}`} + +   + +
+
; +} + +export default TableOptionsBar; \ No newline at end of file diff --git a/src/components/Styled/CustomButton.jsx b/src/components/Styled/CustomButton.jsx index e6566d4b..69114029 100644 --- a/src/components/Styled/CustomButton.jsx +++ b/src/components/Styled/CustomButton.jsx @@ -36,6 +36,10 @@ const DivButton = styled.div` display: flex; justify-content: ${(props) => (props.$position || "start")}; `; +const flexMiddle = { + display: "flex", + alignItems: "center", +}; const Button = (props) => { switch (props.$buttonType) { @@ -54,7 +58,7 @@ const Button = (props) => { * button is styled using CSS-in-JS with the help of the styled-components library. The component returns a div that contains a button element with an * onClick event listener that triggers the handleClick function passed as a prop. */ -function CustomButton({ handleClick, title, buttonType = 'button', buttonColor, position, disabled }) { +function CustomButton({ handleClick, icon, title, buttonType = 'button', buttonColor, position, disabled }) { const handleButtonAction = (e) => { handleClick?.(e); }; @@ -62,7 +66,10 @@ function CustomButton({ handleClick, title, buttonType = 'button', buttonColor, return ( ); diff --git a/src/components/TemplateMapping/TemplateMapping.jsx b/src/components/TemplateMapping/TemplateMapping.jsx new file mode 100644 index 00000000..1924c3a7 --- /dev/null +++ b/src/components/TemplateMapping/TemplateMapping.jsx @@ -0,0 +1,122 @@ +import React, { useContext, useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { GlobalContext } from "../context/Global"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; +import MappingPropertiesForm from "../TemplateMappingComponents/MappingPropertiesForm"; +import Mapper from "../TemplateMappingComponents/Mapper"; +import CustomButton from "../Styled/CustomButton"; +import CustomSpinner from "../Shared/CustomSpinner"; +import ContentHeading from "../Shared/ContentHeading"; +import { t } from "i18next"; +import CustomError from "../Shared/CustomError"; +import { FaSave, FaTrashAlt, FaPlus } from "react-icons/fa"; + +function TemplateMapping({ data, locale, mappingId }) { + // --- STATE --- + const { i18n } = useTranslation(); + const { setLocale } = useContext(GlobalContext); + const { + enableMapping, + initialTemplateId, + targetTemplateId, templateMappingName, + templateMappingId, setTemplateMappingId, + saveMapping, deleteMapping, + isLoading, isError, + mappingType, setMappingType, + ANCHOR_CONTENT + } = useSectionsMapping(); + + // --- EFFECTS --- + useEffect(() => { + enableMapping(); + setLocale(locale); + i18n.changeLanguage(locale.substring(0, 2)); + + // setInitialTemplateId(5); + // setTargetTemplateId(4); + console.log(initialTemplateId, targetTemplateId); + }, [locale]); + + useEffect(() => { + setTemplateMappingId(mappingId); + }, [mappingId]); + + if (isError) + return ( + //

{t('An error occurred while loading the mapping.')}

+ window.location.href = `/super_admin/template_mappings${ANCHOR_CONTENT}`} + /> + ) + + return ( + <> + ← {t('All Mappings')} + } + rightChildren={ +
+ } + handleClick={saveMapping} + buttonColor="orange" + /> +   + } + handleClick={deleteMapping} + buttonColor="red" + /> +
+ } + /> +

{t('Here you can map the sections of a structured template to the sections of a classic template.')}

+ {isLoading + ? + : <> + + {templateMappingId && ( + + )} +
+ {!templateMappingId && + } + title={t('Create Mapping')} + handleClick={saveMapping} + buttonColor="orange" + /> + } +
+ + } + + ); +} + +export default TemplateMapping; \ No newline at end of file diff --git a/src/components/TemplateMapping/TemplateMappingLayout.jsx b/src/components/TemplateMapping/TemplateMappingLayout.jsx new file mode 100644 index 00000000..5c2f4d57 --- /dev/null +++ b/src/components/TemplateMapping/TemplateMappingLayout.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Toaster } from 'react-hot-toast'; + +import Global from '../context/Global.jsx'; +import '../../i18n.js'; + +import TemplateMapping from './TemplateMapping.jsx'; +import { SectionsMappingProvider } from '../context/SectionsMappingContext.jsx'; +import { TemplateProvider } from '../context/TemplateContext.jsx'; + +const toastOptions = { + duration: 5000, +}; + +function TemplateMappingLayout({ + locale = 'en_GB', + mappingId, +}) { + return ( + + + + + + + + + ) +} + +export default TemplateMappingLayout; diff --git a/src/components/TemplateMapping/TemplateMappingsList.jsx b/src/components/TemplateMapping/TemplateMappingsList.jsx new file mode 100644 index 00000000..86c18ee0 --- /dev/null +++ b/src/components/TemplateMapping/TemplateMappingsList.jsx @@ -0,0 +1,61 @@ +import React, { useEffect, useState } from 'react'; +import TableList from '../Shared/TableList.jsx'; +import useSectionsMapping from '../../hooks/useSectionsMapping.js'; +import { t } from 'i18next'; +import { sectionsContent, templateMapping } from '../../services'; +import ContentHeading from '../Shared/ContentHeading.jsx'; + +function TemplateMappingsList() { + const { + duplicateMapping, + deleteMapping, + ANCHOR_CONTENT + } = useSectionsMapping(); + const [sections, setSections] = useState([]); + + useEffect(() => { + sectionsContent.getSectionsData().then(response => { + console.log("response", response); + const sectionsMap = response.data.reduce((acc, section) => { + acc[section.id] = section.title; + return acc; + }, {}); + setSections(sectionsMap); + }); + }, []); + + console.log("tm", templateMapping); + + const columns = [ + { key: 'id', label: 'ID' }, + { key: 'name', label: 'Name'}, + { key: 'type_mapping', label: 'Type' }, + { key: 'source_id', label: 'Source', formatter: (id) => sections[id] || id }, + { key: 'target_id', label: 'Target', formatter: (id) => sections[id] || id }, + { key: 'created_at', label: 'Created At', type: 'date' }, + { key: 'updated_at', label: 'Updated At', type: 'date' } + ]; + + const actions = [ + { label: 'Edit', action: (id) => window.location.href = `/super_admin/template_mappings/${id}/edit${ANCHOR_CONTENT}` }, + { label: 'Duplicate', action: (id) => duplicateMapping(id) }, + { label: 'Delete', action: (id) => deleteMapping({id}) } + ]; + + return ( + <> + {t('New Mapping')}} + /> + + + ); +} + +export default TemplateMappingsList; diff --git a/src/components/TemplateMapping/TemplateMappingsListLayout.jsx b/src/components/TemplateMapping/TemplateMappingsListLayout.jsx new file mode 100644 index 00000000..42042a54 --- /dev/null +++ b/src/components/TemplateMapping/TemplateMappingsListLayout.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Toaster } from 'react-hot-toast'; +import '../../i18n.js'; + +import TemplateMappingsList from './TemplateMappingsList.jsx'; +import { SectionsMappingProvider } from '../context/SectionsMappingContext.jsx'; +import { TemplateProvider } from '../context/TemplateContext.jsx'; + +const toastOptions = { + duration: 5000, +}; + +function TemplateMappingsListLayout({ + locale = 'en_GB', + mappingId, +}) { + return ( + + + + + + + ) +} + +export default TemplateMappingsListLayout; diff --git a/src/components/TemplateMappingComponents/CodeEditor.jsx b/src/components/TemplateMappingComponents/CodeEditor.jsx new file mode 100644 index 00000000..2d3d66ed --- /dev/null +++ b/src/components/TemplateMappingComponents/CodeEditor.jsx @@ -0,0 +1,55 @@ +import React, { forwardRef, useEffect, useState } from "react"; +import AceEditor from "react-ace-builds"; +import "react-ace-builds/webpack-resolver-min"; +import useTemplate from "../../hooks/useTemplate"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; + +const CodeEditor = forwardRef(({ + templateId, + // onChange, +}, ref) => { + + const { setLoading } = useTemplate(); + const { + mappingSchema, + editorRef, + setHandleInsert, + } = useSectionsMapping(); + const [content, setContent] = useState(""); + + useEffect(() => { + setLoading(true); + console.log(mappingSchema); + setContent(JSON.stringify(mappingSchema.mapping, null, 2)); + }, [templateId, mappingSchema]); + + + // --- MappingButton logic --- + const handleInsert = ({ path }) => { + if (editorRef.current && path) { + const editor = editorRef.current.editor; // Access to the Ace editor instance + const position = editor.getCursorPosition(); // Get the current cursor position + editor.session.insert(position, `${path}`); // Insert path at the current cursor position + } + }; + + useEffect(() => { + setHandleInsert(() => handleInsert); + }, [editorRef]); + // --- End MappingButton logic --- + + return +}); + +export default CodeEditor; \ No newline at end of file diff --git a/src/components/TemplateMappingComponents/Mapper.jsx b/src/components/TemplateMappingComponents/Mapper.jsx new file mode 100644 index 00000000..13d7ed24 --- /dev/null +++ b/src/components/TemplateMappingComponents/Mapper.jsx @@ -0,0 +1,59 @@ +import React, { useRef, useState } from "react"; +import SectionsContent from "../Shared/SectionsContent/SectionsContent"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; +import CodeEditor from "./CodeEditor"; +import { TemplateProvider } from "../context/TemplateContext"; +import { t } from "i18next"; + +function Mapper({ mappingType }) { + const targetRef = useRef(null); + const { + USAGE_INITIAL, USAGE_TARGET, + editorRef, + initialTemplateId, + targetTemplateId, + TYPE_FORM, + } = useSectionsMapping(); + + const INNER_SCROLLING_DEFAULT_HEIGHT = "calc(100vh - 100px)"; + const [height, setHeight] = useState(INNER_SCROLLING_DEFAULT_HEIGHT); + const innerScrollingFormsStyle = { + position: "absolute", + top: "0", + height: height, + maxHeight: INNER_SCROLLING_DEFAULT_HEIGHT, + overflowY: "auto", + padding: "0 1em", + }; + + return
+
+
+ + + +
+ {!editorRef.current && +

{t('Open a question in the target template to get started.')}

+ } + +
+
+ + {mappingType === TYPE_FORM.value + ? +
+ +
+ : + + } +
+
+
; +} + +export default Mapper; \ No newline at end of file diff --git a/src/components/TemplateMappingComponents/MappingEditor.jsx b/src/components/TemplateMappingComponents/MappingEditor.jsx new file mode 100644 index 00000000..601efc50 --- /dev/null +++ b/src/components/TemplateMappingComponents/MappingEditor.jsx @@ -0,0 +1,159 @@ +import React, { forwardRef, useEffect, useState } from "react"; +import { Editor } from "@tinymce/tinymce-react"; +import uniqueId from "lodash.uniqueid"; +import * as styles from "../assets/css/form.module.css"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; + +/** + * This is a React functional component that renders a TinyMCE editor for mapping text input. It receives several props including `label`, `defaultValue`. + */ +const MappingEditor = forwardRef(({ + label, defaultValue = null, questionId, +}, ref) => { + const tinyAreaLabelId = uniqueId('tiny_area_tooltip_id_'); + + const [value, setValue] = useState(defaultValue); + + const { + editorRef, + setHandleInsert, + insertInMappingSchema, + mappingSchema + } = useSectionsMapping(); + + // --- MappingButton logic --- + const handleInsert = ({ path }) => { + const editor = editorRef.current; + if (editor) { + const formattedLabel = path.replace(/^\$./, '').split('.').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(' > '); + const content = ``; + editor.execCommand('mceInsertContent', false, content); + insertInMappingSchema(editor.getContent()); + } + console.log("JSON PATH:", path) + }; + + useEffect(() => { + setHandleInsert(() => handleInsert); + }, [editorRef]); + // --- End MappingButton logic --- + + // --- Mapping schema logic --- + useEffect(() => { + const editor = editorRef.current; + + const handleChange = () => { + insertInMappingSchema(editor.getContent()); + }; + + const handleKeyDown = (e) => { + if ((e.keyCode === 8 || e.keyCode === 46) && editor.selection) { + const node = editor.selection.getNode(); + if (node.nodeName === 'SAMP' && node.getAttribute('json-path')) { + e.preventDefault(); + editor.dom.remove(node); + editor.fire('ContentChanged'); + } + } + insertInMappingSchema(editor.getContent()); + }; + + if (editor && editor.on) { + editor.on('change', handleChange); + editor.on('keydown', handleKeyDown); + } + + addAttrIntoEditorContentTags(); // Add attributes to the samp tags for display purposes in the editor + + return () => { + if (editor && editor.off) { + editor.off('change', handleChange); + editor.off('keydown', handleKeyDown); + } + }; + }, [editorRef]); + + function addAttrIntoEditorContentTags() { + const value = mappingSchema.mapping[questionId]?.replace(/]+)>/g, (match) => { + // build data-path + const jsonPathMatch = match.match(/json-path="([^"]+)"/); + if (jsonPathMatch) { + const jsonPath = jsonPathMatch[1]; + const formattedLabel = jsonPath.replace(/^\$./, '').split('.').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(' > '); + return match.replace(/json-path="([^"]+)"/, `json-path="${jsonPath}" data-label="${formattedLabel}" contenteditable="false"`); + } + return match.replace(/json-path="([^"]+)"/, 'data-path="$1"'); + }); + + setValue(value); + // console.log("VALUE:", value); + // console.log(editorRef?.current?.getContent()); + } + + // --- End Mapping schema logic --- + + return ( +
+
+
+ + +
+ + ref.current = editor} /> +
+
+ ); +}); + +export default MappingEditor; diff --git a/src/components/TemplateMappingComponents/MappingPropertiesForm.jsx b/src/components/TemplateMappingComponents/MappingPropertiesForm.jsx new file mode 100644 index 00000000..87c161d8 --- /dev/null +++ b/src/components/TemplateMappingComponents/MappingPropertiesForm.jsx @@ -0,0 +1,72 @@ +import React, { useEffect } from "react"; +import { FormProvider, useForm } from "react-hook-form"; +import TemplateSelector from "./TemplateSelector"; +import { TemplateProvider } from "../context/TemplateContext"; +import useSectionsMapping from "../../hooks/useSectionsMapping"; +import InputText from "../FormComponents/InputText"; +import { t } from "i18next"; + +export function MappingPropertiesForm({ data, mappingType, setMappingType }) { + const methods = useForm({ defaultValues: data }); + + const { + initialTemplateId, setInitialTemplateId, + targetTemplateId, setTargetTemplateId, + templateMappingId, + templateMappingName, setTemplateMappingName, + TYPE_FORM, TYPE_JSON, + } = useSectionsMapping(); + + useEffect(() => { + methods.setValue('mappingType', mappingType); + }, [mappingType]); + + return
+ + +
+
+
+ +
+
+ +
+
+
+
; +} + +export default MappingPropertiesForm; diff --git a/src/components/TemplateMappingComponents/TemplateSelector.jsx b/src/components/TemplateMappingComponents/TemplateSelector.jsx new file mode 100644 index 00000000..3799fb4f --- /dev/null +++ b/src/components/TemplateMappingComponents/TemplateSelector.jsx @@ -0,0 +1,73 @@ +import React, { useEffect, useState } from 'react'; +import { useFormContext, useController } from 'react-hook-form'; +import CustomSelect from '../Shared/CustomSelect.jsx'; +import { sectionsContent } from '../../services'; +import * as styles from '../assets/css/form.module.css'; + +function TemplateSelector({ + label, + propName, + tooltip, + defaultValue = null, + readonly = false, + requestParams = '', + data, + onTemplateChange, +}) { + const { control } = useFormContext(); + const { field } = useController({ control, name: propName, defaultValue }); + const [options, setOptions] = useState([]); + + const handleSelectChange = (selectedOption) => { + field.onChange(selectedOption.value); + onTemplateChange(selectedOption.value); + }; + + useEffect(() => { + const fetchData = async () => { + let fetchedOptions = []; + if (data) { + fetchedOptions = data; + } else { + try { + const res = await sectionsContent.getSectionsData(requestParams); + fetchedOptions = res.data.map(option => ({ + value: option.id, + label: option.title + })); + } catch (err) { + console.error(err); + } + const defaultOption = defaultValue ? fetchedOptions.find(option => option.value === defaultValue) : fetchedOptions[0] || null; + if (defaultOption) { + field.onChange(defaultOption.value); + onTemplateChange(defaultOption.value); + } + } + setOptions(fetchedOptions); + + }; + + fetchData(); + }, [requestParams, data, defaultValue, onTemplateChange]); + + const selectedOption = options.find(option => option.value === field.value) || null; + + return ( +
+ + + {tooltip &&

{tooltip}

} + +
+ ); +} + +export default TemplateSelector; diff --git a/src/components/WritePlan/Question.jsx b/src/components/WritePlan/Question.jsx deleted file mode 100644 index 6fff153a..00000000 --- a/src/components/WritePlan/Question.jsx +++ /dev/null @@ -1,446 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import DOMPurify from "dompurify"; -import { Panel, Label } from "react-bootstrap"; -import { Tooltip as ReactTooltip } from "react-tooltip"; -import { TfiAngleDown, TfiAngleUp } from "react-icons/tfi"; -import { BsGear } from "react-icons/bs"; -import { TbBulbFilled } from "react-icons/tb"; -import { IoShuffleOutline } from "react-icons/io5"; - -import { GlobalContext } from "../context/Global"; -import * as styles from "../assets/css/write_plan.module.css"; -import DynamicForm from "../Forms/DynamicForm"; -import GuidanceModal from "./GuidanceModal"; -import CommentModal from "./CommentModal"; -import RunsModal from "./RunsModal"; -import { CommentSVG } from "../Styled/svg"; - -function Question({ - question, - questionIdx, - sectionId, - sectionNumber, - readonly, -}) { - const { - planData, - openedQuestions, - setOpenedQuestions, - displayedResearchOutput, - questionsWithGuidance, - setUrlParams, - } = useContext(GlobalContext); - const [questionId] = useState(question.id); - const [fragmentId, setFragmentId] = useState(null); - const [answerId, setAnswerId] = useState(null); - const [scriptsData, setScriptsData] = useState({ scripts: [] }); // {classname: "class", id: 1} - - const [showGuidanceModal, setShowGuidanceModal] = useState(false); - const [showCommentModal, setShowCommentModal] = useState(false); - const [showRunsModal, setShowRunsModal] = useState(false); - const [showFormSelectorModal, setShowFormSelectorModal] = useState(false); - - const [fillRunsIconColor, setFillRunsIconColor] = useState("var(--dark-blue)"); - const [fillCommentIconColor, setFillCommentIconColor] = useState("var(--dark-blue)"); - const [fillGuidanceIconColor, setFillGuidanceIconColor] = useState("var(--dark-blue)"); - const [fillFormSelectorIconColor, setFillFormSelectorIconColor] = useState("var(--dark-blue)"); - - const [currentResearchOutput, setCurrentResearchOutput] = useState(null); - - const { formSelectors } = useContext(GlobalContext); - - const { t } = useTranslation(); - - useEffect(() => { - const answer = displayedResearchOutput?.answers?.find( - (answer) => question?.id === answer?.question_id - ); - setAnswerId(answer?.answer_id); - setFragmentId(answer?.fragment_id); - - const queryParameters = new URLSearchParams(window.location.search); - setUrlParams({ research_output: queryParameters.get('research_output') }); - - setCurrentResearchOutput(Number.parseInt(queryParameters.get('research_output'), 10)); - - handleIconClick(null, 'formSelector'); - }, [displayedResearchOutput, question.id, currentResearchOutput]); - - /** - * Handles toggling the open/collapse state of a question. - * This function is called when a question is collapsed or expanded. - * It updates the state of opened questions based on the changes. - */ - const handleQuestionCollapse = (expanded) => { - closeAllModals(); - - const updatedState = { ...openedQuestions[displayedResearchOutput.id] }; - - if (!updatedState[sectionId]) { - updatedState[sectionId] = { - [questionId]: false, - }; - } - - updatedState[sectionId] = { - ...updatedState[sectionId], - [questionId]: expanded, - }; - - setOpenedQuestions({ - ...openedQuestions, - [displayedResearchOutput.id]: updatedState, - }); - - const queryParameters = new URLSearchParams(window.location.search); - setUrlParams({ research_output: queryParameters.get('research_output') }); - - handleIconClick(null, 'formSelector'); - }; - - const closeAllModals = () => { - setShowCommentModal(false); - setFillCommentIconColor('var(--dark-blue)'); - - setShowGuidanceModal(false); - setFillGuidanceIconColor('var(--dark-blue)'); - - setShowFormSelectorModal(false); - setFillFormSelectorIconColor('var(--dark-blue)'); - - setShowRunsModal(false); - setFillRunsIconColor('var(--dark-blue)'); - }; - - /** - * Handles the click event for showing modals and updating icon colors based on the modal type. - * - * @param {Event} e - The click event object.handleIconClick - * @param {string} modalType - The type of modal to show ('comment', 'guidance', or 'runs'). - */ - const handleIconClick = (e, modalType) => { - if (e) { - e.stopPropagation(); - e.preventDefault(); - } - - // Check if the current modal type is the same as the one that is about to be opened - const isModalOpen = - (modalType === 'comment' && showCommentModal) || - (modalType === 'guidance' && showGuidanceModal) || - (modalType === 'runs' && showRunsModal) || - (modalType === 'formSelector' && showFormSelectorModal) - - // If the current modal is the same as the one about to be opened, close it - if (isModalOpen) { - return closeAllModals(); - } - - // Open the specified modal and update icon colors - setShowCommentModal(modalType === 'comment'); - setFillCommentIconColor( - modalType === 'comment' ? 'var(--rust)' : 'var(--dark-blue)', - ); - - setShowGuidanceModal(modalType === 'guidance'); - setFillGuidanceIconColor( - modalType === 'guidance' ? 'var(--rust)' : 'var(--dark-blue)', - ); - - setShowRunsModal(modalType === 'runs'); - setFillRunsIconColor( - modalType === 'runs' ? 'var(--rust)' : 'var(--dark-blue)', - ); - - setShowFormSelectorModal(modalType === 'formSelector'); - setFillFormSelectorIconColor( - modalType === 'formSelector' ? 'var(--rust)' : 'var(--dark-blue)', - ); - }; - - /** - * Checks if a specific question is opened based on its identifiers within the nested object structure. - * - * @returns {boolean} True if the question is opened, false otherwise. - */ - const isQuestionOpened = () => - !!openedQuestions?.[displayedResearchOutput?.id]?.[sectionId]?.[questionId] && (displayedResearchOutput.id === currentResearchOutput); - - return ( - <> - { - handleQuestionCollapse(expanded)} - > - - -
-
-
- {sectionNumber}.{questionIdx} -
-
-
- -
- {questionsWithGuidance.length > 0 && questionsWithGuidance.includes(question.id) && ( -
- -
{ - handleIconClick(e, "guidance"); - }} - style={{ marginLeft: "5px" }} - > - {isQuestionOpened() && ( - - )} -
-
- )} - - {fragmentId && answerId && ( -
- -
{ - handleQuestionCollapse(true); - handleIconClick(e, "comment"); - }} - style={{ marginLeft: "5px" }} - > - {isQuestionOpened() && ( - - )} -
-
- )} - - {isQuestionOpened() && formSelectors[fragmentId] && ( -
- -
{ - handleIconClick(e, "formSelector"); - }} - style={{ marginLeft: "5px" }} - > - -
-
- )} - - {scriptsData.scripts.length > 0 && ( -
- -
{ - handleIconClick(e, "runs"); - }} - style={{ marginLeft: "5px" }} - > - {isQuestionOpened() && ( - - )} -
-
- )} - - {isQuestionOpened() ? ( - - ) : ( - - )} -
-
- - - - {isQuestionOpened() && ( -
- {!readonly && scriptsData.scripts.length > 0 && ( - - )} - - {questionsWithGuidance.length > 0 && questionsWithGuidance.includes(question.id) && ()} -
- )} - {isQuestionOpened() ? ( - <> - {fragmentId && answerId ? ( - - ) : readonly ? - ( - - ) : - () - } - - ) : ( - <> - )} -
- - } - - ); -} - -export default Question; diff --git a/src/components/WritePlan/Section.jsx b/src/components/WritePlan/Section.jsx deleted file mode 100644 index 51ad4bb5..00000000 --- a/src/components/WritePlan/Section.jsx +++ /dev/null @@ -1,94 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; - -import { GlobalContext } from "../context/Global"; -import * as styles from "../assets/css/write_plan.module.css"; -import Question from "./Question"; - -function Section({ section, readonly }) { - const { t } = useTranslation(); - const { openedQuestions, setOpenedQuestions, displayedResearchOutput } = useContext(GlobalContext); - const [sectionId, setSectionId] = useState(section.id); - - useEffect(() => { - setSectionId(section.id); - }, [section]) - - /** - * Toggle the state of questions within a section to the provided boolean value. - * - * @param {boolean} boolVal - The boolean value to set for all questions in the section. - */ - const toggleQuestionsInSection = (boolVal) => { - const queryParameters = new URLSearchParams(window.location.search); - - const currentResearchOutput = queryParameters.get('research_output'); - - const updatedState = { - ...openedQuestions[currentResearchOutput], - [sectionId]: section.questions.reduce((acc, question) => { - acc[question.id] = boolVal; - return acc; - }, {}) - }; - - setOpenedQuestions({ - ...openedQuestions, - [currentResearchOutput]: updatedState - }); - }; - - return ( - <> -

- {section.number}. {section.title} -

-
-
- - | - -
-
- {section.questions.filter((question) => { - if (question?.madmp_schema?.classname === 'personal_data_issues') { - return displayedResearchOutput.hasPersonalData; - } - return true; - }).map((question, idx) => ( - - ))} - - ); -} - -export default Section; diff --git a/src/components/WritePlan/SectionsContent.jsx b/src/components/WritePlan/SectionsContent.jsx deleted file mode 100644 index 4d2dcbc6..00000000 --- a/src/components/WritePlan/SectionsContent.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { useContext, useEffect, useState } from "react"; -import Swal from "sweetalert2"; -import toast from "react-hot-toast"; -import { useTranslation } from "react-i18next"; - -import { writePlan } from "../../services"; -import CustomSpinner from "../Shared/CustomSpinner"; -import { GlobalContext } from "../context/Global"; -import CustomError from "../Shared/CustomError"; -import { researchOutput } from "../../services"; -import Section from "./Section"; -import ResearchOutputModal from "../ResearchOutput/ResearchOutputModal"; -import ResearchOutputInfobox from "../ResearchOutput/ResearchOutputInfobox"; -import * as styles from "../assets/css/write_plan.module.css"; - -function SectionsContent({ planId, templateId, readonly }) { - const { t } = useTranslation(); - const { - openedQuestions, - setOpenedQuestions, - researchOutputs, setResearchOutputs, - displayedResearchOutput, setDisplayedResearchOutput, - setPlanInformations, - setUrlParams, - } = useContext(GlobalContext); - const [loading, setLoading] = useState(false); - const [show, setShow] = useState(false); - const [edit, setEdit] = useState(false); - const [error, setError] = useState(null); - const [sectionsData, setSectionsData] = useState(null); - - /* A useEffect hook that is called when the component is mounted. It is calling the getSectionsData function, which is an async function that returns a - promise. When the promise is resolved, it sets the data state to the result of the promise. It then sets the openedQuestions state to the result of the promise. - If the promise is rejected, it sets the error state to the error. - Finally, it sets the loading state to false. */ - useEffect(() => { - setLoading(true); - writePlan.getSectionsData(templateId) - .then((res) => { - - setPlanInformations({ - locale: res?.data?.locale.split('-')?.at(0) || 'fr', - title: res?.data?.title, - version: res?.data?.version, - org: res?.data?.org, - publishedDate: res?.data?.publishedDate, - }); - - // const researchOutputFilter = res.data.plan.research_outputs.filter((el) => { - // return el.id === displayedResearchOutput.id; - // }); - setSectionsData(res.data); - if (!openedQuestions || !openedQuestions[displayedResearchOutput.id]) { - // const allCollapses = res.data.map((section) => { - // return {[section.id]: []}; - // }); - const updatedCollapseState = { - ...openedQuestions, - [displayedResearchOutput.id]: {}, - }; - setOpenedQuestions(updatedCollapseState); - } - }) - .catch((error) => setError(error)) - .finally(() => setLoading(false)); - }, [templateId]); - - /** - * The function handles the deletion of a product from a research output and displays a confirmation message using the SweetAlert library. - */ - const handleDelete = (e) => { - e.preventDefault(); - e.stopPropagation(); - Swal.fire({ - title: t("Do you confirm the deletion?"), - text: t("By deleting this research output, the associated answers will also be deleted"), - icon: "warning", - showCancelButton: true, - confirmButtonColor: "#3085d6", - cancelButtonColor: "#d33", - cancelButtonText: t("Close"), - confirmButtonText: t("Yes, delete!"), - }).then((result) => { - if (result.isConfirmed) { - //delete - researchOutput.deleteResearchOutput(displayedResearchOutput.id, planId).then(({ data }) => { - setResearchOutputs(data.research_outputs); - - const updatedOpenedQuestions = { ...openedQuestions }; - delete updatedOpenedQuestions[displayedResearchOutput.id]; - setOpenedQuestions(updatedOpenedQuestions); - - setDisplayedResearchOutput(data.research_outputs[0]); - setUrlParams({ research_output: data.research_outputs[0].id }); - toast.success(t("Research output was successfully deleted.")); - }) - .catch((error) => setError(error)); - } - }); - }; - - const handleEdit = (e) => { - e.preventDefault(); - e.stopPropagation(); - setShow(true); - setEdit(true); - }; - - const handleClose = (e) => { - setShow(false); - setEdit(false); - } - - return ( -
- {show && } - {loading && } - {error && } - {!error && sectionsData?.sections && ( - <> -
- - {sectionsData?.sections?.map((section) => ( -
- ))} -
- - )} -
- ); -} - -export default SectionsContent; diff --git a/src/components/WritePlan/WritePlan.jsx b/src/components/WritePlan/WritePlan.jsx index 9ae4fcc0..14543f8a 100644 --- a/src/components/WritePlan/WritePlan.jsx +++ b/src/components/WritePlan/WritePlan.jsx @@ -6,8 +6,8 @@ import { FaRegCompass } from "react-icons/fa6"; import { Tooltip as ReactTooltip } from 'react-tooltip'; import { Panel } from 'react-bootstrap'; -import SectionsContent from "./SectionsContent"; -import { writePlan } from "../../services"; +import SectionsContent from "../Shared/SectionsContent/SectionsContent"; +import { sectionsContent } from "../../services"; import CustomSpinner from "../Shared/CustomSpinner"; import { GlobalContext } from "../context/Global"; import CustomError from "../Shared/CustomError"; @@ -16,7 +16,9 @@ import ResearchOutputsTabs from "./ResearchOutputsTabs"; import * as styles from "../assets/css/sidebar.module.css"; import consumer from "../../cable"; import { useTour } from "../Shared/Joyride/JoyrideContext"; +import ResearchOutput from "../ResearchOutput/ResearchOutput"; import AddResearchOutput from "../ResearchOutput/AddResearchOutput"; +import { TemplateProvider } from "../context/TemplateContext"; const locales = { fr, en: enGB }; @@ -29,6 +31,7 @@ function WritePlan({ currentOrgId, currentOrgName, }) { + // --- STATE --- const { t, i18n } = useTranslation(); const { setFormData, @@ -40,19 +43,42 @@ function WritePlan({ displayedResearchOutput, setDisplayedResearchOutput, researchOutputs, setResearchOutputs, setQuestionsWithGuidance, - planInformations, setPlanInformations, + planInformations, + setOpenedQuestions, + setPlanInformations, } = useContext(GlobalContext); + const subscriptionRef = useRef(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const { setIsOpen } = useTour(); + const updatePlanAfterFetchTreatment = (res, openedQuestions, displayedResearchOutput) => { + setPlanInformations({ + locale: res?.data?.locale.split('-')?.at(0) || 'fr', + title: res?.data?.title, + version: res?.data?.version, + org: res?.data?.org, + publishedDate: res?.data?.publishedDate, + }); + + if (openedQuestions && openedQuestions[displayedResearchOutput.id]) return; + + const updatedCollapseState = { + ...openedQuestions, + [displayedResearchOutput.id]: {}, + }; + setOpenedQuestions(updatedCollapseState); + return res; + } + + // --- BEHAVIOURS --- const handleWebsocketData = useCallback((data) => { - if(data.target === 'research_output_infobox' && displayedResearchOutput.id === data.research_output_id) { + if (data.target === 'research_output_infobox' && displayedResearchOutput.id === data.research_output_id) { setDisplayedResearchOutput({ ...displayedResearchOutput, ...data.payload }) } - if(data.target === 'dynamic_form') { + if (data.target === 'dynamic_form') { setFormData({ [data.fragment_id]: data.payload }) } }, [displayedResearchOutput, setDisplayedResearchOutput, setFormData]) @@ -62,7 +88,7 @@ function WritePlan({ }, [locale]) useEffect(() => { - if(subscriptionRef.current) subscriptionRef.current.unsubscribe(); + if (subscriptionRef.current) subscriptionRef.current.unsubscribe(); subscriptionRef.current = consumer.subscriptions.create({ channel: "PlanChannel", id: planId }, { connected: () => console.log("connected!"), @@ -77,6 +103,10 @@ function WritePlan({ /* A hook that is called when the component is mounted. It is used to fetch data from the API. */ //TODO update this , it can make error useEffect(() => { + fetchPlanData(); + }, [planId]); + + async function fetchPlanData() { setLoading(true); const queryParameters = new URLSearchParams(window.location.search); @@ -86,7 +116,7 @@ function WritePlan({ setUserId(userId); setLocale(locale); - writePlan.getPlanData(planId) + sectionsContent.getPlanData(planId) .then((res) => { setPlanData(res.data); setDmpId(res.data.dmp_id); @@ -106,12 +136,12 @@ function WritePlan({ !researchOutputs && setResearchOutputs(research_outputs); setQuestionsWithGuidance(questions_with_guidance || []); setFormData(null); + + window.addEventListener("scroll", (e) => handleScroll(e)); }) .catch((error) => setError(error)) .finally(() => setLoading(false)); - - window.addEventListener("scroll", (e) => handleScroll(e)); - }, [planId]); + } const handleScroll = () => { const roNavBar = document.querySelector('#ro-nav-bar'); @@ -119,21 +149,16 @@ function WritePlan({ const sectionContent = document.querySelector('#sections-content'); const { bottom: bottomSectionContent, top: topSectionContent } = sectionContent?.getBoundingClientRect() || 0; - if(!sectionContent) return; + if (!sectionContent) return; - if (bottomRoNavBar >= bottomSectionContent) { - sectionContent.style.borderBottomLeftRadius = '0'; - } else { - sectionContent.style.borderBottomLeftRadius = '8px'; - } + sectionContent.style.borderBottomLeftRadius = + bottomRoNavBar >= bottomSectionContent ? '0' : '8px'; - if (topRoNavBar <= topSectionContent) { - sectionContent.style.borderTopLeftRadius = '0'; - } else { - sectionContent.style.borderTopLeftRadius = '8px'; - } + sectionContent.style.borderTopLeftRadius = + topRoNavBar <= topSectionContent ? '0' : '8px'; } + // --- RENDER --- return (
{loading && } @@ -195,11 +220,11 @@ function WritePlan({
{planId && displayedResearchOutput && ( - + + + + + )}
@@ -211,7 +236,7 @@ function WritePlan({

{t('Your plan does not yet include any research output')}

- {}} close={false} show={true} edit={false} /> + { }} close={false} show={true} edit={false} />
diff --git a/src/components/WritePlan/WritePlanLayout.jsx b/src/components/WritePlan/WritePlanLayout.jsx index e6f1ee14..92d4c7ff 100644 --- a/src/components/WritePlan/WritePlanLayout.jsx +++ b/src/components/WritePlan/WritePlanLayout.jsx @@ -8,6 +8,8 @@ import '../../i18n.js'; import Joyride from '../Shared/Joyride/index.jsx'; import { writePlanSteps } from '../Shared/Tours'; import { useTranslation } from 'react-i18next'; +import { SectionsMappingProvider } from '../context/SectionsMappingContext.jsx'; +import { TemplateProvider } from '../context/TemplateContext.jsx'; const toastOptions = { duration: 5000, @@ -24,21 +26,25 @@ function WritePlanLayout({ }) { const { t } = useTranslation(); - return( + return ( - - - - + + + + + + + + ) } diff --git a/src/components/context/QuestionIconsContext.jsx b/src/components/context/QuestionIconsContext.jsx new file mode 100644 index 00000000..f9b541bc --- /dev/null +++ b/src/components/context/QuestionIconsContext.jsx @@ -0,0 +1,31 @@ +import React, { createContext, useState, useContext } from 'react'; + +export const QuestionIconsContext = createContext(); + +export const QuestionIconsProvider = ({ children }) => { + const CSS_VAR_DARK_BLUE = "var(--dark-blue)"; + + const [fillRunsIconColor, setFillRunsIconColor] = useState(CSS_VAR_DARK_BLUE); + const [fillCommentIconColor, setFillCommentIconColor] = useState(CSS_VAR_DARK_BLUE); + const [fillGuidanceIconColor, setFillGuidanceIconColor] = useState(CSS_VAR_DARK_BLUE); + const [fillFormSelectorIconColor, setFillFormSelectorIconColor] = useState(CSS_VAR_DARK_BLUE); + + const resetIconColors = () => { + setFillRunsIconColor(CSS_VAR_DARK_BLUE); + setFillCommentIconColor(CSS_VAR_DARK_BLUE); + setFillGuidanceIconColor(CSS_VAR_DARK_BLUE); + setFillFormSelectorIconColor(CSS_VAR_DARK_BLUE); + }; + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/src/components/context/QuestionModalsContext.jsx b/src/components/context/QuestionModalsContext.jsx new file mode 100644 index 00000000..5c7e12d2 --- /dev/null +++ b/src/components/context/QuestionModalsContext.jsx @@ -0,0 +1,33 @@ +import React, { createContext, useState } from 'react'; + +export const QuestionModalsContext = createContext(); + +export const QuestionModalsProvider = ({ children }) => { + // --- STATE --- + const [showGuidanceModal, setShowGuidanceModal] = useState(false); + const [showCommentModal, setShowCommentModal] = useState(false); + const [showRunsModal, setShowRunsModal] = useState(false); + const [showFormSelectorModal, setShowFormSelectorModal] = useState(false); + + // --- BEHAVIOURS --- + const closeAllModals = () => { + setShowGuidanceModal(false); + setShowCommentModal(false); + setShowRunsModal(false); + setShowFormSelectorModal(false); + }; + + // --- RENDER --- + return ( + + {children} + + ); +}; + diff --git a/src/components/context/QuestionStateContext.jsx b/src/components/context/QuestionStateContext.jsx new file mode 100644 index 00000000..76e8bf0a --- /dev/null +++ b/src/components/context/QuestionStateContext.jsx @@ -0,0 +1,19 @@ +import React, { createContext, useState, useContext } from 'react'; + +export const QuestionStateContext = createContext(); + +export const QuestionStateProvider = ({ children }) => { + const [fragmentId, setFragmentId] = useState(null); + const [answerId, setAnswerId] = useState(null); + const [scriptsData, setScriptsData] = useState({ scripts: [] }); + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/src/components/context/SectionsMappingContext.jsx b/src/components/context/SectionsMappingContext.jsx new file mode 100644 index 00000000..e9c10908 --- /dev/null +++ b/src/components/context/SectionsMappingContext.jsx @@ -0,0 +1,260 @@ +import React, { createContext, useState, useEffect, useRef } from 'react'; +import { t } from 'i18next'; +import Swal from "sweetalert2"; +import toast from 'react-hot-toast'; +import { templateMapping } from '../../services'; + +export const SectionsMappingContext = createContext(); + +export const SectionsMappingProvider = ({ children }) => { + + // --- Mapping logic --- + const [mapping, setMapping] = useState(false); + const enableMapping = () => setMapping(true); + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + const [templateMappingId, setTemplateMappingId] = useState(null); + const [templateMappingName, setTemplateMappingName] = useState(t('New Mapping')); + // --- End Mapping logic --- + + // --- Mapping Type logic --- + const TYPE_FORM = { value: 'form', label: 'Form To Form' }; + const TYPE_JSON = { value: 'json', label: 'Form To JSON' }; + const [mappingType, setMappingType] = useState(TYPE_FORM.value); + // --- End Mapping Type logic --- + + // --- Editor logic --- + const DEFAULT_REF = useRef(null); + const [editorRef, setEditorRef] = useState(DEFAULT_REF); + const [handleInsert, setHandleInsert] = useState(() => () => { }); + const [currentlyOpenedQuestion, setCurrentlyOpenedQuestion] = useState(null); + // --- End Editor logic --- + + // --- Forms properties logic --- + const USAGE_INITIAL = 'initial'; + const USAGE_TARGET = 'target'; + const [forms, setForms] = useState({}); // Associate a form id to its structure and content display mode + const setIsStructuredModel = (id, value) => updateForm(id, 'structured', value); + const setIsHiddenQuestionsFields = (id, value) => updateForm(id, 'hiddenQuestionsFields', value); + const setUsage = (id, value) => updateForm(id, 'usage', value); + + const updateForm = (id, key, value) => setForms(prev => ({ + ...prev, + [id]: { + ...prev[id], + [key]: value + } + })); + // --- End Forms properties logic --- + + // --- Mapping schema logic --- + const [initialTemplateId, setInitialTemplateId] = useState(5); + const [targetTemplateId, setTargetTemplateId] = useState(1); + const [mappingSchema, setMappingSchema] = useState({ mapping: {} }); + + const insertInMappingSchema = (value) => { + const cleanedValue = value.replace(/]+)>/g, (match) => { + return match.replace(/ data-label="[^"]*"| contenteditable="[^"]*"/g, ''); + }); + + setMappingSchema(prev => ({ + ...prev, + mapping: { + ...prev.mapping, + [currentlyOpenedQuestion]: cleanedValue + } + })); + } + // --- End Mapping schema logic --- + + // --- Routing logic --- + const ANCHOR_CONTENT = '#content'; + // --- End Routing logic --- + + // --- API logic --- + /** + * Save the current mapping + * If the mapping is new, redirect to the edit page + */ + const saveMapping = async () => { + console.log(mappingSchema.mapping); + const data = { + mapping: mappingSchema.mapping, + source_id: initialTemplateId, + target_id: targetTemplateId, + type_mapping: mappingType, + name: templateMappingName + }; + + if (templateMappingId) { + await templateMapping.updateMapping(templateMappingId, data) + .then(() => toast.success('Mapping updated')) + .catch(error => toast.error('Failed to update mapping:', error)); + } + else { + const res = await templateMapping.newMapping(data); + console.log('New mapping:', res); + if (res?.data?.id) + window.location.href = `/super_admin/template_mappings/${res.data.id}/edit${ANCHOR_CONTENT}`; + else + console.error('Redirection error:', res); + } + } + + /** + * Delete the current mapping and redirect to the index page + */ + const deleteMapping = async ({ id }) => { + if (!id && !templateMappingId) return; + const res = await areYouSureModal(); + if (!res.isConfirmed) return; + await templateMapping.destroyMapping(id || templateMappingId); + confirmationModal(); + + window.location.href = `/super_admin/template_mappings`; + } + + const duplicateMapping = async (id) => { + const originalMappingData = await templateMapping.getMapping(id); + const data = { + mapping: originalMappingData.data.mapping, + source_id: originalMappingData.data.source_id, + target_id: originalMappingData.data.target_id, + type_mapping: originalMappingData.data.type_mapping, + name: `${originalMappingData.data.name} (${t('copy')})` + }; + const res = await templateMapping.newMapping(data); + if (res?.data?.id) + window.location.href = `/super_admin/template_mappings/${res.data.id}/edit${ANCHOR_CONTENT}`; + else + console.error('Redirection error:', res); + } + + const fetchMapping = async () => { + try { + const res = await templateMapping.getMapping(templateMappingId) + .catch(() => setIsError(true)); + if (!res) return; + + console.log("data: ", res.data); + const { source_id, target_id, mapping } = res.data; + console.log("data: ", res.data); + setInitialTemplateId(source_id); + setTargetTemplateId(target_id); + setMappingSchema({ mapping }); + setMappingType(res.data.type_mapping); + setTemplateMappingName(res.data.name); + } catch (error) { + console.error('Failed to fetch mapping:', error); + } + setIsLoading(false); + }; + + useEffect(() => { + if (!mapping) return; + setIsLoading(true); + if (!templateMappingId) { + setIsLoading(false); + return; + } + + fetchMapping(); + }, [templateMappingId]); + + // useEffect(() => { + // console.log('mappingSchema:', mappingSchema); + // console.log('templateMappingId:', templateMappingId); + // console.log('initialTemplateId:', initialTemplateId); + // console.log('targetTemplateId:', targetTemplateId); + // }); + + // --- End API logic --- + + + // --- JSON path logic --- + const buildJsonPath = (jsonPath, key, type) => { + const jpKey = type === 'array' + ? `${key}[*]` + : key; + + const currentJsonPath = jsonPath + ? `${jsonPath}.${jpKey}` + : `$.${key}`; + + return currentJsonPath; + } + // --- End JSON path logic --- + + // --- Alerts logic --- + const areYouSureModal = async () => { + return Swal.fire({ + title: 'Are you sure?', + text: "You won't be able to revert this!", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#d33', + cancelButtonColor: '#3085d6', + confirmButtonText: 'Yes, delete it!' + }) + }; + + const confirmationModal = async () => { + return Swal.fire( + 'Deleted!', + 'Your mapping has been deleted.', + 'success' + ); + } + + // --- End Alerts logic --- + + return ( + + {children} + + ); +}; diff --git a/src/components/context/TemplateContext.jsx b/src/components/context/TemplateContext.jsx new file mode 100644 index 00000000..1302a80c --- /dev/null +++ b/src/components/context/TemplateContext.jsx @@ -0,0 +1,43 @@ +import React, { createContext, useState } from 'react'; +import { sectionsContent } from '../../services'; + +export const TemplateContext = createContext(); + +export const TemplateProvider = ({ children }) => { + // --- STATE --- + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [sectionsData, setSectionsData] = useState(null); + + // --- BEHAVIOURS --- + const fetchAndProcessSectionsData = async (templateId, afterFetchTreatment, params) => { + try { + const res = await sectionsContent.getSectionsData(templateId); + + if (afterFetchTreatment) + return afterFetchTreatment(res, ...params); + + return res; + } + catch (err) { + setError(err); + } + finally { + setLoading(false); + } + }; + + + // --- RENDER --- + return ( + + {children} + + ); +}; + diff --git a/src/hooks/contextProcess.js b/src/hooks/contextProcess.js new file mode 100644 index 00000000..b52bb607 --- /dev/null +++ b/src/hooks/contextProcess.js @@ -0,0 +1,21 @@ +import React, { useContext } from "react" + +/** + * Process contexts before returning them + * @param {React.context} ctx + * @returns The context provided + */ +const contextProcess = (context) => { + const ctx = useContext(context); + + if (!ctx) { + const error = new Error(); + const stack = error.stack || ''; + const hookName = stack.split('\n')[2].match(/at (\w+)/)[1]; + throw new Error(`${hookName} must be used within ${context.displayName || 'the corresponding provider'}`); + } + + return ctx; +} + +export default contextProcess; \ No newline at end of file diff --git a/src/hooks/useQuestionIcons.js b/src/hooks/useQuestionIcons.js new file mode 100644 index 00000000..b5dba692 --- /dev/null +++ b/src/hooks/useQuestionIcons.js @@ -0,0 +1,7 @@ +import { QuestionIconsContext } from "../components/context/QuestionIconsContext"; +import contextProcess from "./contextProcess"; + +const useQuestionIcons = () => + contextProcess(QuestionIconsContext); + +export default useQuestionIcons; \ No newline at end of file diff --git a/src/hooks/useQuestionModals.js b/src/hooks/useQuestionModals.js new file mode 100644 index 00000000..a09b8463 --- /dev/null +++ b/src/hooks/useQuestionModals.js @@ -0,0 +1,7 @@ +import { QuestionModalsContext } from "../components/context/QuestionModalsContext"; +import contextProcess from "./contextProcess"; + +const useQuestionModals = () => + contextProcess(QuestionModalsContext); + +export default useQuestionModals; \ No newline at end of file diff --git a/src/hooks/useQuestionState.js b/src/hooks/useQuestionState.js new file mode 100644 index 00000000..320e4210 --- /dev/null +++ b/src/hooks/useQuestionState.js @@ -0,0 +1,7 @@ +import { QuestionStateContext } from "../components/context/QuestionStateContext"; +import contextProcess from "./contextProcess"; + +const useQuestionState = () => + contextProcess(QuestionStateContext); + +export default useQuestionState; \ No newline at end of file diff --git a/src/hooks/useSectionsMapping.js b/src/hooks/useSectionsMapping.js new file mode 100644 index 00000000..5cd7ebdb --- /dev/null +++ b/src/hooks/useSectionsMapping.js @@ -0,0 +1,7 @@ +import { SectionsMappingContext } from "../components/context/SectionsMappingContext" +import contextProcess from "./contextProcess"; + +const useSectionsMapping = () => + contextProcess(SectionsMappingContext); + +export default useSectionsMapping; \ No newline at end of file diff --git a/src/hooks/useTemplate.js b/src/hooks/useTemplate.js new file mode 100644 index 00000000..3d67d938 --- /dev/null +++ b/src/hooks/useTemplate.js @@ -0,0 +1,7 @@ +import { TemplateContext } from "../components/context/TemplateContext"; +import contextProcess from "./contextProcess"; + +const useTemplate = () => + contextProcess(TemplateContext); + +export default useTemplate; \ No newline at end of file diff --git a/src/services/index.js b/src/services/index.js index 0e034023..19c462a6 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -8,7 +8,8 @@ import news from "./news"; import planCreation from "./planCreation"; import researchOutput from "./researchOutput"; import service from "./service"; -import writePlan from "./writePlan"; +import sectionsContent from "./sectionsContent"; +import templateMapping from "./templateMapping"; export { comments, @@ -21,5 +22,6 @@ export { planCreation, researchOutput, service, - writePlan, + sectionsContent, + templateMapping, }; diff --git a/src/services/writePlan.js b/src/services/sectionsContent.js similarity index 96% rename from src/services/writePlan.js rename to src/services/sectionsContent.js index 08a8d1fd..e837210b 100644 --- a/src/services/writePlan.js +++ b/src/services/sectionsContent.js @@ -8,11 +8,10 @@ import axios from '../utils/AxiosClient'; */ const getPlanData = async (planId) => axios.get(`/plans/${planId}/answers_data`); -const getSectionsData = async (templateId) => axios.get(`/templates/${templateId}`); +const getSectionsData = async (templateId) => axios.get(`/templates/${templateId || ''}`); // eslint-disable-next-line import/no-anonymous-default-export export default { getPlanData, getSectionsData, }; - diff --git a/src/services/templateMapping.js b/src/services/templateMapping.js new file mode 100644 index 00000000..b47113ae --- /dev/null +++ b/src/services/templateMapping.js @@ -0,0 +1,23 @@ +import axios from '../utils/AxiosClient'; +import createHeaders from '../utils/HeaderBuilder'; + + +const MAPPING_URL = '/super_admin/template_mappings'; +const MAPPING_OPTIONS = {headers: createHeaders({'Accept': 'application/json'}, true)}; +console.log(MAPPING_OPTIONS); + +const getMappings = async () => axios.get(MAPPING_URL, MAPPING_OPTIONS); +const getMapping = async (id) => axios.get(`${MAPPING_URL}/${id}`); +const newMapping = async (data) => axios.post(MAPPING_URL, { ...data, ...MAPPING_OPTIONS }); + +const updateMapping = async (id, data) => axios.put(`${MAPPING_URL}/${id}`, { ...data, ...MAPPING_OPTIONS }); +const destroyMapping = async (id) => axios.delete(`${MAPPING_URL}/${id}`, MAPPING_OPTIONS); + +// eslint-disable-next-line import/no-anonymous-default-export +export default { + getMappings, + getMapping, + newMapping, + updateMapping, + destroyMapping, +}; diff --git a/src/utils/GeneratorUtils.js b/src/utils/GeneratorUtils.js index 41a6dddd..2b929009 100644 --- a/src/utils/GeneratorUtils.js +++ b/src/utils/GeneratorUtils.js @@ -81,8 +81,11 @@ export function createRegistryPlaceholder(registries, overridable, registryType, * @param locale : the locale of the form * @returns if it exists a label in the form language */ -export function createFormLabel(property, locale) { - return property[`form_label@${locale}`] || property[`label@${locale}`] || 'No label defined' +export function createFormLabel(property, locale, displayLabel = false) { + if (!displayLabel && property[`form_label@${locale}`]) { + return property[`form_label@${locale}`]; + } + return property[`label@${locale}`] || ''; } /** diff --git a/src/utils/utils.js b/src/utils/utils.js index cdf064aa..fe6054ed 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -15,7 +15,7 @@ export function exists(data, list, keys) { } export function except(data, excludedKeys) { - const rest = {...data}; + const rest = { ...data }; excludedKeys.forEach(key => { delete rest[key]; }); @@ -89,4 +89,8 @@ export function flattenObject(obj, prefix = '', result = {}) { } } return result; -} \ No newline at end of file +} + +export function capitalizeFirstLetter(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f6861d60..7d8ec882 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,12 +4,12 @@ "@adobe/css-tools@^4.3.2": version "4.3.3" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz" integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: "@babel/highlight" "^7.24.2" @@ -17,24 +17,24 @@ "@babel/helper-module-imports@^7.16.7": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: "@babel/types" "^7.24.0" "@babel/helper-string-parser@^7.23.4": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/highlight@^7.24.2": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" @@ -44,7 +44,7 @@ "@babel/runtime-corejs2@^7.0.0": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.24.4.tgz#3dac044ea9989e46b99b5f5ac038dbdd12e20e10" + resolved "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.4.tgz" integrity sha512-ZCKqyUKt/Coimg+3Kafu43yNetgYnTXzNbEGAgxc81J5sI0qFNbQ613w7PNny+SmijAmGVroL0GDvx5rG/JI5Q== dependencies: core-js "^2.6.12" @@ -52,14 +52,14 @@ "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz" integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== dependencies: regenerator-runtime "^0.14.0" "@babel/types@^7.24.0": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" @@ -68,7 +68,7 @@ "@cfaester/enzyme-adapter-react-18@^0.7.0": version "0.7.1" - resolved "https://registry.yarnpkg.com/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.7.1.tgz#487961110389e8285f076a965ad279f20a5ebf1e" + resolved "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.7.1.tgz" integrity sha512-Z3m1qNSlQdrcXdnPSGOAysLdgJFSowu7sbK1cHRcWXuZGS3WOTFOS0kIXbWMa1FnkEbswlIU6KgS+8qKgM6Kqw== dependencies: enzyme-shallow-equal "^1.0.0" @@ -77,19 +77,19 @@ "@directus/sdk@^15.0.3": version "15.1.0" - resolved "https://registry.yarnpkg.com/@directus/sdk/-/sdk-15.1.0.tgz#813ad4b2e1f7b2e297212e69852afc3598382f3d" + resolved "https://registry.npmjs.org/@directus/sdk/-/sdk-15.1.0.tgz" integrity sha512-M2+Z1WmU8Q5KlR22K5ugmBHq10a6tcGl3QuvGKnN+jNwDnRyN5brJxt7FvgtWrY3Q1ToGLxmL37GHAH9s12dlQ== dependencies: "@directus/system-data" "1.0.2" "@directus/system-data@1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@directus/system-data/-/system-data-1.0.2.tgz#958b3a4573601dec82bac8454ce2c7486fa42706" + resolved "https://registry.npmjs.org/@directus/system-data/-/system-data-1.0.2.tgz" integrity sha512-PweDAwTz4zImEGJnhoaX8apOCvcAfE0aGQrCSk+3cf1sLso0ShNlcDvUymtVfrqOXy0qT9sLa833bpJVaXF5ng== "@emotion/babel-plugin@^11.11.0": version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -106,7 +106,7 @@ "@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: "@emotion/memoize" "^0.8.1" @@ -117,36 +117,36 @@ "@emotion/hash@^0.9.1": version "0.9.1" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== "@emotion/is-prop-valid@1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: "@emotion/memoize" "^0.8.1" "@emotion/is-prop-valid@^0.7.3": version "0.7.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz" integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA== dependencies: "@emotion/memoize" "0.7.1" "@emotion/memoize@0.7.1": version "0.7.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz" integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== "@emotion/memoize@^0.8.1": version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.8.1": version "11.11.4" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== dependencies: "@babel/runtime" "^7.18.3" @@ -160,7 +160,7 @@ "@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": version "1.1.4" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz" integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== dependencies: "@emotion/hash" "^0.9.1" @@ -171,44 +171,44 @@ "@emotion/sheet@^1.2.2": version "1.2.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== "@emotion/unitless@0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== "@emotion/unitless@^0.8.1": version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== "@emotion/use-insertion-effect-with-fallbacks@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== "@emotion/utils@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== "@emotion/weak-memoize@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== "@floating-ui/core@^1.0.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== dependencies: "@floating-ui/utils" "^0.2.1" "@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.6.1": version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== dependencies: "@floating-ui/core" "^1.0.0" @@ -216,27 +216,27 @@ "@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== "@gilbarbara/deep-equal@^0.1.1": version "0.1.2" - resolved "https://registry.yarnpkg.com/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz#1a106721368dba5e7e9fb7e9a3a6f9efbd8df36d" + resolved "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz" integrity sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA== "@gilbarbara/deep-equal@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz#9c72ed0b2e6f8edb1580217e28d78b5b03ad4aee" + resolved "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz" integrity sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw== "@remix-run/router@1.15.3": version "1.15.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz" integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== "@testing-library/dom@^9.0.0": version "9.3.4" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz" integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -250,7 +250,7 @@ "@testing-library/jest-dom@^6.1.0": version "6.4.2" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz#38949f6b63722900e2d75ba3c6d9bf8cffb3300e" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz" integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw== dependencies: "@adobe/css-tools" "^4.3.2" @@ -264,7 +264,7 @@ "@testing-library/react@^14.0.0": version "14.3.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.1.tgz#29513fc3770d6fb75245c4e1245c470e4ffdd830" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz" integrity sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ== dependencies: "@babel/runtime" "^7.12.5" @@ -273,12 +273,12 @@ "@testing-library/user-event@^14.0.0": version "14.5.2" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz" integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== "@tinymce/tinymce-react@^5.0.0": version "5.0.1" - resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-5.0.1.tgz#478bbdadf0f4bff9f82d596799e7306f8b530f38" + resolved "https://registry.npmjs.org/@tinymce/tinymce-react/-/tinymce-react-5.0.1.tgz" integrity sha512-tw6yNRqrMGP1iJNeY14wvGsUayC9fc1QpJa7tAvdmeBrUlllyF9PpsrbfvYd+2k8t+w0r2Hq+foTzLZ1d27Fyw== dependencies: prop-types "^15.6.2" @@ -286,36 +286,36 @@ "@types/aria-query@^5.0.1": version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prop-types@*": version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18.0.0": version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz" integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== dependencies: "@types/react" "*" "@types/react-transition-group@^4.4.0": version "4.4.10" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== dependencies: "@types/react" "*" "@types/react@*", "@types/react@>=16.9.11": version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz" integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== dependencies: "@types/prop-types" "*" @@ -323,50 +323,55 @@ "@types/stylis@4.2.0": version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz" integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== +ace-builds@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.31.1.tgz#dedb9807f67b4bbe775b2b79adb31deac06995ec" + integrity sha512-3DnE5bZF6Ji+l4F5acoLk+rV7mxrUt1C4r61Xy9owp5rVM4lj5NL8GJfoX6Jnnbhx6kKV7Vdpb+Tco+0ORTvhg== + ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== aria-query@5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" aria-query@^5.0.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: call-bind "^1.0.5" @@ -374,7 +379,7 @@ array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: array.prototype.filter@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz#bef83fde8a36a14d3de988c43563e0f5249962bf" + resolved "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz" integrity sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ== dependencies: call-bind "^1.0.7" @@ -386,7 +391,7 @@ array.prototype.filter@^1.0.0: array.prototype.flat@^1.2.3: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -396,7 +401,7 @@ array.prototype.flat@^1.2.3: arraybuffer.prototype.slice@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: array-buffer-byte-length "^1.0.1" @@ -410,19 +415,19 @@ arraybuffer.prototype.slice@^1.0.3: asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axios@^1.3.2: version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: follow-redirects "^1.15.6" @@ -431,7 +436,7 @@ axios@^1.3.2: babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -440,27 +445,27 @@ babel-plugin-macros@^3.1.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== big-integer@^1.6.16: version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== bootstrap@^3.3.0: version "3.4.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz" integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -468,7 +473,7 @@ brace-expansion@^1.1.7: broadcast-channel@^3.4.1: version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" + resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz" integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== dependencies: "@babel/runtime" "^7.7.2" @@ -482,7 +487,7 @@ broadcast-channel@^3.4.1: call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -493,17 +498,17 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelize@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -512,7 +517,7 @@ chalk@^2.4.2: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -520,7 +525,7 @@ chalk@^3.0.0: chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -528,7 +533,7 @@ chalk@^4.1.0: cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -540,7 +545,7 @@ cheerio-select@^2.1.0: cheerio@^1.0.0-rc.3: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -553,41 +558,41 @@ cheerio@^1.0.0-rc.3: classnames@^2.2.5, classnames@^2.3.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clsx@^1.1.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -595,7 +600,7 @@ color-string@^1.6.0: color@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -603,34 +608,34 @@ color@^3.2.1: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^2.19.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^1.5.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== core-js@^2.6.12: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -641,19 +646,19 @@ cosmiconfig@^7.0.0: cross-fetch@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== dependencies: node-fetch "^2.6.12" css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== css-jss@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/css-jss/-/css-jss-10.10.0.tgz#bd51fbd255cc24597ac0f0f32368394794d37ef3" + resolved "https://registry.npmjs.org/css-jss/-/css-jss-10.10.0.tgz" integrity sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA== dependencies: "@babel/runtime" "^7.3.1" @@ -662,7 +667,7 @@ css-jss@10.10.0: css-select@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -673,7 +678,7 @@ css-select@^5.1.0: css-to-react-native@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== dependencies: camelize "^1.0.0" @@ -682,7 +687,7 @@ css-to-react-native@3.2.0: css-vendor@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== dependencies: "@babel/runtime" "^7.8.3" @@ -690,27 +695,27 @@ css-vendor@^2.0.8: css-what@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== csstype@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: call-bind "^1.0.6" @@ -719,7 +724,7 @@ data-view-buffer@^1.0.1: data-view-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: call-bind "^1.0.7" @@ -728,7 +733,7 @@ data-view-byte-length@^1.0.1: data-view-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== dependencies: call-bind "^1.0.6" @@ -737,17 +742,17 @@ data-view-byte-offset@^1.0.0: date-fns@^3.0.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== deep-diff@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-1.0.2.tgz#afd3d1f749115be965e89c63edc7abb1506b9c26" + resolved "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz" integrity sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg== deep-equal@^2.0.5: version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== dependencies: array-buffer-byte-length "^1.0.0" @@ -771,12 +776,12 @@ deep-equal@^2.0.5: deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -785,7 +790,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -794,44 +799,49 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-node@^2.0.4, detect-node@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +diff-match-patch@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" + integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== + discontinuous-range@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-accessibility-api@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== dependencies: "@babel/runtime" "^7.1.2" dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -839,7 +849,7 @@ dom-helpers@^5.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -848,24 +858,24 @@ dom-serializer@^2.0.0: domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" dompurify@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.0.tgz#8c6b9fe986969a33aa4686bd829cbe8e14dd9445" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.1.0.tgz" integrity sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA== domutils@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" @@ -874,12 +884,12 @@ domutils@^3.0.1: entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== enzyme-shallow-equal@^1.0.0, enzyme-shallow-equal@^1.0.1: version "1.0.7" - resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz#4e3aa678022387a68e6c47aff200587851885b5e" + resolved "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz" integrity sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg== dependencies: hasown "^2.0.0" @@ -887,7 +897,7 @@ enzyme-shallow-equal@^1.0.0, enzyme-shallow-equal@^1.0.1: enzyme@^3.11.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" + resolved "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz" integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== dependencies: array.prototype.flat "^1.2.3" @@ -915,14 +925,14 @@ enzyme@^3.11.0: error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" @@ -974,24 +984,24 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-get-iterator@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -1006,14 +1016,14 @@ es-get-iterator@^1.1.3: es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: get-intrinsic "^1.2.4" @@ -1022,14 +1032,14 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -1038,34 +1048,34 @@ es-to-primitive@^1.2.1: escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== find-root@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== follow-redirects@^1.15.6: version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -1074,17 +1084,17 @@ form-data@^4.0.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.2, function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -1094,12 +1104,12 @@ function.prototype.name@^1.1.2, function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -1110,7 +1120,7 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@ get-symbol-description@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: call-bind "^1.0.5" @@ -1119,7 +1129,7 @@ get-symbol-description@^1.0.2: glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1131,84 +1141,84 @@ glob@^7.1.3: globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" goober@^2.1.10: version "2.1.14" - resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + resolved "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz" integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" has@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" html-element-map@^1.2.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.3.1.tgz#44b2cbcfa7be7aa4ff59779e47e51012e1c73c08" + resolved "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz" integrity sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg== dependencies: array.prototype.filter "^1.0.0" @@ -1216,14 +1226,14 @@ html-element-map@^1.2.0: html-parse-stringify@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== dependencies: void-elements "3.1.0" htmlparser2@^8.0.1: version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" @@ -1233,33 +1243,33 @@ htmlparser2@^8.0.1: hyphenate-style-name@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== i18next-browser-languagedetector@^7.0.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz#1968196d437b4c8db847410c7c33554f6c448f6f" + resolved "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz" integrity sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw== dependencies: "@babel/runtime" "^7.23.2" i18next-http-backend@^2.2.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz#8396a7df30bfe722eff7a65f629df32a61720414" + resolved "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz" integrity sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ== dependencies: cross-fetch "4.0.0" i18next@^23.4.0: version "23.11.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.2.tgz#4c0e8192a9ba230fe7dc68b76459816ab601826e" + resolved "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz" integrity sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA== dependencies: "@babel/runtime" "^7.23.2" import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1267,12 +1277,12 @@ import-fresh@^3.2.1: indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1280,12 +1290,12 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: es-errors "^1.3.0" @@ -1294,14 +1304,14 @@ internal-slot@^1.0.4, internal-slot@^1.0.7: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" is-arguments@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -1309,7 +1319,7 @@ is-arguments@^1.1.1: is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" @@ -1317,24 +1327,24 @@ is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-boolean-object@^1.0.1, is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -1342,65 +1352,65 @@ is-boolean-object@^1.0.1, is-boolean-object@^1.1.0: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-data-view@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: is-typed-array "^1.1.13" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== is-lite@^0.8.2: version "0.8.2" - resolved "https://registry.yarnpkg.com/is-lite/-/is-lite-0.8.2.tgz#26ab98b32aae8cc8b226593b9a641d2bf4bd3b6a" + resolved "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz" integrity sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw== is-lite@^1.2.0, is-lite@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-lite/-/is-lite-1.2.1.tgz#401f30bfccd34cb8cc1283f958907c97859d8f25" + resolved "https://registry.npmjs.org/is-lite/-/is-lite-1.2.1.tgz" integrity sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw== is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-regex@^1.0.5, is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -1408,57 +1418,57 @@ is-regex@^1.0.5, is-regex@^1.1.4: is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-subset@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz" integrity sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw== is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.13: version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: call-bind "^1.0.7" @@ -1466,27 +1476,27 @@ is-weakset@^2.0.3: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== js-sha3@0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== jss-plugin-camel-case@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== dependencies: "@babel/runtime" "^7.3.1" @@ -1495,7 +1505,7 @@ jss-plugin-camel-case@10.10.0: jss-plugin-compose@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz#00d7a79adf7fcfe4927a792febdf0deceb0a7cd2" + resolved "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz" integrity sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow== dependencies: "@babel/runtime" "^7.3.1" @@ -1504,7 +1514,7 @@ jss-plugin-compose@10.10.0: jss-plugin-default-unit@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== dependencies: "@babel/runtime" "^7.3.1" @@ -1512,7 +1522,7 @@ jss-plugin-default-unit@10.10.0: jss-plugin-expand@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz#5debd80554174ca2d9b9e38d85d4cb6f3e0393ab" + resolved "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz" integrity sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA== dependencies: "@babel/runtime" "^7.3.1" @@ -1520,7 +1530,7 @@ jss-plugin-expand@10.10.0: jss-plugin-extend@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz#94eb450847a8941777e77ea4533a579c1c578430" + resolved "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz" integrity sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg== dependencies: "@babel/runtime" "^7.3.1" @@ -1529,7 +1539,7 @@ jss-plugin-extend@10.10.0: jss-plugin-global@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== dependencies: "@babel/runtime" "^7.3.1" @@ -1537,7 +1547,7 @@ jss-plugin-global@10.10.0: jss-plugin-nested@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== dependencies: "@babel/runtime" "^7.3.1" @@ -1546,7 +1556,7 @@ jss-plugin-nested@10.10.0: jss-plugin-props-sort@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== dependencies: "@babel/runtime" "^7.3.1" @@ -1554,7 +1564,7 @@ jss-plugin-props-sort@10.10.0: jss-plugin-rule-value-function@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== dependencies: "@babel/runtime" "^7.3.1" @@ -1563,7 +1573,7 @@ jss-plugin-rule-value-function@10.10.0: jss-plugin-rule-value-observable@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz#d17b28c4401156bbe4cd0c4a73a80aad70613e8b" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz" integrity sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA== dependencies: "@babel/runtime" "^7.3.1" @@ -1572,7 +1582,7 @@ jss-plugin-rule-value-observable@10.10.0: jss-plugin-template@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz#072cda74a94c91b02d3a895d9e2408fd978ce033" + resolved "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz" integrity sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w== dependencies: "@babel/runtime" "^7.3.1" @@ -1581,7 +1591,7 @@ jss-plugin-template@10.10.0: jss-plugin-vendor-prefixer@10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== dependencies: "@babel/runtime" "^7.3.1" @@ -1590,7 +1600,7 @@ jss-plugin-vendor-prefixer@10.10.0: jss-preset-default@10.10.0, jss-preset-default@^10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.10.0.tgz#c8209449a0f6d232526c2ba3a3a6ec69ee97e023" + resolved "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.10.0.tgz" integrity sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q== dependencies: "@babel/runtime" "^7.3.1" @@ -1610,7 +1620,7 @@ jss-preset-default@10.10.0, jss-preset-default@^10.10.0: jss@10.10.0, jss@^10.10.0: version "10.10.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== dependencies: "@babel/runtime" "^7.3.1" @@ -1620,69 +1630,74 @@ jss@10.10.0, jss@^10.10.0: keycode@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff" + resolved "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz" integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lodash.chunk@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + resolved "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz" integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w== lodash.escape@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== + lodash.unionby@^4.8.0: version "4.8.0" - resolved "https://registry.yarnpkg.com/lodash.unionby/-/lodash.unionby-4.8.0.tgz#883f098ff78f564a727b7508e09cdd539734bb83" + resolved "https://registry.npmjs.org/lodash.unionby/-/lodash.unionby-4.8.0.tgz" integrity sha512-e60kn4GJIunNkw6v9MxRnUuLYI/Tyuanch7ozoCtk/1irJTYBj+qNTxr5B3qVflmJhwStJBv387Cb+9VOfABMg== lodash.uniqueid@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz#3268f26a7c88e4f4b1758d679271814e31fa5b26" + resolved "https://registry.npmjs.org/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz" integrity sha512-GQQWaIeGlL6DIIr06kj1j6sSmBxyNMwI8kaX9aKpHR/XsMTiaXDVPNPAkiboOTK9OJpTJF/dXT3xYoFQnj386Q== lodash@^4.17.15: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== match-sorter@^6.0.2: version "6.3.4" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.4.tgz#afa779d8e922c81971fbcb4781c7003ace781be7" + resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz" integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== dependencies: "@babel/runtime" "^7.23.8" @@ -1690,58 +1705,58 @@ match-sorter@^6.0.2: memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== microseconds@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" moo@^0.5.0: version "0.5.2" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + resolved "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz" integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== nano-time@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz" integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== dependencies: big-integer "^1.6.16" nanoid@^3.3.6: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nearley@^2.7.10: version "2.20.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz" integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== dependencies: commander "^2.19.0" @@ -1751,31 +1766,31 @@ nearley@^2.7.10: node-fetch@^2.6.12: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1, object-inspect@^1.7.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.0.2, object-is@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: call-bind "^1.0.7" @@ -1783,12 +1798,12 @@ object-is@^1.0.2, object-is@^1.1.5: object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -1798,7 +1813,7 @@ object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5: object.entries@^1.1.1: version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: call-bind "^1.0.7" @@ -1807,7 +1822,7 @@ object.entries@^1.1.1: object.values@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: call-bind "^1.0.7" @@ -1816,26 +1831,26 @@ object.values@^1.1.1: oblivious-set@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" + resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -1845,7 +1860,7 @@ parse-json@^5.0.0: parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" @@ -1853,54 +1868,54 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== popper.js@^1.16.0: version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-value-parser@^4.0.2: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" @@ -1909,7 +1924,7 @@ postcss@8.4.31: pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -1918,7 +1933,7 @@ pretty-format@^27.0.2: prop-types-extra@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== dependencies: react-is "^16.3.2" @@ -1926,7 +1941,7 @@ prop-types-extra@^1.0.1: prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -1935,32 +1950,42 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== raf@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" railroad-diagrams@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== randexp@0.4.6: version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz" integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== dependencies: discontinuous-range "1.0.0" ret "~0.1.10" +react-ace-builds@^7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/react-ace-builds/-/react-ace-builds-7.4.1.tgz#48e454aaa2fc64dac26860758dcef75f1b08ffce" + integrity sha512-pvzBDp7Fc0Jv6NDKThF0DziFfClVO/X+YO6qZhhCkHDlQqJOJtxvW1Vq1PVMh+BZa5rUR7nZDvNnMVDk9DfKbg== + dependencies: + ace-builds "1.31.1" + diff-match-patch "^1.0.5" + lodash.get "^4.4.2" + lodash.isequal "^4.5.0" + react-bootstrap@^0.33.1: version "0.33.1" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.33.1.tgz#e072592aa143b9792526281272eca754bc9a4940" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz" integrity sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ== dependencies: "@babel/runtime-corejs2" "^7.0.0" @@ -1978,12 +2003,12 @@ react-bootstrap@^0.33.1: react-display-name@^0.2.4: version "0.2.5" - resolved "https://registry.yarnpkg.com/react-display-name/-/react-display-name-0.2.5.tgz#304c7cbfb59ee40389d436e1a822c17fe27936c6" + resolved "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz" integrity sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg== react-dom@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" @@ -1991,7 +2016,7 @@ react-dom@^18.2.0: react-floater@^0.7.9: version "0.7.9" - resolved "https://registry.yarnpkg.com/react-floater/-/react-floater-0.7.9.tgz#b15a652e817f200bfa42a2023ee8d3105803b968" + resolved "https://registry.npmjs.org/react-floater/-/react-floater-0.7.9.tgz" integrity sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg== dependencies: deepmerge "^4.3.1" @@ -2002,7 +2027,7 @@ react-floater@^0.7.9: react-form-stepper@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/react-form-stepper/-/react-form-stepper-2.0.3.tgz#5b424fe6bf9fd1e43bfe80a2f11bc16f59c75a31" + resolved "https://registry.npmjs.org/react-form-stepper/-/react-form-stepper-2.0.3.tgz" integrity sha512-j6UAQAX4iMR8uMkFSvApWkOpMRhJzVahKwGOMDL4TwZF7POPxxDslBlITZBj9QEc9d/HFkMK4+ql06o2O4DS5Q== dependencies: clsx "^1.1.1" @@ -2011,19 +2036,19 @@ react-form-stepper@^2.0.3: react-hook-form@^7.47.0: version "7.51.3" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.3.tgz" integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ== react-hot-toast@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" + resolved "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz" integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== dependencies: goober "^2.1.10" react-i18next@^14.0.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.0.tgz#44da74fbffd416f5d0c5307ef31735cf10cc91d9" + resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz" integrity sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ== dependencies: "@babel/runtime" "^7.23.9" @@ -2031,32 +2056,32 @@ react-i18next@^14.0.0: react-icons@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.1.0.tgz#9e7533cc256571a610c2a1ec8a7a143fb1222943" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz" integrity sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ== react-innertext@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/react-innertext/-/react-innertext-1.1.5.tgz#8147ac54db3f7067d95f49e2d2c05a720d27d8d0" + resolved "https://registry.npmjs.org/react-innertext/-/react-innertext-1.1.5.tgz" integrity sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-joyride@^2.7.2: version "2.8.1" - resolved "https://registry.yarnpkg.com/react-joyride/-/react-joyride-2.8.1.tgz#c87941885803a765dd870e1a3341bdc4a978cc80" + resolved "https://registry.npmjs.org/react-joyride/-/react-joyride-2.8.1.tgz" integrity sha512-fVwCmoOvJsiFKKHn8mvPUYc4JUUkgAsQMvarpZDtFPTc4duj240b12+AB8+3NXlTYGZVnKNSTgFFzoSh9RxjmQ== dependencies: "@gilbarbara/deep-equal" "^0.3.1" @@ -2073,7 +2098,7 @@ react-joyride@^2.7.2: react-jss@^10.9.1-alpha.2: version "10.10.0" - resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-10.10.0.tgz#d08ab3257b0eed01e15d6d8275840055c279b0da" + resolved "https://registry.npmjs.org/react-jss/-/react-jss-10.10.0.tgz" integrity sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ== dependencies: "@babel/runtime" "^7.3.1" @@ -2090,12 +2115,12 @@ react-jss@^10.9.1-alpha.2: react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-loader-spinner@^6.1.0: version "6.1.6" - resolved "https://registry.yarnpkg.com/react-loader-spinner/-/react-loader-spinner-6.1.6.tgz#744d84a9763e963b565054f4f281dadfbd17e9e9" + resolved "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-6.1.6.tgz" integrity sha512-x5h1Jcit7Qn03MuKlrWcMG9o12cp9SNDVHVJTNRi9TgtGPKcjKiXkou4NRfLAtXaFB3+Z8yZsVzONmPzhv2ErA== dependencies: react-is "^18.2.0" @@ -2103,7 +2128,7 @@ react-loader-spinner@^6.1.0: react-overlays@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.9.3.tgz#5bac8c1e9e7e057a125181dee2d784864dd62902" + resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz" integrity sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ== dependencies: classnames "^2.2.5" @@ -2115,14 +2140,14 @@ react-overlays@^0.9.0: react-prop-types@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0" + resolved "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz" integrity sha512-IyjsJhDX9JkoOV9wlmLaS7z+oxYoIWhfzDcFy7inwoAKTu+VcVNrVpPmLeioJ94y6GeDRsnwarG1py5qofFQMg== dependencies: warning "^3.0.0" react-query@^3.39.3: version "3.39.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" + resolved "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz" integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== dependencies: "@babel/runtime" "^7.5.5" @@ -2131,7 +2156,7 @@ react-query@^3.39.3: react-router-dom@^6.9.0: version "6.22.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.3.tgz#9781415667fd1361a475146c5826d9f16752a691" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz" integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw== dependencies: "@remix-run/router" "1.15.3" @@ -2139,14 +2164,14 @@ react-router-dom@^6.9.0: react-router@6.22.3: version "6.22.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.3.tgz#9d9142f35e08be08c736a2082db5f0c9540a885e" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz" integrity sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ== dependencies: "@remix-run/router" "1.15.3" react-select@^5.7.0: version "5.8.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5" + resolved "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz" integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA== dependencies: "@babel/runtime" "^7.12.0" @@ -2161,7 +2186,7 @@ react-select@^5.7.0: react-shallow-renderer@^16.15.0: version "16.15.0" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz" integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== dependencies: object-assign "^4.1.1" @@ -2169,7 +2194,7 @@ react-shallow-renderer@^16.15.0: react-test-renderer@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz" integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== dependencies: react-is "^18.2.0" @@ -2178,7 +2203,7 @@ react-test-renderer@^18.2.0: react-tooltip@^5.13.1: version "5.26.3" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.26.3.tgz#bcb9a53e15bdbf9ae007ddf8bf413a317a637054" + resolved "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz" integrity sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg== dependencies: "@floating-ui/dom" "^1.6.1" @@ -2186,7 +2211,7 @@ react-tooltip@^5.13.1: react-transition-group@^2.0.0, react-transition-group@^2.2.1: version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: dom-helpers "^3.4.0" @@ -2196,7 +2221,7 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.1: react-transition-group@^4.3.0: version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -2206,14 +2231,14 @@ react-transition-group@^4.3.0: react@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -2221,12 +2246,12 @@ redent@^3.0.0: regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: call-bind "^1.0.6" @@ -2236,17 +2261,17 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: remove-accents@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" + resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz" integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.19.0: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -2255,19 +2280,19 @@ resolve@^1.19.0: ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== rimraf@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rst-selector-parser@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz" integrity sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA== dependencies: lodash.flattendeep "^4.4.0" @@ -2275,7 +2300,7 @@ rst-selector-parser@^2.2.3: safe-array-concat@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: call-bind "^1.0.7" @@ -2285,7 +2310,7 @@ safe-array-concat@^1.1.2: safe-regex-test@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: call-bind "^1.0.6" @@ -2294,24 +2319,24 @@ safe-regex-test@^1.0.3: scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" scroll@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scroll/-/scroll-3.0.1.tgz#d5afb59fb3592ee3df31c89743e78b39e4cd8a26" + resolved "https://registry.npmjs.org/scroll/-/scroll-3.0.1.tgz" integrity sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg== scrollparent@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/scrollparent/-/scrollparent-2.1.0.tgz#6cae915c953835886a6ba0d77fdc2bb1ed09076d" + resolved "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz" integrity sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA== set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2323,7 +2348,7 @@ set-function-length@^1.2.1: set-function-name@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -2333,17 +2358,17 @@ set-function-name@^2.0.1: shallow-equal@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + resolved "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz" integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== shallowequal@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== side-channel@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -2353,31 +2378,31 @@ side-channel@^1.0.4: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" source-map-js@^1.0.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" string.prototype.trim@^1.2.1, string.prototype.trim@^1.2.9: version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: call-bind "^1.0.7" @@ -2387,7 +2412,7 @@ string.prototype.trim@^1.2.1, string.prototype.trim@^1.2.9: string.prototype.trimend@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: call-bind "^1.0.7" @@ -2396,7 +2421,7 @@ string.prototype.trimend@^1.0.8: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" @@ -2405,14 +2430,14 @@ string.prototype.trimstart@^1.0.8: strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" styled-components@^6.0.7, styled-components@^6.1.2: version "6.1.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz" integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== dependencies: "@emotion/is-prop-valid" "1.2.1" @@ -2427,46 +2452,46 @@ styled-components@^6.0.7, styled-components@^6.1.2: stylis@4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== stylis@4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz" integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== sweetalert2@^11.7.3: version "11.10.7" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.10.7.tgz#db2b8ce486f590404c761e051c7e40c80d648fae" + resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.7.tgz" integrity sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg== symbol-observable@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== theming@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/theming/-/theming-3.3.0.tgz#dacabf04aa689edde35f1e1c117ec6de73fbf870" + resolved "https://registry.npmjs.org/theming/-/theming-3.3.0.tgz" integrity sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA== dependencies: hoist-non-react-statics "^3.3.0" @@ -2476,27 +2501,27 @@ theming@^3.3.0: tiny-warning@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== "tinymce@^7.0.0 || ^6.0.0 || ^5.5.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-7.0.1.tgz#743f4003027a13497654a5ce5ca74793815386f7" + resolved "https://registry.npmjs.org/tinymce/-/tinymce-7.0.1.tgz" integrity sha512-0a7DJnhniBx2psRuKcVQ9g4hujN6PAR4fPS0NSF1T1luH1RBDZVVEn2pGND6Ly+AW1lUm/cHOHjsasqBelMhbw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== tree-changes@^0.11.2: version "0.11.2" - resolved "https://registry.yarnpkg.com/tree-changes/-/tree-changes-0.11.2.tgz#e02e65c4faae6230dfe357aa97a26e8eb7c7d321" + resolved "https://registry.npmjs.org/tree-changes/-/tree-changes-0.11.2.tgz" integrity sha512-4gXlUthrl+RabZw6lLvcCDl6KfJOCmrC16BC5CRdut1EAH509Omgg0BfKLY+ViRlzrvYOTWR0FMS2SQTwzumrw== dependencies: "@gilbarbara/deep-equal" "^0.3.1" @@ -2504,7 +2529,7 @@ tree-changes@^0.11.2: tree-changes@^0.9.1: version "0.9.3" - resolved "https://registry.yarnpkg.com/tree-changes/-/tree-changes-0.9.3.tgz#89433ab3b4250c2910d386be1f83912b7144efcc" + resolved "https://registry.npmjs.org/tree-changes/-/tree-changes-0.9.3.tgz" integrity sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ== dependencies: "@gilbarbara/deep-equal" "^0.1.1" @@ -2512,17 +2537,17 @@ tree-changes@^0.9.1: tslib@2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== type-fest@^4.15.0: version "4.15.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.15.0.tgz#21da206b89c15774cc718c4f2d693e13a1a14a43" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz" integrity sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA== typed-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: call-bind "^1.0.7" @@ -2531,7 +2556,7 @@ typed-array-buffer@^1.0.2: typed-array-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: call-bind "^1.0.7" @@ -2542,7 +2567,7 @@ typed-array-byte-length@^1.0.1: typed-array-byte-offset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: available-typed-arrays "^1.0.7" @@ -2554,7 +2579,7 @@ typed-array-byte-offset@^1.0.2: typed-array-length@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" @@ -2566,7 +2591,7 @@ typed-array-length@^1.0.6: unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -2576,7 +2601,7 @@ unbox-primitive@^1.0.2: uncontrollable@^7.0.2: version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== dependencies: "@babel/runtime" "^7.6.3" @@ -2586,7 +2611,7 @@ uncontrollable@^7.0.2: unload@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz" integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== dependencies: "@babel/runtime" "^7.6.2" @@ -2594,41 +2619,41 @@ unload@2.2.0: use-isomorphic-layout-effect@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== void-elements@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== warning@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + resolved "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" integrity sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ== dependencies: loose-envify "^1.0.0" warning@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" web-vitals@^3.4.0: version "3.5.2" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.5.2.tgz#5bb58461bbc173c3f00c2ddff8bfe6e680999ca9" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz" integrity sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -2636,7 +2661,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -2647,7 +2672,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -2657,7 +2682,7 @@ which-collection@^1.0.1: which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -2668,10 +2693,10 @@ which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==