From dafa1c67071f22cf0347f8fa3de4922fc45509b4 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 11 Mar 2022 14:14:44 -0800 Subject: [PATCH 01/63] Restore FKs for MCC and dam/sire --- .../queries/study/demographics.query.xml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mcc/resources/queries/study/demographics.query.xml b/mcc/resources/queries/study/demographics.query.xml index e5e0a932b..abcfcb6b4 100644 --- a/mcc/resources/queries/study/demographics.query.xml +++ b/mcc/resources/queries/study/demographics.query.xml @@ -113,20 +113,20 @@ Dam - - - - - + + study + animal + id + /ehr/participantView.view?participantId=${dam} Sire - - - - - + + study + animal + id + /ehr/participantView.view?participantId=${sire} From c8d3ab0616e2c333331946cd8c0a9cb94c67ed62 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 11 Mar 2022 14:42:32 -0800 Subject: [PATCH 02/63] Update MCC ETL to use anonymized dam/sire --- .../queries/mcc/aggregatedDemographics.sql | 20 +++++++++---------- mcc/resources/schemas/mcc.xml | 1 + 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index b2b9e4a19..fc0772a48 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -7,8 +7,8 @@ SELECT d.birth, d.death, d.colony, - d.dam, - d.sire, + d.dam.mccAlias.externalAlias as dam, + d.sire.mccAlias.externalAlias as as sire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -31,8 +31,8 @@ SELECT d.birth, d.death, d.colony, - d.dam, - d.sire, + d.dam.mccAlias.externalAlias as dam, + d.sire.mccAlias.externalAlias as as sire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -55,8 +55,8 @@ SELECT d.birth, d.death, 'U NEB' as colony, - d.dam, - d.sire, + d.dam.mccAlias.externalAlias as dam, + d.sire.mccAlias.externalAlias as as sire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -76,8 +76,8 @@ SELECT d.birth, d.death, d.center as colony, - d.dam, - d.sire, + d.dam.mccAlias.externalAlias as dam, + d.sire.mccAlias.externalAlias as as sire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -97,8 +97,8 @@ SELECT d.birth, d.death, d.colony, - d.dam, - d.sire, + d.dam.mccAlias.externalAlias as dam, + d.sire.mccAlias.externalAlias as as sire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 64770504b..3d9b4629a 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -503,6 +503,7 @@ rowid Animal ID Mapping DETAILED + externalAlias true From adeaf3ef5db3e62803222ea669f214bd197e2f1e Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 11 Mar 2022 15:18:56 -0800 Subject: [PATCH 03/63] Update MCC ETL to ensure dam/sire have aliases --- .../queries/mcc/aggregatedDemographics.sql | 20 ++++++-- .../queries/study/demographics.query.xml | 6 +-- .../org/labkey/mcc/etl/PopulateIdsStep.java | 46 +++++++++++-------- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index fc0772a48..fc2c5ce9b 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -8,7 +8,9 @@ SELECT d.death, d.colony, d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as as sire, + d.sire.mccAlias.externalAlias as sire, + d.dam as originalDam, + d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -32,7 +34,9 @@ SELECT d.death, d.colony, d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as as sire, + d.sire.mccAlias.externalAlias as sire, + d.dam as originalDam, + d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -56,7 +60,9 @@ SELECT d.death, 'U NEB' as colony, d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as as sire, + d.sire.mccAlias.externalAlias as sire, + d.dam as originalDam, + d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -77,7 +83,9 @@ SELECT d.death, d.center as colony, d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as as sire, + d.sire.mccAlias.externalAlias as sire, + d.dam as originalDam, + d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, @@ -98,7 +106,9 @@ SELECT d.death, d.colony, d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as as sire, + d.sire.mccAlias.externalAlias as sire, + d.dam as originalDam, + d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, d.objectid, d.calculated_status, diff --git a/mcc/resources/queries/study/demographics.query.xml b/mcc/resources/queries/study/demographics.query.xml index abcfcb6b4..75d7b45a0 100644 --- a/mcc/resources/queries/study/demographics.query.xml +++ b/mcc/resources/queries/study/demographics.query.xml @@ -9,7 +9,7 @@ - + true @@ -118,7 +118,7 @@ animal id - /ehr/participantView.view?participantId=${dam} + Sire @@ -127,7 +127,7 @@ animal id - /ehr/participantView.view?participantId=${sire} + Origin diff --git a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java index 75c222b82..d5e635b88 100644 --- a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java +++ b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java @@ -50,42 +50,50 @@ public RecordedActionSet run(@NotNull PipelineJob job) throws PipelineJobExcepti throw new PipelineJobException("Unable to find table: aggregatedDemographics"); } - TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set("originalId", "container"), new SimpleFilter(FieldKey.fromString("Id"), null, CompareType.ISBLANK), null); + populateForField(job, sourceTi, "Id", "originalId"); + populateForField(job, sourceTi, "dam", "originalDam"); + populateForField(job, sourceTi, "sire", "originalSire"); + + return new RecordedActionSet(); + } + + private void populateForField(PipelineJob job, TableInfo sourceTi, String fieldName, String aliasField) + { + final Map>> toAdd = new HashMap<>(); + + TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set("originalId", "container"), new SimpleFilter(FieldKey.fromString(fieldName), null, CompareType.ISBLANK), null); if (ts.exists()) { - final Map>> toAdd = new HashMap<>(); ts.forEachResults(rs -> { Container c = ContainerManager.getForId(rs.getString(FieldKey.fromString("container"))); List> rows = toAdd.containsKey(c) ? toAdd.get(c) : new ArrayList<>(); CaseInsensitiveHashMap row = new CaseInsensitiveHashMap<>(); - row.put("subjectname", rs.getString(FieldKey.fromString("originalId"))); + row.put("subjectname", rs.getString(FieldKey.fromString(aliasField))); row.put("externalAlias", null); rows.add(row); toAdd.put(c, rows); }); + } - try + try + { + for (Container c : toAdd.keySet()) { - for (Container c : toAdd.keySet()) + job.getLogger().info("Total IDs to alias for field " + fieldName + " in container: " + c.getPath() + ": " + toAdd.get(c).size()); + TableInfo ti = QueryService.get().getUserSchema(_containerUser.getUser(), c, MccSchema.NAME).getTable(MccSchema.TABLE_ANIMAL_MAPPING); + BatchValidationException bve = new BatchValidationException(); + ti.getUpdateService().insertRows(_containerUser.getUser(), c, toAdd.get(c), bve, null, null); + if (bve.hasErrors()) { - job.getLogger().info("Total IDs to alias for " + c.getPath() + ": " + toAdd.get(c).size()); - TableInfo ti = QueryService.get().getUserSchema(_containerUser.getUser(), c, MccSchema.NAME).getTable(MccSchema.TABLE_ANIMAL_MAPPING); - BatchValidationException bve = new BatchValidationException(); - ti.getUpdateService().insertRows(_containerUser.getUser(), c, toAdd.get(c), bve, null, null); - if (bve.hasErrors()) - { - throw bve; - } + throw bve; } } - catch (BatchValidationException | DuplicateKeyException | QueryUpdateServiceException | SQLException e) - { - job.getLogger().error("Error populating IDs", e); - } } - - return new RecordedActionSet(); + catch (BatchValidationException | DuplicateKeyException | QueryUpdateServiceException | SQLException e) + { + job.getLogger().error("Error populating IDs", e); + } } @Override From 30bdab1765e0522b75fcd13c117d26ce16cc3928 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 02:32:38 -0800 Subject: [PATCH 04/63] Update MCC ETL to ensure dam/sire have aliases --- mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java index d5e635b88..35344a457 100644 --- a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java +++ b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java @@ -61,7 +61,7 @@ private void populateForField(PipelineJob job, TableInfo sourceTi, String fieldN { final Map>> toAdd = new HashMap<>(); - TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set("originalId", "container"), new SimpleFilter(FieldKey.fromString(fieldName), null, CompareType.ISBLANK), null); + TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set(aliasField, "container"), new SimpleFilter(FieldKey.fromString(fieldName), null, CompareType.ISBLANK), null); if (ts.exists()) { ts.forEachResults(rs -> { @@ -69,7 +69,7 @@ private void populateForField(PipelineJob job, TableInfo sourceTi, String fieldN List> rows = toAdd.containsKey(c) ? toAdd.get(c) : new ArrayList<>(); CaseInsensitiveHashMap row = new CaseInsensitiveHashMap<>(); row.put("subjectname", rs.getString(FieldKey.fromString(aliasField))); - row.put("externalAlias", null); + row.put("externalAlias", null); //NOTE: the trigger script will auto-assign a value, but we need to include this property on the input JSON rows.add(row); toAdd.put(c, rows); From 866d44cbffd03a47f7867fcca3c6e6742f2da8e2 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 02:36:41 -0800 Subject: [PATCH 05/63] Update MCC ETL to ensure dam/sire have aliases --- mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java index 35344a457..8ea37d2b9 100644 --- a/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java +++ b/mcc/src/org/labkey/mcc/etl/PopulateIdsStep.java @@ -57,18 +57,21 @@ public RecordedActionSet run(@NotNull PipelineJob job) throws PipelineJobExcepti return new RecordedActionSet(); } - private void populateForField(PipelineJob job, TableInfo sourceTi, String fieldName, String aliasField) + private void populateForField(PipelineJob job, TableInfo sourceTi, String fieldName, String originalIdField) { final Map>> toAdd = new HashMap<>(); - TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set(aliasField, "container"), new SimpleFilter(FieldKey.fromString(fieldName), null, CompareType.ISBLANK), null); + SimpleFilter filter = new SimpleFilter(FieldKey.fromString(fieldName), null, CompareType.ISBLANK); + filter.addCondition(FieldKey.fromString(originalIdField), null, CompareType.NONBLANK); + + TableSelector ts = new TableSelector(sourceTi, PageFlowUtil.set(originalIdField, "container"), filter, null); if (ts.exists()) { ts.forEachResults(rs -> { Container c = ContainerManager.getForId(rs.getString(FieldKey.fromString("container"))); List> rows = toAdd.containsKey(c) ? toAdd.get(c) : new ArrayList<>(); CaseInsensitiveHashMap row = new CaseInsensitiveHashMap<>(); - row.put("subjectname", rs.getString(FieldKey.fromString(aliasField))); + row.put("subjectname", rs.getString(FieldKey.fromString(originalIdField))); row.put("externalAlias", null); //NOTE: the trigger script will auto-assign a value, but we need to include this property on the input JSON rows.add(row); From 6e40f5e25d1e3cbaca60319df5575aa40cc4db88 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 07:01:31 -0800 Subject: [PATCH 06/63] Allow aliasing of dam/site for MCC even when not present in primary animal table --- .../queries/mcc/aggregatedDemographics.sql | 20 +++++++++---------- mcc/resources/schemas/mcc.xml | 2 +- .../labkey/mcc/query/MccEhrCustomizer.java | 19 +++++++++++++----- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index fc2c5ce9b..5bc571a12 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -7,8 +7,8 @@ SELECT d.birth, d.death, d.colony, - d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as sire, + d.damMccAlias.externalAlias as dam, + d.sireMccAlias.externalAlias as sire, d.dam as originalDam, d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, @@ -33,8 +33,8 @@ SELECT d.birth, d.death, d.colony, - d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as sire, + d.damMccAlias.externalAlias as dam, + d.sireMccAlias.externalAlias as sire, d.dam as originalDam, d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, @@ -59,8 +59,8 @@ SELECT d.birth, d.death, 'U NEB' as colony, - d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as sire, + d.damMccAlias.externalAlias as dam, + d.sireMccAlias.externalAlias as sire, d.dam as originalDam, d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, @@ -82,8 +82,8 @@ SELECT d.birth, d.death, d.center as colony, - d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as sire, + d.damMccAlias.externalAlias as dam, + d.sireMccAlias.externalAlias as sire, d.dam as originalDam, d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, @@ -105,8 +105,8 @@ SELECT d.birth, d.death, d.colony, - d.dam.mccAlias.externalAlias as dam, - d.sire.mccAlias.externalAlias as sire, + d.damMccAlias.externalAlias as dam, + d.sireMccAlias.externalAlias as sire, d.dam as originalDam, d.sire as originalSire, d.Id.mostRecentWeight.mostRecentWeight as mostRecentWeight, diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 3d9b4629a..aac4a1730 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -517,7 +517,7 @@ false - mGAP Alias + MCC Alias false true false diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java index 9463e3fb5..eceeb46fe 100644 --- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java @@ -30,6 +30,11 @@ public void customize(TableInfo table) { customizeAnimalTable((AbstractTableInfo)table); } + else if (matches(table, "study", "demographics")) + { + addMccAlias((AbstractTableInfo)table, "dam", "damMccAlias", "Dam MCC Alias"); + addMccAlias((AbstractTableInfo)table, "sire", "sireMccAlias", "Sire MCC Alias"); + } } } @@ -44,11 +49,15 @@ private void customizeAnimalTable(AbstractTableInfo ti) } } - String mccId = "mccAlias"; - if (ti.getColumn(mccId) == null) + addMccAlias(ti, "Id", "mccAlias", "MCC Alias"); + } + + private void addMccAlias(AbstractTableInfo ti, String sourceCol, String name, String label) + { + if (ti.getColumn(name) == null) { - WrappedColumn ci = new WrappedColumn(ti.getColumn("Id"), mccId); - ci.setFieldKey(FieldKey.fromParts(mccId)); + WrappedColumn ci = new WrappedColumn(ti.getColumn(sourceCol), name); + ci.setFieldKey(FieldKey.fromParts(name)); final UserSchema us = getUserSchema(ti, MccSchema.NAME); LookupForeignKey fk = new LookupForeignKey("subjectname") { @@ -62,7 +71,7 @@ public TableInfo getLookupTableInfo() ci.setFk(fk); ci.setUserEditable(false); - ci.setLabel("MCC Alias"); + ci.setLabel(label); ti.addColumn(ci); } } From 95d25b46a27c9fe50ec3b383fb39a7c990a4a17b Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 07:47:11 -0800 Subject: [PATCH 07/63] Add validation to customizer --- mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java index eceeb46fe..068ee6382 100644 --- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java @@ -56,6 +56,12 @@ private void addMccAlias(AbstractTableInfo ti, String sourceCol, String name, St { if (ti.getColumn(name) == null) { + if (ti.getColumn(sourceCol) == null) + { + _log.error("Unable to find column: " + sourceCol + " for table: " + ti.getName()); + return; + } + WrappedColumn ci = new WrappedColumn(ti.getColumn(sourceCol), name); ci.setFieldKey(FieldKey.fromParts(name)); final UserSchema us = getUserSchema(ti, MccSchema.NAME); From 4975ca68ebaabd7b6ad5422be13e56dab8555db7 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 08:18:07 -0800 Subject: [PATCH 08/63] Bugfix MCC alias FK --- mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java index 068ee6382..0adec8072 100644 --- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java @@ -58,7 +58,7 @@ private void addMccAlias(AbstractTableInfo ti, String sourceCol, String name, St { if (ti.getColumn(sourceCol) == null) { - _log.error("Unable to find column: " + sourceCol + " for table: " + ti.getName()); + _log.error("Unable to find column: " + sourceCol + " for table: " + ti.getName(), new Exception()); return; } @@ -73,8 +73,7 @@ public TableInfo getLookupTableInfo() return us.getTable(MccSchema.TABLE_ANIMAL_MAPPING); } }; - fk.addJoin(FieldKey.fromString("Id"), "subjectname", false); - + fk.addJoin(FieldKey.fromString(sourceCol), "subjectname", false); ci.setFk(fk); ci.setUserEditable(false); ci.setLabel(label); From d5ce4f3e629d73cbc177e9aba6c9dcfabb0224e4 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 08:33:48 -0800 Subject: [PATCH 09/63] Allow MCC alias customizer to run during study import, when column might not exist yet --- mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java index 0adec8072..87ff4c4d4 100644 --- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java @@ -54,14 +54,13 @@ private void customizeAnimalTable(AbstractTableInfo ti) private void addMccAlias(AbstractTableInfo ti, String sourceCol, String name, String label) { - if (ti.getColumn(name) == null) + if (ti.getColumn(sourceCol) == null) { - if (ti.getColumn(sourceCol) == null) - { - _log.error("Unable to find column: " + sourceCol + " for table: " + ti.getName(), new Exception()); - return; - } + return; + } + if (ti.getColumn(name) == null) + { WrappedColumn ci = new WrappedColumn(ti.getColumn(sourceCol), name); ci.setFieldKey(FieldKey.fromParts(name)); final UserSchema us = getUserSchema(ti, MccSchema.NAME); From 5e7b6c3ba0d91324a90e947cf3c7763ee96b203e Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 12 Mar 2022 09:43:38 -0800 Subject: [PATCH 10/63] MCC: better support display of parents when not present in animal table --- mcc/resources/queries/study/demographics.query.xml | 2 ++ mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mcc/resources/queries/study/demographics.query.xml b/mcc/resources/queries/study/demographics.query.xml index 75d7b45a0..16d276219 100644 --- a/mcc/resources/queries/study/demographics.query.xml +++ b/mcc/resources/queries/study/demographics.query.xml @@ -117,6 +117,7 @@ study animal id + @@ -126,6 +127,7 @@ study animal id + diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java index 87ff4c4d4..b3b3f9467 100644 --- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java @@ -32,12 +32,17 @@ public void customize(TableInfo table) } else if (matches(table, "study", "demographics")) { - addMccAlias((AbstractTableInfo)table, "dam", "damMccAlias", "Dam MCC Alias"); - addMccAlias((AbstractTableInfo)table, "sire", "sireMccAlias", "Sire MCC Alias"); + customizeDemographics((AbstractTableInfo)table); } } } + private void customizeDemographics(AbstractTableInfo ti) + { + addMccAlias(ti, "dam", "damMccAlias", "Dam MCC Alias"); + addMccAlias(ti, "sire", "sireMccAlias", "Sire MCC Alias"); + } + private void customizeAnimalTable(AbstractTableInfo ti) { for (String colName : new String[]{"MostRecentArrival", "numRoommates", "MostRecentDeparture", "curLocation", "lastHousing", "weightChange", "CageClass", "MhcStatus"}) From 320f7b0395290889e622167be102c5915ac6241a Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 15 Mar 2022 13:14:33 -0700 Subject: [PATCH 11/63] Convert CADD column to double (#54) --- .../schemas/dbscripts/postgresql/mgap-16.61-16.62.sql | 1 + .../resources/schemas/dbscripts/sqlserver/mgap-16.61-16.62.sql | 1 + mGAP/src/org/labkey/mgap/mGAPModule.java | 2 +- mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java | 3 ++- 4 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 mGAP/resources/schemas/dbscripts/postgresql/mgap-16.61-16.62.sql create mode 100644 mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.61-16.62.sql diff --git a/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.61-16.62.sql b/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.61-16.62.sql new file mode 100644 index 000000000..1575f958f --- /dev/null +++ b/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.61-16.62.sql @@ -0,0 +1 @@ +ALTER TABLE mgap.variantList ALTER COLUMN cadd TYPE DOUBLE PRECISION USING cadd::double precision; \ No newline at end of file diff --git a/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.61-16.62.sql b/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.61-16.62.sql new file mode 100644 index 000000000..f3df21a83 --- /dev/null +++ b/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.61-16.62.sql @@ -0,0 +1 @@ +ALTER TABLE mgap.variantList ALTER COLUMN cadd DOUBLE PRECISION; \ No newline at end of file diff --git a/mGAP/src/org/labkey/mgap/mGAPModule.java b/mGAP/src/org/labkey/mgap/mGAPModule.java index d6dd356c8..2a9f888af 100644 --- a/mGAP/src/org/labkey/mgap/mGAPModule.java +++ b/mGAP/src/org/labkey/mgap/mGAPModule.java @@ -61,7 +61,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 16.60; + return 16.62; } @Override diff --git a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java index cd5d2b08c..0b6914508 100644 --- a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java +++ b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java @@ -443,7 +443,8 @@ else if (so.getCategory().endsWith("Release Track")) map.put("omim_phenotype", queryOmim(line[9], job.getContainer(), job.getLogger())); map.put("af", line[10]); map.put("identifier", line[11]); - map.put("cadd", line[12]); + Double cadd = StringUtils.trimToNull(line[12]) == null ? null : Double.parseDouble(line[12]); + map.put("cadd", cadd); map.put("objectId", new GUID().toString()); variantTableRows.add(map); From 09c33db627636bcbff476e3aade7ce0cd423402e Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 16 Mar 2022 14:18:38 -0700 Subject: [PATCH 12/63] Add COVID samples to folder summary --- .../org/labkey/covidseq/CovidseqDataProvider.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/covidseq/src/org/labkey/covidseq/CovidseqDataProvider.java b/covidseq/src/org/labkey/covidseq/CovidseqDataProvider.java index b685df28e..90cf16863 100644 --- a/covidseq/src/org/labkey/covidseq/CovidseqDataProvider.java +++ b/covidseq/src/org/labkey/covidseq/CovidseqDataProvider.java @@ -6,6 +6,7 @@ import org.labkey.api.laboratory.AbstractDataProvider; import org.labkey.api.laboratory.LaboratoryService; import org.labkey.api.laboratory.NavItem; +import org.labkey.api.laboratory.QueryCountNavItem; import org.labkey.api.laboratory.QueryImportNavItem; import org.labkey.api.laboratory.SummaryNavItem; import org.labkey.api.ldk.table.QueryCache; @@ -15,6 +16,7 @@ import org.labkey.api.view.ViewContext; import org.labkey.api.view.template.ClientDependency; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -91,7 +93,18 @@ public Module getOwningModule() @Override public List getSummary(Container c, User u) { - return Collections.emptyList(); + List items = new ArrayList<>(); + + for (NavItem nav : getSampleNavItems(c, u)) + { + if (nav.isVisible(c, u)) + { + QueryImportNavItem item = ((QueryImportNavItem)nav); + items.add(new QueryCountNavItem(this, item.getSchema(), item.getQuery(), item.getItemType(), item.getReportCategory(), item.getLabel())); + } + } + + return Collections.unmodifiableList(items); } @Override From f14ca2d9327300a422e9fb56eae3d8379439fa95 Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 12:12:59 -0700 Subject: [PATCH 13/63] Allow MCC notifications to use combination of users and groups --- mcc/src/org/labkey/mcc/MccController.java | 20 ++------- mcc/src/org/labkey/mcc/MccManager.java | 43 ++++++++----------- .../org/labkey/mcc/query/TriggerHelper.java | 10 +---- 3 files changed, 25 insertions(+), 48 deletions(-) diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index a0a613564..954e45e07 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -156,17 +156,11 @@ public Object execute(RequestUserForm form, BindException errors) throws Excepti Table.insert(UserManager.getGuestUser(), ti, row); - Set users = MccManager.get().getNotificationUsers(); - if (users != null && !users.isEmpty()) + Set
emails = MccManager.get().getNotificationUserEmails(); + if (emails != null && !emails.isEmpty()) { try { - Set
emails = new HashSet<>(); - for (User u : users) - { - emails.add(new InternetAddress(u.getEmail())); - } - MailHelper.MultipartMessage mail = MailHelper.createMultipartMessage(); Container c = MccManager.get().getMCCContainer(); if (c == null) @@ -480,17 +474,11 @@ public void validateForm(RequestHelpForm form, Errors errors) @Override public Object execute(RequestHelpForm form, BindException errors) throws Exception { - Set users = MccManager.get().getNotificationUsers(); - if (users != null && !users.isEmpty()) + Set
emails = MccManager.get().getNotificationUserEmails(); + if (emails != null && !emails.isEmpty()) { try { - Set
emails = new HashSet<>(); - for (User u : users) - { - emails.add(new InternetAddress(u.getEmail())); - } - MailHelper.MultipartMessage mail = MailHelper.createMultipartMessage(); mail.setEncodedHtmlContent("A support request was submitted from MCC by: " + form.getEmail() + "

Message:
" + form.getComment()); mail.setFrom(form.getEmail()); diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index 25689d5e6..c5f899baf 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -21,13 +21,15 @@ import org.apache.logging.log4j.Logger; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; +import org.labkey.api.ldk.notification.NotificationService; import org.labkey.api.module.Module; import org.labkey.api.module.ModuleLoader; import org.labkey.api.module.ModuleProperty; -import org.labkey.api.security.User; -import org.labkey.api.security.UserManager; +import org.labkey.api.security.SecurityManager; +import org.labkey.api.security.UserPrincipal; import org.labkey.api.security.ValidEmail; +import javax.mail.Address; import java.io.File; import java.util.HashSet; import java.util.Set; @@ -93,17 +95,17 @@ public File getZimsImportFolder(Container c) return new File(val); } - public Set getNotificationUsers() + public Set
getNotificationUserEmails() { - return getUsersForProp(MccManager.NotifyPropName); + return getUserEmailsForProp(MccManager.NotifyPropName); } - public Set getRequestNotificationUsers() + public Set
getRequestNotificationUserEmails() { - return getUsersForProp(MccManager.MCCRequestNotificationUsers); + return getUserEmailsForProp(MccManager.MCCRequestNotificationUsers); } - private Set getUsersForProp(String propName) + private Set
getUserEmailsForProp(String propName) { Module m = ModuleLoader.getInstance().getModule(MccModule.NAME); ModuleProperty mp = m.getModuleProperties().get(propName); @@ -112,30 +114,23 @@ private Set getUsersForProp(String propName) if (userNames == null) return null; - Set ret = new HashSet<>(); - for (String username : userNames.split(",")) + Set
ret = new HashSet<>(); + for (String principalName : userNames.split(",")) { - User u = UserManager.getUserByDisplayName(username); - if (u == null) + UserPrincipal up = SecurityManager.getPrincipal(principalName, getMCCContainer(), true); + if (up == null) { - try - { - u = UserManager.getUser(new ValidEmail(username)); - } - catch (ValidEmail.InvalidEmailException e) - { - //ignore - } + _log.error("Unknown user/group registered for MCC notifications: " + principalName, new Exception()); + continue; } - if (u == null) + try { - _log.error("Unknown user registered for MCC notifications: " + username, new Exception()); + ret.addAll(NotificationService.get().getEmailsForPrincipal(up)); } - - if (u != null) + catch (ValidEmail.InvalidEmailException e) { - ret.add(u); + _log.error("Invalid MCC email: " + principalName, e); } } diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 947e73f51..543175711 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -72,8 +72,8 @@ public boolean isAliasInUse(String alias) } public void sendNotification(int rowid) { - Set users = MccManager.get().getRequestNotificationUsers(); - if (users == null || users.isEmpty()) + Set
emails = MccManager.get().getRequestNotificationUserEmails(); + if (emails == null || emails.isEmpty()) { _log.error("An MCC request was finalized but there are no notification users"); return; @@ -81,12 +81,6 @@ public void sendNotification(int rowid) { try { - Set
emails = new HashSet<>(); - for (User u : users) - { - emails.add(new InternetAddress(u.getEmail())); - } - MailHelper.MultipartMessage mail = MailHelper.createMultipartMessage(); mail.setFrom("mcc-do-not-reply@ohsu.edu"); mail.setSubject("MCC Animal Request"); From 152ec9afbc0bdd817e8cabf3865acc49e9f66e5c Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 12:14:05 -0700 Subject: [PATCH 14/63] Add file missed with last commit --- mcc/src/org/labkey/mcc/MccManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index c5f899baf..e87ade547 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -119,7 +119,7 @@ private Set
getUserEmailsForProp(String propName) { UserPrincipal up = SecurityManager.getPrincipal(principalName, getMCCContainer(), true); if (up == null) - { + {m _log.error("Unknown user/group registered for MCC notifications: " + principalName, new Exception()); continue; } From 2daef99e68a1f6ff9beed07a85b5b1ea70436f5a Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 12:38:47 -0700 Subject: [PATCH 15/63] Fix typo --- mcc/src/org/labkey/mcc/MccManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index e87ade547..c5f899baf 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -119,7 +119,7 @@ private Set
getUserEmailsForProp(String propName) { UserPrincipal up = SecurityManager.getPrincipal(principalName, getMCCContainer(), true); if (up == null) - {m + { _log.error("Unknown user/group registered for MCC notifications: " + principalName, new Exception()); continue; } From 2bc97f8dd5dd9762cd689e1051eebffcddea8cd0 Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 12:42:49 -0700 Subject: [PATCH 16/63] Enforce cell hashing discordance in TCR import --- .../CellRangerVDJCellHashingHandler.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java index aa64e57cc..c65200ecf 100644 --- a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java +++ b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java @@ -224,6 +224,23 @@ private void processVloupeFile(JobContext ctx, File perCellTsv, Readset rs, Reco throw new PipelineJobException("Missing cell to HTO file"); } + double maxHashingPctDiscordant = -1; + if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT) != null) + { + maxHashingPctDiscordant = ConvertHelper.convert(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT), Double.class); + } + + double maxHashingPctFail = -1; + if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL) != null) + { + maxHashingPctFail = ConvertHelper.convert(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL), Double.class); + } + + if (maxHashingPctDiscordant > -1 || maxHashingPctFail > -1) + { + validateHashingRates(ctx, cellToHto, maxHashingPctFail, maxHashingPctDiscordant); + } + action.addOutput(cellToHto, CellRangerVDJUtils.TCR_HASHING_CALLS, false); ctx.getFileManager().addStepOutputs(action, output); } @@ -337,4 +354,65 @@ private File createCellbarcodeWhitelist(JobContext ctx, File perCellTsv, boolean return cellBarcodeWhitelist; } } + + private void validateHashingRates(JobContext ctx, File cellbarcodeToHtoFile, double maxHashingPctFail, double maxHashingPctDiscordant) throws PipelineJobException + { + try (CSVReader reader = new CSVReader(Readers.getReader(cellbarcodeToHtoFile), '\t')) + { + String[] line; + int discordant = 0; + int negative = 0; + int totalLines = 0; + + int consensusIdx = -1; + while ((line = reader.readNext()) != null) + { + if (line.length < 3) + { + throw new PipelineJobException("Line too short"); + } + + //header + if ("cellbarcode".equalsIgnoreCase(line[0])) + { + consensusIdx = Arrays.asList(line).indexOf("consensuscall"); + continue; + } + + if (consensusIdx == -1) + { + throw new PipelineJobException("consensuscall column not found"); + } + + String hto = line[consensusIdx]; + totalLines++; + if ("Discordant".equals(hto)) + { + discordant++; + } + else if ("Negative".equals(hto)) + { + negative++; + } + } + + double fractionDiscordantHashing = (double)discordant / (double)totalLines; + if (maxHashingPctDiscordant != -1 && fractionDiscordantHashing > maxHashingPctDiscordant) + { + CellHashingService.get().copyHtmlLocally(ctx); + throw new PipelineJobException("Discordant hashing rate was : " + fractionDiscordantHashing + ", which is above threshold of: " + maxHashingPctDiscordant + ". Total cells: " + totalLines); + } + + double fractionFailedHashing = (double)(discordant + negative) / (double)totalLines; + if (maxHashingPctFail != -1 && fractionFailedHashing > maxHashingPctFail) + { + CellHashingService.get().copyHtmlLocally(ctx); + throw new PipelineJobException("Fraction failing cell hashing was : " + fractionFailedHashing + ", which is above threshold of: " + maxHashingPctFail + ". Total cells: " + totalLines); + } + } + catch (IOException e) + { + throw new PipelineJobException(e); + } + } } \ No newline at end of file From 85d83c81377797537a35d76e78b6f11728a57045 Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 13:24:26 -0700 Subject: [PATCH 17/63] Add basic site management UI for MCC --- mcc/resources/views/mccAdmin.html | 11 +++-- mcc/resources/views/mccAdmin.view.xml | 2 +- mcc/resources/views/mccFolderInit.html | 24 ++++++++++ mcc/resources/views/mccFolderInit.view.xml | 8 ++++ mcc/resources/views/mccMenu.html | 53 +++++++++++++--------- mcc/resources/web/mcc/Utils.js | 6 +++ 6 files changed, 78 insertions(+), 26 deletions(-) create mode 100644 mcc/resources/views/mccFolderInit.html create mode 100644 mcc/resources/views/mccFolderInit.view.xml diff --git a/mcc/resources/views/mccAdmin.html b/mcc/resources/views/mccAdmin.html index 892620707..2d43fa619 100644 --- a/mcc/resources/views/mccAdmin.html +++ b/mcc/resources/views/mccAdmin.html @@ -5,15 +5,18 @@ if (LABKEY.Security.currentUser.isAdmin){ var webpart = <%=webpartContext%>; + var ctx = MCC.Utils.getMCCContext(webpart.wrapperDivId); + if(!ctx) + return; + Ext4.create('LDK.panel.NavPanel', { renderTo: webpart.wrapperDivId, width: 350, sections: [ - {header: 'Folder Initialization', + {header: 'User/Request Management', items: [ - {name: '1) Load/Create MCC Study', url: '<%=contextPath%>/mcc<%=containerPath%>/importStudy.view?'}, - {name: '2) Create Study QC States', url: '<%=contextPath%>/ehr<%=containerPath%>/ensureQcStates.view?'}, - {name: '3) Populate Initial Data', url: '<%=contextPath%>/EHR<%=containerPath%>/populateInitialData.view?'}, + {name: 'View Pending User Requests', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests&viewName=Pending Requests'}, + {name: 'View All Users', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests'} ] } ] diff --git a/mcc/resources/views/mccAdmin.view.xml b/mcc/resources/views/mccAdmin.view.xml index 4ed342d30..bfd74bf17 100644 --- a/mcc/resources/views/mccAdmin.view.xml +++ b/mcc/resources/views/mccAdmin.view.xml @@ -1,4 +1,4 @@ - + diff --git a/mcc/resources/views/mccFolderInit.html b/mcc/resources/views/mccFolderInit.html new file mode 100644 index 000000000..892620707 --- /dev/null +++ b/mcc/resources/views/mccFolderInit.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/mcc/resources/views/mccFolderInit.view.xml b/mcc/resources/views/mccFolderInit.view.xml new file mode 100644 index 000000000..c421b1d0f --- /dev/null +++ b/mcc/resources/views/mccFolderInit.view.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/views/mccMenu.html b/mcc/resources/views/mccMenu.html index b6db857d7..70b60b78e 100644 --- a/mcc/resources/views/mccMenu.html +++ b/mcc/resources/views/mccMenu.html @@ -17,6 +17,37 @@ if(!ctx) return; + var menuItems = [{ + label: 'Site Home', + name: 'siteHome', + url: LABKEY.ActionURL.buildURL('project', 'begin', 'home'), + visible: true + }, { + label: 'Animal Requests', + name: 'requests', + url: LABKEY.ActionURL.buildURL('mcc', 'mccRequests', ctx['MCCRequestContainer']), + visible: true + }, { + label: 'Animal Data', + name: 'animalData', + url: LABKEY.ActionURL.buildURL('project', 'begin', ctx['MCCContainer']), + visible: true + }, { + label: 'Request Help / Contact', + name: 'help', + url: LABKEY.ActionURL.buildURL('mcc', 'contact', 'home'), + visible: true + }]; + + if (MCC.Utils.isRequestAdmin()) { + menuItems.push({ + label: 'Request Admin', + name: 'requestAdmin', + url: LABKEY.ActionURL.buildURL('mcc', 'mccRequestAdmin', ctx['MCCRequestContainer']), + visible: true + }) + } + var panel = Ext4.create('Ext.view.View', { renderTo: div.id, cls: 'labkey-iconpanel', @@ -44,27 +75,7 @@ store: { type: 'store', fields: ['label', 'name', 'url', 'visible'], - data: [{ - label: 'Site Home', - name: 'siteHome', - url: LABKEY.ActionURL.buildURL('project', 'begin', 'home'), - visible: true - }, { - label: 'Animal Requests', - name: 'requests', - url: LABKEY.ActionURL.buildURL('mcc', 'mccRequests', ctx['MCCRequestContainer']), - visible: true - }, { - label: 'Animal Data', - name: 'animalData', - url: LABKEY.ActionURL.buildURL('project', 'begin', ctx['MCCContainer']), - visible: true - }, { - label: 'Request Help / Contact', - name: 'help', - url: LABKEY.ActionURL.buildURL('mcc', 'contact', 'home'), - visible: true - }] + data: menuItems }, border: true, minHeight: 50 diff --git a/mcc/resources/web/mcc/Utils.js b/mcc/resources/web/mcc/Utils.js index ca9b72c64..3a8ef6ec3 100644 --- a/mcc/resources/web/mcc/Utils.js +++ b/mcc/resources/web/mcc/Utils.js @@ -23,6 +23,12 @@ MCC.Utils = new function() { } return ctx; + }, + + isRequestAdmin: function(){ + var ctx = LABKEY.getModuleContext('mcc'); + + return !!ctx.hasRequestAdminPermission; } } }; \ No newline at end of file From 3eb720b13e432ee47b432d256a1969dc67320331 Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 22 Mar 2022 13:44:32 -0700 Subject: [PATCH 18/63] MCC test fix --- mcc/src/org/labkey/mcc/MccManager.java | 39 ++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index c5f899baf..e227dcfd0 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -26,6 +26,8 @@ import org.labkey.api.module.ModuleLoader; import org.labkey.api.module.ModuleProperty; import org.labkey.api.security.SecurityManager; +import org.labkey.api.security.User; +import org.labkey.api.security.UserManager; import org.labkey.api.security.UserPrincipal; import org.labkey.api.security.ValidEmail; @@ -117,20 +119,35 @@ private Set
getUserEmailsForProp(String propName) Set
ret = new HashSet<>(); for (String principalName : userNames.split(",")) { - UserPrincipal up = SecurityManager.getPrincipal(principalName, getMCCContainer(), true); - if (up == null) + User u = UserManager.getUserByDisplayName(principalName); + if (u != null) { - _log.error("Unknown user/group registered for MCC notifications: " + principalName, new Exception()); - continue; + try + { + ret.add(new ValidEmail(u.getEmail()).getAddress()); + } + catch (ValidEmail.InvalidEmailException e) + { + _log.error("Invalid MCC email: " + principalName, e); + } } - - try - { - ret.addAll(NotificationService.get().getEmailsForPrincipal(up)); - } - catch (ValidEmail.InvalidEmailException e) + else { - _log.error("Invalid MCC email: " + principalName, e); + UserPrincipal up = SecurityManager.getPrincipal(principalName, getMCCContainer(), true); + if (up == null) + { + _log.error("Unknown user/group registered for MCC notifications: [" + principalName + "]", new Exception()); + continue; + } + + try + { + ret.addAll(NotificationService.get().getEmailsForPrincipal(up)); + } + catch (ValidEmail.InvalidEmailException e) + { + _log.error("Invalid MCC email: " + principalName, e); + } } } From a9c309de2320c8f50bbed8a87f5bbbf565f72f13 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 31 Mar 2022 06:28:19 -0700 Subject: [PATCH 19/63] Add null check --- .../tcrdb/pipeline/CellRangerVDJCellHashingHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java index c65200ecf..cf70378cf 100644 --- a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java +++ b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJCellHashingHandler.java @@ -225,13 +225,13 @@ private void processVloupeFile(JobContext ctx, File perCellTsv, Readset rs, Reco } double maxHashingPctDiscordant = -1; - if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT) != null) + if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT) != null && !StringUtils.isEmpty(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT).toString())) { maxHashingPctDiscordant = ConvertHelper.convert(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_DISCORDANT), Double.class); } double maxHashingPctFail = -1; - if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL) != null) + if (ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL) != null && !StringUtils.isEmpty(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL).toString())) { maxHashingPctFail = ConvertHelper.convert(ctx.getParams().get(CellHashingService.MAX_HASHING_PCT_FAIL), Double.class); } From b0f07d9cab0025edc7a121b48a308d974f603ab2 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 1 Apr 2022 14:40:24 -0700 Subject: [PATCH 20/63] Add support for standalone nimble run, and allow SRA to merge multiple input ReadData into one ReadData per accession --- mcc/resources/schemas/mcc.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index aac4a1730..a265fec47 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -226,6 +226,7 @@ Object Id true false + false Last Name From ab8f03e12d62d178b111913bd1e6762265eb1900 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 2 Apr 2022 10:40:20 -0700 Subject: [PATCH 21/63] Remove legacy lustre folder --- .../org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java b/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java index 4c2d9dc9f..a0e5331c4 100644 --- a/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java +++ b/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java @@ -152,9 +152,6 @@ public void run(Logger log) log.info("total active pipeline jobs: " + _jobGuids.size()); //hacky, but this is only planned to be used by us - inspectFolder(log, new File("/home/exacloud/lustre1/prime-seq/workDir/")); - inspectFolder(log, new File("/home/exacloud/lustre1/prime-seq/cachedData/")); - inspectFolder(log, new File("/home/exacloud/gscratch/prime-seq/workDir/")); inspectFolder(log, new File("/home/exacloud/gscratch/prime-seq/cachedData/")); } From f227900704483abf0d72897bea5e257da0c8f07f Mon Sep 17 00:00:00 2001 From: bbimber Date: Mon, 4 Apr 2022 16:29:00 -0700 Subject: [PATCH 22/63] Fix typo in COVID import panel --- covidseq/resources/web/covidseq/panel/SampleImportPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js index 772477723..54281160a 100644 --- a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js +++ b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js @@ -227,7 +227,7 @@ Ext4.define('CovidSeq.panel.SampleImportPanel', { if (panel.COUNTY_MAP[val]) { if (row.state) { if (panel.STATE_ABBREV[val.toLowerCase()]) { - row.state = panel.STATE_ABBREV[row.state.toLowerCase()] + row.state = panel.STATE_ABBREV[val.toLowerCase()] } if (panel.COUNTY_MAP[val].states.indexOf(row.state) === -1) { @@ -640,7 +640,7 @@ Ext4.define('CovidSeq.panel.SampleImportPanel', { // CT of record is N for taqpath, N1 for CDC? - data._patientid = data.patientid || data.state + '-OHSU-' + data.samplename.replaceAll('CV', ''); + data._patientid = data.patientid || data.state + '-OHSU-' + (data.samplename ? data.samplename.replaceAll('CV', '') : 'Sample'); ret.push(data); }, this); From ae546eb9eaf9602a449383634aa90dcd1aec3c6f Mon Sep 17 00:00:00 2001 From: bbimber Date: Mon, 4 Apr 2022 16:58:21 -0700 Subject: [PATCH 23/63] Skip blank lines for COVID sample import --- covidseq/resources/web/covidseq/panel/SampleImportPanel.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js index 54281160a..f99399ed2 100644 --- a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js +++ b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js @@ -574,6 +574,11 @@ Ext4.define('CovidSeq.panel.SampleImportPanel', { var errorMessages = []; var infoMessages = []; Ext4.Array.forEach(rows, function(row, rowIdx){ + // skip blank rows: + if (Ext4.isEmpty(row.join(''))) { + return; + } + var data = { objectId: LABKEY.Utils.generateUUID() }; From 24e3e006abd4869afba68b3deff1d677d1648363 Mon Sep 17 00:00:00 2001 From: bbimber Date: Mon, 4 Apr 2022 17:02:06 -0700 Subject: [PATCH 24/63] Bugfix state translation in COVID sample import --- covidseq/resources/web/covidseq/panel/SampleImportPanel.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js index f99399ed2..d590959bf 100644 --- a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js +++ b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js @@ -226,8 +226,9 @@ Ext4.define('CovidSeq.panel.SampleImportPanel', { if (panel.COUNTY_MAP[val]) { if (row.state) { - if (panel.STATE_ABBREV[val.toLowerCase()]) { - row.state = panel.STATE_ABBREV[val.toLowerCase()] + // Correct state, if needed: + if (panel.STATE_ABBREV[row.state.toLowerCase()]) { + row.state = panel.STATE_ABBREV[row.state.toLowerCase()] } if (panel.COUNTY_MAP[val].states.indexOf(row.state) === -1) { From 93ad4ac3ace45e15a1cd1951e84fbc6cce11fae0 Mon Sep 17 00:00:00 2001 From: bbimber Date: Mon, 4 Apr 2022 21:24:34 -0700 Subject: [PATCH 25/63] Add column for RQG_alt_ID --- covidseq/resources/schemas/covidseq.xml | 4 +++- .../schemas/dbscripts/sqlserver/covidseq-21.003-21.004.sql | 1 + covidseq/resources/web/covidseq/panel/SampleImportPanel.js | 5 ++++- covidseq/src/org/labkey/covidseq/CovidseqModule.java | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 covidseq/resources/schemas/dbscripts/sqlserver/covidseq-21.003-21.004.sql diff --git a/covidseq/resources/schemas/covidseq.xml b/covidseq/resources/schemas/covidseq.xml index 6de4c263e..29da021be 100644 --- a/covidseq/resources/schemas/covidseq.xml +++ b/covidseq/resources/schemas/covidseq.xml @@ -102,7 +102,9 @@ cDNA_Plate_Location - + + RQG_alt_ID + true diff --git a/covidseq/resources/schemas/dbscripts/sqlserver/covidseq-21.003-21.004.sql b/covidseq/resources/schemas/dbscripts/sqlserver/covidseq-21.003-21.004.sql new file mode 100644 index 000000000..98cc10388 --- /dev/null +++ b/covidseq/resources/schemas/dbscripts/sqlserver/covidseq-21.003-21.004.sql @@ -0,0 +1 @@ +ALTER TABLE covidseq.samples ADD rqg_alt_id varchar(200); \ No newline at end of file diff --git a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js index d590959bf..f496d68b9 100644 --- a/covidseq/resources/web/covidseq/panel/SampleImportPanel.js +++ b/covidseq/resources/web/covidseq/panel/SampleImportPanel.js @@ -26,9 +26,12 @@ Ext4.define('CovidSeq.panel.SampleImportPanel', { allowBlank: true },{ name: 'cdna_plate_id', - labels: ['cDNA_Plate_ID', 'RQG_alt_ID', 'MM Alt ID', 'Alt ID', 'MM ID', 'RQG_alt_ID'], + labels: ['cDNA_Plate_ID', 'MM Alt ID', 'Alt ID', 'MM ID'], alwaysShow: true, allowBlank: true + },{ + name: 'RQG_alt_ID', + labels: ['RQG_alt_ID', 'RQG_alt_ID'] },{ name: 'gender', labels: ['Gender', 'Sex'], diff --git a/covidseq/src/org/labkey/covidseq/CovidseqModule.java b/covidseq/src/org/labkey/covidseq/CovidseqModule.java index b5796d777..e1fa71e8c 100644 --- a/covidseq/src/org/labkey/covidseq/CovidseqModule.java +++ b/covidseq/src/org/labkey/covidseq/CovidseqModule.java @@ -41,7 +41,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 21.003; + return 21.004; } @Override From fd23bba9c33ba678364203943aa091611b0c75a9 Mon Sep 17 00:00:00 2001 From: bbimber Date: Tue, 5 Apr 2022 08:53:19 -0700 Subject: [PATCH 26/63] Skip 'low counts' for VDJ hashing import --- .../src/org/labkey/tcrdb/pipeline/CellRangerVDJUtils.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJUtils.java b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJUtils.java index 8434781dd..431fdd624 100644 --- a/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJUtils.java +++ b/tcrdb/src/org/labkey/tcrdb/pipeline/CellRangerVDJUtils.java @@ -196,6 +196,7 @@ public void importAssayData(PipelineJob job, AnalysisModel model, File vLoupeFil int doublet = 0; int discordant = 0; int negative = 0; + int lowCounts = 0; int consensusIdx = -1; while ((line = reader.readNext()) != null) @@ -235,6 +236,11 @@ else if ("Negative".equals(hto)) negative++; continue; } + else if ("Low Counts".equals(hto)) + { + lowCounts++; + continue; + } CDNA_Library cDNA = htoNameToCDNAMap.get(hto); if (cDNA == null) @@ -249,6 +255,7 @@ else if ("Negative".equals(hto)) _log.info("total doublets: " + doublet); _log.info("total discordant: " + discordant); _log.info("total negatives: " + negative); + _log.info("total low counts: " + lowCounts); } catch (IOException e) { From bf5d236b0d11628efcb1ca44021f2336001d24cf Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 13 Apr 2022 10:41:14 -0700 Subject: [PATCH 27/63] Ensure consistent case for status in MCC and add automatic selection of genomicsDB consolidate batch size --- mcc/resources/queries/study/demographics.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mcc/resources/queries/study/demographics.js b/mcc/resources/queries/study/demographics.js index f514db4fa..3b39ec58e 100644 --- a/mcc/resources/queries/study/demographics.js +++ b/mcc/resources/queries/study/demographics.js @@ -26,6 +26,10 @@ function onUpsert(helper, scriptErrors, row, oldRow){ row.calculated_status = row.status; } + if (row.calculated_status === 'alive') { + row.calculated_status = 'Alive'; + } + if (row.death) { row.calculated_status = 'Dead'; } @@ -42,6 +46,9 @@ function onUpsert(helper, scriptErrors, row, oldRow){ case 'Female': row.gender = 'f'; break; + case 'U': + case 'u': + case 'Other': case 'Undetermined': row.gender = 'Unknown'; break; From 97c9d12ea1f6b83ebc53daa603b4a97f6bfc89cd Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 21 Apr 2022 14:55:15 -0700 Subject: [PATCH 28/63] Allow mGAP releases to track when each new site/allele first appears --- mGAP/resources/etls/prime-seq.xml | 3 + .../dbscripts/postgresql/mgap-16.62-16.63.sql | 1 + .../dbscripts/sqlserver/mgap-16.62-16.63.sql | 1 + mGAP/resources/schemas/mgap.xml | 9 + mGAP/src/org/labkey/mgap/mGAPModule.java | 2 +- .../org/labkey/mgap/mGapMaintenanceTask.java | 2 +- .../mgap/pipeline/mGapReleaseGenerator.java | 180 ++++++++++++------ mcc/resources/queries/mcc/animalRequests.js | 11 ++ .../org/labkey/mcc/query/TriggerHelper.java | 22 +++ 9 files changed, 166 insertions(+), 65 deletions(-) create mode 100644 mGAP/resources/schemas/dbscripts/postgresql/mgap-16.62-16.63.sql create mode 100644 mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.62-16.63.sql diff --git a/mGAP/resources/etls/prime-seq.xml b/mGAP/resources/etls/prime-seq.xml index c6a31d3b6..a8f394aa7 100644 --- a/mGAP/resources/etls/prime-seq.xml +++ b/mGAP/resources/etls/prime-seq.xml @@ -94,6 +94,8 @@ liftedVcfId/library_id/name sitesOnlyVcfId/dataid/DataFileUrl sitesOnlyVcfId/name + novelSitesVcfId/dataid/DataFileUrl + novelSitesVcfId/name humanJbrowseId objectId @@ -104,6 +106,7 @@ + diff --git a/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.62-16.63.sql b/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.62-16.63.sql new file mode 100644 index 000000000..93bde7eb1 --- /dev/null +++ b/mGAP/resources/schemas/dbscripts/postgresql/mgap-16.62-16.63.sql @@ -0,0 +1 @@ +ALTER TABLE mGAP.variantCatalogReleases ADD novelSitesVcfId int; \ No newline at end of file diff --git a/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.62-16.63.sql b/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.62-16.63.sql new file mode 100644 index 000000000..93bde7eb1 --- /dev/null +++ b/mGAP/resources/schemas/dbscripts/sqlserver/mgap-16.62-16.63.sql @@ -0,0 +1 @@ +ALTER TABLE mGAP.variantCatalogReleases ADD novelSitesVcfId int; \ No newline at end of file diff --git a/mGAP/resources/schemas/mgap.xml b/mGAP/resources/schemas/mgap.xml index 96b65a274..ee022ea76 100644 --- a/mGAP/resources/schemas/mgap.xml +++ b/mGAP/resources/schemas/mgap.xml @@ -158,6 +158,15 @@ rowid + + Novel Sites For This Release + true + + sequenceanalysis + outputfiles + rowid + + Genome Browser (Human) true diff --git a/mGAP/src/org/labkey/mgap/mGAPModule.java b/mGAP/src/org/labkey/mgap/mGAPModule.java index 2a9f888af..58766cfec 100644 --- a/mGAP/src/org/labkey/mgap/mGAPModule.java +++ b/mGAP/src/org/labkey/mgap/mGAPModule.java @@ -61,7 +61,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 16.62; + return 16.63; } @Override diff --git a/mGAP/src/org/labkey/mgap/mGapMaintenanceTask.java b/mGAP/src/org/labkey/mgap/mGapMaintenanceTask.java index a3a4e93ee..0acd09231 100644 --- a/mGAP/src/org/labkey/mgap/mGapMaintenanceTask.java +++ b/mGAP/src/org/labkey/mgap/mGapMaintenanceTask.java @@ -120,7 +120,7 @@ private void inspectReleaseFolder(String releaseId, File baseDir, Container c, U expectedFiles.add(new File(f.getPath() + ".tbi")); }); - final Set fields = PageFlowUtil.set("vcfId", "variantTable", "liftedVcfId", "sitesOnlyVcfId"); + final Set fields = PageFlowUtil.set("vcfId", "variantTable", "liftedVcfId", "sitesOnlyVcfId", "novelSitesVcfId"); new TableSelector(QueryService.get().getUserSchema(u, c, mGAPSchema.NAME).getTable(mGAPSchema.TABLE_VARIANT_CATALOG_RELEASES), fields, new SimpleFilter(FieldKey.fromString("objectid"), releaseId), null).forEachResults(rs -> { for (String field : fields) { diff --git a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java index 0b6914508..ec5ef0236 100644 --- a/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java +++ b/mGAP/src/org/labkey/mgap/pipeline/mGapReleaseGenerator.java @@ -52,6 +52,7 @@ import org.labkey.api.sequenceanalysis.pipeline.SequenceAnalysisJobSupport; import org.labkey.api.sequenceanalysis.pipeline.SequenceOutputHandler; import org.labkey.api.sequenceanalysis.pipeline.ToolParameterDescriptor; +import org.labkey.api.sequenceanalysis.run.AbstractDiscvrSeqWrapper; import org.labkey.api.sequenceanalysis.run.GeneToNameTranslator; import org.labkey.api.sequenceanalysis.run.SelectVariantsWrapper; import org.labkey.api.util.FileType; @@ -92,6 +93,7 @@ public class mGapReleaseGenerator extends AbstractParameterizedOutputHandler inputs, List outputTableMap = new HashMap<>(); Map liftedVcfMap = new HashMap<>(); Map sitesOnlyVcfMap = new HashMap<>(); + Map novelSitesVcfMap = new HashMap<>(); Map trackVCFMap = new HashMap<>(); for (SequenceOutputFile so : outputsCreated) @@ -291,6 +298,11 @@ else if (so.getCategory().contains("mGAP Release: Sites Only")) String name = so.getName().replaceAll(": Sites Only", ""); sitesOnlyVcfMap.put(name, so); } + else if (so.getCategory().contains("mGAP Release: Novel Sites")) + { + String name = so.getName().replaceAll(": Novel Sites", ""); + novelSitesVcfMap.put(name, so); + } else if (so.getCategory().endsWith("Release")) { outputVCFMap.put(so.getName(), so); @@ -340,6 +352,12 @@ else if (so.getCategory().endsWith("Release Track")) throw new PipelineJobException("Unable to find sites-only VCF for release: " + release); } + SequenceOutputFile novelSitesVcf = novelSitesVcfMap.get(release); + if (novelSitesVcf == null) + { + throw new PipelineJobException("Unable to find novel sites VCF for release: " + release); + } + //find basic stats: job.getLogger().info("inspecting file: " + so.getName()); int totalSubjects; @@ -404,6 +422,7 @@ else if (so.getCategory().endsWith("Release Track")) row.put("vcfId", so.getRowid()); row.put("liftedVcfId", liftedVcf.getRowid()); row.put("sitesOnlyVcfId", sitesOnlyVcf.getRowid()); + row.put("novelSitesVcfId", novelSitesVcf.getRowid()); row.put("variantTable", so2.getRowid()); row.put("genomeId", so.getLibrary_id()); row.put("totalSubjects", totalSubjects); @@ -776,6 +795,14 @@ public void processFilesRemote(List inputFiles, JobContext c ReferenceGenome grch37Genome = ctx.getSequenceSupport().getCachedGenome(ctx.getParams().getInt(AnnotationStep.GRCH37)); int genomeId = ctx.getSequenceSupport().getCachedObject(MMUL_GENOME, Integer.class); ReferenceGenome genome = ctx.getSequenceSupport().getCachedGenome(genomeId); + boolean testOnly = ctx.getParams().optBoolean("testOnly", false); + + int priorReleaseId = ctx.getParams().optInt(PRIOR_RELEASE); + File priorReleaseVcf = ctx.getSequenceSupport().getCachedData(priorReleaseId); + if (!priorReleaseVcf.exists()) + { + throw new PipelineJobException("Unable to find prior release VCF: " + priorReleaseVcf.getPath()); + } String releaseVersion = ctx.getParams().optString("releaseVersion", "0.0"); File primaryTrackVcf = new File(ctx.getOutputDir(), "mGap.v" + FileUtil.makeLegalName(releaseVersion).replaceAll(" ", "_") + ".vcf.gz"); @@ -799,17 +826,23 @@ public void processFilesRemote(List inputFiles, JobContext c File renamedVcfDone = new File(renamedVcf.getPath() + ".done"); if (renamedVcfDone.exists()) { - ctx.getLogger().info("File already copied: " + renamedVcf.getPath()); + ctx.getLogger().info("File already present: " + renamedVcf.getPath()); } else { - ctx.getLogger().info("Copying VCF: " + renamedVcf.getPath()); - if (renamedVcf.exists()) + if (track.isPrimary()) { - renamedVcf.delete(); + annotateBasedOnPriorRelease(ctx, vcf, priorReleaseVcf, releaseVersion, primaryTrackVcf, genome, testOnly); + } + else + { + ctx.getLogger().info("Copying VCF: " + renamedVcf.getPath()); + if (renamedVcf.exists()) + { + renamedVcf.delete(); + } + FileUtils.copyFile(vcf, renamedVcf); } - FileUtils.copyFile(vcf, renamedVcf); - if (renamedVcfIdx.exists()) { @@ -845,7 +878,6 @@ public void processFilesRemote(List inputFiles, JobContext c //Then summarize: ctx.getLogger().info("inspecting primary VCF and creating summary table"); inspectAndSummarizeVcf(ctx, primaryTrackVcf, translator, genome, true); - boolean testOnly = ctx.getParams().optBoolean("testOnly", false); SequenceOutputFile output = new SequenceOutputFile(); output.setFile(primaryTrackVcf); @@ -862,13 +894,31 @@ public void processFilesRemote(List inputFiles, JobContext c output2.setLibrary_id(genome.getGenomeId()); ctx.getFileManager().addSequenceOutput(output2); - File lifted = liftToHuman(ctx, primaryTrackVcf, genome, grch37Genome); + File sitesOnlyVcf = getSitesOnlyVcf(ctx, primaryTrackVcf, genome); + + File lifted = liftToHuman(ctx, primaryTrackVcf, sitesOnlyVcf, grch37Genome); SequenceOutputFile output3 = new SequenceOutputFile(); output3.setFile(lifted); output3.setName("mGAP Release: " + releaseVersion + " Lifted to Human"); output3.setCategory((testOnly ? "Test " : "") + "mGAP Release Lifted to Human"); output3.setLibrary_id(grch37Genome.getGenomeId()); ctx.getFileManager().addSequenceOutput(output3); + + SequenceOutputFile output4 = new SequenceOutputFile(); + output4.setFile(getNovelSitesVcfName(ctx.getOutputDir(), primaryTrackVcf)); + output4.setName("mGAP Release: " + releaseVersion + " Novel Sites"); + output4.setCategory((testOnly ? "Test " : "") + "mGAP Release: Novel Sites"); + output4.setLibrary_id(genome.getGenomeId()); + ctx.getFileManager().addSequenceOutput(output4); + } + + private void annotateBasedOnPriorRelease(JobContext ctx, File inputVcf, File priorReleaseVcf, String releaseVersion, File primaryTrackVcf, ReferenceGenome genome, boolean testOnly) throws PipelineJobException + { + // Annotate relative to previous release and make sites-only VCF + File droppedFromPriorRelease = getDroppedSitesVcfName(ctx.getOutputDir(), primaryTrackVcf); + File novelInRelease = getNovelSitesVcfName(ctx.getOutputDir(), primaryTrackVcf); + + new AnnotateNovelSitesWrapper(ctx.getLogger()).execute(inputVcf, priorReleaseVcf, novelInRelease, droppedFromPriorRelease, releaseVersion, primaryTrackVcf); } private void checkVcfAnnotationsAndSamples(File vcfInput, boolean skipAnnotationChecks) throws PipelineJobException @@ -907,11 +957,11 @@ private void checkVcfAnnotationsAndSamples(File vcfInput, boolean skipAnnotation } } - private File liftToHuman(JobContext ctx, File primaryTrackVcf, ReferenceGenome sourceGenome, ReferenceGenome grch37Genome) throws PipelineJobException + private File getSitesOnlyVcf(JobContext ctx, File primaryTrackVcf, ReferenceGenome sourceGenome) throws PipelineJobException { //drop genotypes for performance: ctx.getLogger().info("creating VCF without genotypes"); - File noGenotypes = new File(primaryTrackVcf.getParentFile(), SequenceAnalysisService.get().getUnzippedBaseName(primaryTrackVcf.getName()) + ".noGenotypes.vcf.gz"); + File noGenotypes = getSitesOnlyVcfName(ctx.getOutputDir(), primaryTrackVcf); if (indexExists(noGenotypes)) { ctx.getLogger().info("resuming from file: " + noGenotypes.getPath()); @@ -929,6 +979,11 @@ private File liftToHuman(JobContext ctx, File primaryTrackVcf, ReferenceGenome s output.setLibrary_id(sourceGenome.getGenomeId()); ctx.getFileManager().addSequenceOutput(output); + return noGenotypes; + } + + private File liftToHuman(JobContext ctx, File primaryTrackVcf, File noGenotypes, ReferenceGenome grch37Genome) throws PipelineJobException + { //lift to target genome Integer chainFileId = ctx.getSequenceSupport().getCachedObject(AnnotationStep.CHAIN_FILE, Integer.class); File chainFile = ctx.getSequenceSupport().getCachedData(chainFileId); @@ -952,6 +1007,21 @@ private File liftToHuman(JobContext ctx, File primaryTrackVcf, ReferenceGenome s return liftedToGRCh37; } + private File getSitesOnlyVcfName(File outDir, File primaryTrackVcf) + { + return new File(outDir, SequenceAnalysisService.get().getUnzippedBaseName(primaryTrackVcf.getName()) + ".sitesOnly.vcf.gz"); + } + + private File getDroppedSitesVcfName(File outDir, File primaryTrackVcf) + { + return new File(outDir, SequenceAnalysisService.get().getUnzippedBaseName(primaryTrackVcf.getName()) + ".droppedFromPriorRelease.vcf.gz"); + } + + private File getNovelSitesVcfName(File outDir, File primaryTrackVcf) + { + return new File(outDir, SequenceAnalysisService.get().getUnzippedBaseName(primaryTrackVcf.getName()) + ".newToRelease.vcf.gz"); + } + private File getLiftedVcfName(File outDir, File primaryTrackVcf) { return new File(outDir, SequenceAnalysisService.get().getUnzippedBaseName(primaryTrackVcf.getName()) + ".liftToGRCh37.vcf.gz"); @@ -1448,7 +1518,7 @@ private void generateSummary(JobContext ctx, File variantsToTable, File output, try (BufferedReader reader = Readers.getReader(variantsToTable)) { lineNo++; - if (lineNo % 1000000 == 0) + if (lineNo % 500000 == 0) { ctx.getLogger().info("processed " + lineNo + " lines"); } @@ -1559,58 +1629,6 @@ private void maybeWriteVariantLine(Set> queuedLines, VariantContext queuedLines.add(Arrays.asList(vc.getContig(), String.valueOf(vc.getStart()), vc.getReference().getDisplayString(), allele, source, reason, (description == null ? "" : description), StringUtils.join(overlappingGenes, ";"), StringUtils.join(omims, ";"), StringUtils.join(omimds, ";"), af == null ? "" : af.toString(), identifier == null ? "" : identifier, cadd == null ? "" : cadd.toString())); } - private String getPrimaryTrackName(File trackFile) throws PipelineJobException - { - Set ret = new HashSet<>(); - try (CSVReader reader = new CSVReader(Readers.getReader(trackFile), '\t')) - { - String[] line; - while ((line = reader.readNext()) != null) - { - boolean isPrimary = ConvertHelper.convert(line[2], Boolean.class); - if (isPrimary) - { - ret.add(line[0]); - } - } - } - catch (IOException e) - { - throw new PipelineJobException(e); - } - - if (ret.size() != 1) - { - throw new PipelineJobException("Expected a single track labeled as primary: " + StringUtils.join(ret, ";")); - } - - return ret.iterator().next(); - } - - private Map> parseTrackMap(File trackFile) throws PipelineJobException - { - Map> ret = new HashMap<>(); - try (CSVReader reader = new CSVReader(Readers.getReader(trackFile), '\t')) - { - String[] line; - while ((line = reader.readNext()) != null) - { - if (!ret.containsKey(line[0])) - { - ret.put(line[0], new ArrayList<>()); - } - - ret.get(line[0]).add(line[1]); - } - } - catch (IOException e) - { - throw new PipelineJobException(e); - } - - return ret; - } - private boolean indexExists(File vcf) { File idx = new File(vcf.getPath() + ".tbi"); @@ -1813,4 +1831,40 @@ public void testOMIMParse() throws Exception } } } + + private static class AnnotateNovelSitesWrapper extends AbstractDiscvrSeqWrapper + { + public AnnotateNovelSitesWrapper(Logger log) + { + super(log); + } + + public File execute(File vcf, File referenceVcf, File novelSitesVcf, File missingSitesVcf, String versionString, File vcfOutput) throws PipelineJobException + { + List args = new ArrayList<>(getBaseArgs()); + args.add("AnnotateNovelSites"); + args.add("-V"); + args.add(vcf.getPath()); + args.add("-rv"); + args.add(referenceVcf.getPath()); + args.add("-ns"); + args.add(novelSitesVcf.getPath()); + args.add("-ms"); + args.add(missingSitesVcf.getPath()); + + args.add("-an"); + args.add("mGAPV"); + args.add("-ad"); + args.add("The first mGAP version where variants at this site appeared"); + args.add("-av"); + args.add(versionString); + + args.add("-O"); + args.add(vcfOutput.getPath()); + + execute(args); + + return vcfOutput; + } + } } diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index 3d00815a7..2ff66207d 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -29,4 +29,15 @@ function afterUpsert(row, oldRow, errors) { triggerHelper.sendNotification(row.rowid); } } +} + +// cascade delete co-i, cohorts: +function beforeDelete(row, errors){ + if (row.objectid) { + triggerHelper.cascadeDelete('mcc', 'coinvestigators', 'requestid', row.objectid); + triggerHelper.cascadeDelete('mcc', 'requestcohorts', 'requestid', row.objectid); + } + else { + console.error('MCC animalRequests row lacks objectid. row ID: ' + row.rowid); + } } \ No newline at end of file diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 543175711..060d06ac8 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -10,21 +10,26 @@ import org.labkey.api.data.DbSequence; import org.labkey.api.data.DbSequenceManager; import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; import org.labkey.api.query.DetailsURL; import org.labkey.api.query.FieldKey; +import org.labkey.api.query.QueryService; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; +import org.labkey.api.security.permissions.DeletePermission; import org.labkey.api.settings.AppProps; import org.labkey.api.util.ExceptionUtil; import org.labkey.api.util.MailHelper; +import org.labkey.api.view.UnauthorizedException; import org.labkey.mcc.MccManager; import org.labkey.mcc.MccSchema; import javax.mail.Address; import javax.mail.Message; import javax.mail.internet.InternetAddress; +import java.sql.SQLException; import java.util.HashSet; import java.util.Set; @@ -97,4 +102,21 @@ public void sendNotification(int rowid) { _log.error("Unable to send MCC email", e); } } + + public void cascadeDelete(String schemaName, String queryName, String keyField, Object keyValue) throws SQLException + { + DbSchema schema = QueryService.get().getUserSchema(_user, _container, schemaName).getDbSchema(); + if (schema == null) + throw new RuntimeException("Unknown schema: " + schemaName); + + TableInfo table = schema.getTable(queryName); + if (table == null) + throw new RuntimeException("Unknown table: " + schemaName + "." + queryName); + + if (!_container.hasPermission(_user, DeletePermission.class)) + throw new UnauthorizedException("User does not have permission to delete from the table: " + table.getPublicName()); + + SimpleFilter filter = new SimpleFilter(FieldKey.fromString(keyField), keyValue); + Table.delete(table, filter); + } } From 5fb73ecbb102d6f65ed0f4bd1334338fd4bec207 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 09:13:30 -0700 Subject: [PATCH 29/63] Bump minimist from 1.2.5 to 1.2.6 in /mcc (#55) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- mcc/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mcc/package-lock.json b/mcc/package-lock.json index e83642320..2b72459de 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -9981,9 +9981,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -21773,9 +21773,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", From e2ecdd2c953e7b7c42ff31f96d286579e1dbc167 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 09:16:09 -0700 Subject: [PATCH 30/63] Bump async from 2.6.3 to 2.6.4 in /mcc (#60) Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- mcc/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mcc/package-lock.json b/mcc/package-lock.json index 2b72459de..fd1d6c276 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -3547,9 +3547,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -16872,9 +16872,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" From f4fca3759fd7ecde397175316600c693a1999a8d Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 28 Apr 2022 08:41:51 -0700 Subject: [PATCH 31/63] Checkpoint for sizable refactor of MCC animal request (#61) * Sizable refactor of MCC animal request --- .../resources/queries/mGAP/subjectsSource.sql | 2 + mGAP/resources/views/phenotypes.html | 3 +- mcc/package-lock.json | 3437 +++++++++++++++-- mcc/package.json | 8 +- mcc/resources/folderTypes/MCC.folderType.xml | 4 + mcc/resources/queries/mcc/animalRequests.js | 64 +- .../queries/mcc/animalRequests/.qview.xml | 1 + .../mcc/animalRequests/Detailed.qview.xml | 17 - mcc/resources/queries/mcc/myRequests.sql | 4 +- mcc/resources/queries/mcc/requestReviews.js | 18 + .../queries/mcc/requestReviews/.qview.xml | 12 + .../queries/mcc/requestScores/.qview.xml | 18 + .../mcc/requestScores/Detailed.qview.xml | 16 + .../queries/study/demographics.query.xml | 3 + .../datasets/datasets_metadata.xml | 3 + .../postgresql/mcc-20.008-20.009.sql | 38 + .../postgresql/mcc-20.009-20.010.sql | 4 + .../dbscripts/sqlserver/mcc-20.008-20.009.sql | 38 + .../dbscripts/sqlserver/mcc-20.009-20.010.sql | 4 + mcc/resources/schemas/mcc.xml | 170 +- mcc/resources/views/mccAdmin.html | 46 +- mcc/resources/views/mccMenu.html | 7 + mcc/resources/views/mccRequestAdmin.html | 44 +- mcc/resources/views/rabRequestReview.html | 32 + mcc/resources/views/rabRequestReview.view.xml | 11 + mcc/resources/web/mcc/img/mccRequest.png | Bin 0 -> 77058 bytes .../client/AnimalRequest/animal-request.tsx | 761 ++-- mcc/src/client/AnimalRequest/app.tsx | 8 +- .../client/AnimalRequest/co-investigators.tsx | 67 - .../{ => components}/animal-breeding.tsx | 0 .../{ => components}/animal-cohort.tsx | 39 +- .../AnimalRequest/{ => components}/button.tsx | 8 +- .../components/co-investigators.tsx | 61 + .../AnimalRequest/{ => components}/date.tsx | 0 .../error-message-handler.tsx | 37 +- .../{ => components}/funding.tsx | 5 +- .../{ => components}/iacuc-protocol.tsx | 2 +- .../{ => components}/input-number.tsx | 0 .../AnimalRequest/{ => components}/input.tsx | 0 .../AnimalRequest/{ => components}/select.tsx | 13 +- .../{ => components}/text-area.tsx | 1 - .../AnimalRequest/{ => components}/title.tsx | 0 .../{ => components}/tooltip.tsx | 2 +- .../AnimalRequest/{ => components}/values.ts | 12 +- .../{ => components}/yes-no-radio.tsx | 0 .../client/AnimalRequest/research-area.tsx | 24 +- mcc/src/client/Dashboard/Dashboard.tsx | 2 +- mcc/src/client/RequestReview/app.tsx | 11 + .../components/InternalReviewForm.tsx | 85 + .../components/RabReviewForm.tsx | 95 + .../components/ReadOnlyRequest.tsx | 218 ++ .../client/RequestReview/request-review.tsx | 92 + mcc/src/client/components/RequestUtils.tsx | 187 + mcc/src/client/entryPoints.js | 6 + mcc/src/client/labkeyOverrides.css | 3 + .../{AnimalRequest => }/tailwind.config.js | 0 .../client/{AnimalRequest => }/tailwind.css | 0 mcc/src/org/labkey/mcc/MccController.java | 62 + .../org/labkey/mcc/MccMaintenanceTask.java | 5 + mcc/src/org/labkey/mcc/MccManager.java | 50 + mcc/src/org/labkey/mcc/MccModule.java | 2 +- mcc/src/org/labkey/mcc/MccSchema.java | 3 + mcc/src/org/labkey/mcc/MccUserSchema.java | 17 + .../mcc/query/AbstractMccDisplayColumn.java | 43 + ...malRequestActionsDisplayColumnFactory.java | 45 + mcc/src/org/labkey/mcc/query/MccRequest.java | 451 +++ ...uestReviewActionsDisplayColumnFactory.java | 60 + ...questScoreActionsDisplayColumnFactory.java | 113 + .../org/labkey/mcc/query/TriggerHelper.java | 118 +- .../org/labkey/test/tests/mcc/MccTest.java | 342 +- 70 files changed, 5960 insertions(+), 1094 deletions(-) delete mode 100644 mcc/resources/queries/mcc/animalRequests/Detailed.qview.xml create mode 100644 mcc/resources/queries/mcc/requestReviews.js create mode 100644 mcc/resources/queries/mcc/requestReviews/.qview.xml create mode 100644 mcc/resources/queries/mcc/requestScores/.qview.xml create mode 100644 mcc/resources/queries/mcc/requestScores/Detailed.qview.xml create mode 100644 mcc/resources/schemas/dbscripts/postgresql/mcc-20.008-20.009.sql create mode 100644 mcc/resources/schemas/dbscripts/postgresql/mcc-20.009-20.010.sql create mode 100644 mcc/resources/schemas/dbscripts/sqlserver/mcc-20.008-20.009.sql create mode 100644 mcc/resources/schemas/dbscripts/sqlserver/mcc-20.009-20.010.sql create mode 100644 mcc/resources/views/rabRequestReview.html create mode 100644 mcc/resources/views/rabRequestReview.view.xml create mode 100644 mcc/resources/web/mcc/img/mccRequest.png delete mode 100644 mcc/src/client/AnimalRequest/co-investigators.tsx rename mcc/src/client/AnimalRequest/{ => components}/animal-breeding.tsx (100%) rename mcc/src/client/AnimalRequest/{ => components}/animal-cohort.tsx (79%) rename mcc/src/client/AnimalRequest/{ => components}/button.tsx (72%) create mode 100644 mcc/src/client/AnimalRequest/components/co-investigators.tsx rename mcc/src/client/AnimalRequest/{ => components}/date.tsx (100%) rename mcc/src/client/AnimalRequest/{ => components}/error-message-handler.tsx (50%) rename mcc/src/client/AnimalRequest/{ => components}/funding.tsx (82%) rename mcc/src/client/AnimalRequest/{ => components}/iacuc-protocol.tsx (97%) rename mcc/src/client/AnimalRequest/{ => components}/input-number.tsx (100%) rename mcc/src/client/AnimalRequest/{ => components}/input.tsx (100%) rename mcc/src/client/AnimalRequest/{ => components}/select.tsx (59%) rename mcc/src/client/AnimalRequest/{ => components}/text-area.tsx (93%) rename mcc/src/client/AnimalRequest/{ => components}/title.tsx (100%) rename mcc/src/client/AnimalRequest/{ => components}/tooltip.tsx (91%) rename mcc/src/client/AnimalRequest/{ => components}/values.ts (93%) rename mcc/src/client/AnimalRequest/{ => components}/yes-no-radio.tsx (100%) create mode 100644 mcc/src/client/RequestReview/app.tsx create mode 100644 mcc/src/client/RequestReview/components/InternalReviewForm.tsx create mode 100644 mcc/src/client/RequestReview/components/RabReviewForm.tsx create mode 100644 mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx create mode 100644 mcc/src/client/RequestReview/request-review.tsx create mode 100644 mcc/src/client/components/RequestUtils.tsx create mode 100644 mcc/src/client/labkeyOverrides.css rename mcc/src/client/{AnimalRequest => }/tailwind.config.js (100%) rename mcc/src/client/{AnimalRequest => }/tailwind.css (100%) create mode 100644 mcc/src/org/labkey/mcc/MccMaintenanceTask.java create mode 100644 mcc/src/org/labkey/mcc/query/AbstractMccDisplayColumn.java create mode 100644 mcc/src/org/labkey/mcc/query/AnimalRequestActionsDisplayColumnFactory.java create mode 100644 mcc/src/org/labkey/mcc/query/MccRequest.java create mode 100644 mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java create mode 100644 mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java diff --git a/mGAP/resources/queries/mGAP/subjectsSource.sql b/mGAP/resources/queries/mGAP/subjectsSource.sql index d30fba46d..e81d5be2b 100644 --- a/mGAP/resources/queries/mGAP/subjectsSource.sql +++ b/mGAP/resources/queries/mGAP/subjectsSource.sql @@ -3,6 +3,8 @@ SELECT coalesce(s.gender, d.gender) as gender, coalesce(s.species, d.species) as species, coalesce(s.geographic_origin, d.geographic_origin) as geographic_origin, +-- TODO: geographic origin score + CASE WHEN d.center IS NOT NULL THEN d.center WHEN s.subjectname IS NOT NULL THEN 'ONPRC' diff --git a/mGAP/resources/views/phenotypes.html b/mGAP/resources/views/phenotypes.html index 5b200d4e6..ee3ecc037 100644 --- a/mGAP/resources/views/phenotypes.html +++ b/mGAP/resources/views/phenotypes.html @@ -41,8 +41,7 @@ ['No Genetic Association Reported','Cardiovascular Phenotypes','Ueda, et al. 2019','https://www.ncbi.nlm.nih.gov/pubmed/30723724'], ['Genetic Association Reported','Retinal Disease','Moshiri, et al. 2019','https://www.ncbi.nlm.nih.gov/pubmed/30667376'], ['Genetic Association Reported','Bardet-Biedl Syndrome','Peterson, et al. 2019','https://www.ncbi.nlm.nih.gov/pubmed/31589838'], - ['Genetic Association Reported','Epidermolysis Bullosa','Johnson, et al. 2019',''] - + ['Genetic Association Reported','Epidermolysis Bullosa','Johnson, et al. 2019','https://www.ncbi.nlm.nih.gov/pubmed/32096448'] ]; var dataMap = {}; diff --git a/mcc/package-lock.json b/mcc/package-lock.json index fd1d6c276..567994462 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -9,16 +9,20 @@ "version": "0.0.0", "dependencies": { "@labkey/api": "^1.8.0", + "@labkey/components": "2.157.0", + "@material-ui/core": "^4.12.4", + "@material-ui/styles": "^4.11.5", "chart.js": "^3.7.0", - "nanoid": "^3.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-hot-loader": "^4.13.0", - "react-tooltip": "^4.2.21" + "react-tooltip": "^4.2.21", + "uuid": "^8.3.2" }, "devDependencies": { "@labkey/build": "^5.0.0", "@types/jest": "^27.4.0", + "@types/uuid": "^8.3.4", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.6", "jest": "^27.4.7", @@ -30,7 +34,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, "dependencies": { "@babel/highlight": "^7.14.5" }, @@ -42,7 +45,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -51,7 +53,6 @@ "version": "7.14.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.14.3", @@ -81,7 +82,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -90,7 +90,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", - "dev": true, "dependencies": { "@babel/types": "^7.15.0", "jsesc": "^2.5.1", @@ -129,7 +128,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", @@ -147,7 +145,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -232,7 +229,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dev": true, "dependencies": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -246,7 +242,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -258,7 +253,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -270,7 +264,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", - "dev": true, "dependencies": { "@babel/types": "^7.15.0" }, @@ -282,7 +275,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -294,7 +286,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.15.0", @@ -313,7 +304,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -325,7 +315,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -348,7 +337,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", - "dev": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.15.0", "@babel/helper-optimise-call-expression": "^7.14.5", @@ -363,7 +351,6 @@ "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", - "dev": true, "dependencies": { "@babel/types": "^7.14.8" }, @@ -387,7 +374,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -399,7 +385,6 @@ "version": "7.14.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -408,7 +393,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -432,7 +416,6 @@ "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", - "dev": true, "dependencies": { "@babel/template": "^7.14.5", "@babel/traverse": "^7.15.0", @@ -446,7 +429,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -460,7 +442,6 @@ "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -830,7 +811,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1693,10 +1673,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", - "dev": true, + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1704,11 +1683,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime-corejs2": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.17.9.tgz", + "integrity": "sha512-+QThIsnjVY12uURTvmnW33risFZ7ulq6OWw0VJL08UwiYiWVp9PM63s+W1L2ppajYyKAYKb7afcGYSHzA0k04Q==", + "dependencies": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", "@babel/parser": "^7.14.5", @@ -1722,7 +1712,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", "@babel/generator": "^7.15.0", @@ -1742,7 +1731,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" @@ -1766,6 +1754,362 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "node_modules/@emotion/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", + "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/core/node_modules/@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "dependencies": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, + "node_modules/@emotion/core/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/core/node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@emotion/core/node_modules/@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + }, + "node_modules/@emotion/core/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/@emotion/core/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/@emotion/css": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "dependencies": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + } + }, + "node_modules/@emotion/css/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/css/node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@emotion/css/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/@emotion/css/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "node_modules/@emotion/react": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "node_modules/@emotion/styled": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", + "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", + "dependencies": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + }, + "peerDependencies": { + "@emotion/core": "^10.0.27", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/styled-base": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", + "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + }, + "peerDependencies": { + "@emotion/core": "^10.0.28", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/styled-base/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/styled-base/node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@emotion/styled-base/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/@emotion/styled-base/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.15.tgz", + "integrity": "sha512-/HFHdcoLESxxMkqZAcZ6RXDJ69pVApwdwRos/B2kiMWxDSAX2dFK8Er2/+rG+RsrzWB/dsAyjefLmemgmfE18g==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "react": ">=16.x" + } + }, + "node_modules/@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2439,9 +2783,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.8.0", - "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.8.0.tgz", - "integrity": "sha1-DiGjCOphC25lFsGwX3BC7kGmhlc=", + "version": "1.10.0", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.10.0.tgz", + "integrity": "sha1-+n1L8fL1dpJRP0sc0qyjxN2F6GA=", "license": "Apache-2.0" }, "node_modules/@labkey/build": { @@ -2583,6 +2927,367 @@ "node": ">= 8" } }, + "node_modules/@labkey/components": { + "version": "2.157.0", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-2.157.0.tgz", + "integrity": "sha1-N5gCKlitMFruewPoYB/28/8cX8A=", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@fortawesome/fontawesome-free": "5.15.4", + "@fortawesome/fontawesome-svg-core": "1.2.36", + "@fortawesome/free-regular-svg-icons": "5.15.4", + "@fortawesome/free-solid-svg-icons": "5.15.4", + "@fortawesome/react-fontawesome": "0.1.15", + "@labkey/api": "1.10.0", + "bootstrap": "3.4.1", + "classnames": "2.3.1", + "font-awesome": "4.7.0", + "formsy-react": "1.1.5", + "formsy-react-components": "1.1.0", + "history": "4.7.2", + "immer": "9.0.6", + "immutable": "3.8.2", + "jquery": "3.6.0", + "moment": "2.27.0", + "moment-jdateformatparser": "1.1.0", + "moment-timezone": "0.5.31", + "normalizr": "3.6.1", + "numeral": "2.0.6", + "react": "16.14.0", + "react-beautiful-dnd": "13.1.0", + "react-bootstrap": "0.33.1", + "react-bootstrap-toggle": "2.3.2", + "react-color": "2.19.3", + "react-datepicker": "4.2.1", + "react-dom": "16.14.0", + "react-redux": "5.1.0", + "react-router": "3.2.6", + "react-select": "4.3.1", + "react-sticky": "6.0.3", + "react-treebeard": "3.2.4", + "reactn": "2.2.7", + "redux-actions": "2.3.2", + "use-immer": "0.6.0", + "vis-network": "6.5.2" + }, + "peerDependencies": { + "immutable": "^3.8.2", + "jquery": "^3.4.1", + "react": "^16.0", + "react-bootstrap": "^0.33.1", + "react-dom": "^16.0", + "reactn": "^2.2.7" + } + }, + "node_modules/@labkey/components/node_modules/formsy-react": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/formsy-react/-/formsy-react-1.1.5.tgz", + "integrity": "sha512-nNWe4Vbp6aDQ/zSxJ7gVQgD5+avFRVbydcjA2Om42flxpQFrKE54AAbuyEj3Jvv+2b9LVl+WLMAPalyvLjwNcQ==", + "dependencies": { + "form-data-to-object": "^0.2.0", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^15.6.1 || ^16.0.0", + "react-dom": "^15.6.1 || ^16.0.0" + } + }, + "node_modules/@labkey/components/node_modules/formsy-react-components": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/formsy-react-components/-/formsy-react-components-1.1.0.tgz", + "integrity": "sha512-GUgnIqXbXNPf7auP4nwk5PF6477r5UhdQoO1aNCvQajLarUu/Jj8PaxTCHu56tNGSlewACqRV44m8MrYOMzdTQ==", + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "formsy-react": "^1.1.0", + "react": "^15.6.1 || ^16.0.0" + } + }, + "node_modules/@labkey/components/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@labkey/components/node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/@labkey/components/node_modules/react-redux": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.0.tgz", + "integrity": "sha512-CRMpEx8+ccpoVxQrQDkG1obExNYpj6dZ1Ni7lUNFB9wcxOhy02tIqpFo4IUXc0kYvCGMu6ABj9A4imEX2VGZJQ==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "hoist-non-react-statics": "^3.0.0", + "invariant": "^2.2.4", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.1", + "react-is": "^16.6.0", + "react-lifecycles-compat": "^3.0.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0", + "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@labkey/components/node_modules/react-router": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.6.tgz", + "integrity": "sha512-nlxtQE8B22hb/JxdaslI1tfZacxFU8x8BJryXOnR2RxB4vc01zuHYAHAIgmBkdk1kzXaA25hZxK6KAH/+CXArw==", + "dependencies": { + "create-react-class": "^15.5.1", + "history": "^3.0.0", + "hoist-non-react-statics": "^3.3.2", + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.0", + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@labkey/components/node_modules/react-router/node_modules/history": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz", + "integrity": "sha1-/O3M6PEpdTcVRdc1RhAzV5ptrpw=", + "dependencies": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "query-string": "^4.2.2", + "warning": "^3.0.0" + } + }, + "node_modules/@labkey/components/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/@labkey/components/node_modules/vis-data": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-6.6.1.tgz", + "integrity": "sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "moment": "^2.24.0", + "uuid": "^7.0.0 || ^8.0.0", + "vis-util": "^4.0.0" + } + }, + "node_modules/@labkey/components/node_modules/vis-network": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-6.5.2.tgz", + "integrity": "sha512-Dj5oEtZMUWuhq7D7dwdmxmtJgrK3kwfV4Ov/ePSrhPZgNdJlXzpeDZU/Eq0pKGyOAPLClemgVImc0bZpZ4Yafw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "keycharm": "^0.2.0", + "moment": "^2.24.0", + "vis-data": "^6.2.1", + "vis-util": "^1.1.8" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/@material-ui/core/node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2618,6 +3323,15 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -2782,6 +3496,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", @@ -2864,8 +3587,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { "version": "2.4.3", @@ -2876,8 +3598,7 @@ "node_modules/@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -2891,12 +3612,46 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/react": { + "version": "16.14.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.25.tgz", + "integrity": "sha512-cXRVHd7vBT5v1is72mmvmsg9stZrbJO04DJqFeh3Yj2tVKO6vmxg5BI+ybI6Ls7ROXRG3aFbZj9x0WA3ZAoDQw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.24", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", + "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -2931,6 +3686,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", @@ -3391,7 +4152,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -3726,6 +4486,50 @@ "object.assign": "^4.1.0" } }, + "node_modules/babel-plugin-emotion": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", + "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-plugin-emotion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/babel-plugin-emotion/node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/babel-plugin-emotion/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/babel-plugin-emotion/node_modules/csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -3757,6 +4561,16 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", @@ -3805,6 +4619,11 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -3959,6 +4778,14 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "engines": { + "node": ">=6" + } + }, "node_modules/bootstrap-sass": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", @@ -3997,7 +4824,6 @@ "version": "4.16.7", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", - "dev": true, "dependencies": { "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", @@ -4062,7 +4888,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -4075,7 +4900,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -4117,14 +4941,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/caseless": { "version": "0.12.0", @@ -4136,7 +4965,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4257,6 +5085,11 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "node_modules/clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -4356,6 +5189,14 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4385,7 +5226,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -4393,14 +5233,12 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -4549,7 +5387,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } @@ -4574,7 +5411,6 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, "hasInstallScript": true }, "node_modules/core-js-compat": { @@ -4610,7 +5446,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4622,6 +5457,15 @@ "node": ">=8" } }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "dependencies": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -4666,6 +5510,14 @@ "urix": "^0.1.0" } }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, "node_modules/css-loader": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", @@ -4757,6 +5609,15 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "node_modules/css-what": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", @@ -4817,8 +5678,7 @@ "node_modules/csstype": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==", - "dev": true + "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" }, "node_modules/d": { "version": "1.0.1", @@ -4856,11 +5716,22 @@ "node": ">=10" } }, + "node_modules/date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -4929,7 +5800,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -4982,7 +5852,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "dependencies": { "object-keys": "^1.0.12" }, @@ -5118,6 +5987,14 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", @@ -5228,8 +6105,7 @@ "node_modules/electron-to-chromium": { "version": "1.3.803", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.803.tgz", - "integrity": "sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q==", - "dev": true + "integrity": "sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q==" }, "node_modules/emittery": { "version": "0.8.1", @@ -5462,7 +6338,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -5560,7 +6435,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -5575,7 +6449,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -6012,6 +6885,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6045,6 +6923,14 @@ } } }, + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", + "engines": { + "node": ">=0.10.3" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6196,6 +7082,11 @@ "node": ">= 0.12" } }, + "node_modules/form-data-to-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data-to-object/-/form-data-to-object-0.2.0.tgz", + "integrity": "sha1-96jmjd2RChEApl4lrGpIQUP/gWg=" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6270,8 +7161,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.4", @@ -6332,7 +7222,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -6350,7 +7239,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6466,7 +7354,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -6553,7 +7440,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -6586,7 +7472,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, "engines": { "node": ">=4" } @@ -6595,7 +7480,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6607,7 +7491,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -6633,6 +7516,18 @@ "he": "bin/he" } }, + "node_modules/history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "dependencies": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6919,6 +7814,11 @@ "node": ">=10.17.0" } }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6952,11 +7852,27 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", + "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7044,6 +7960,14 @@ "node": ">= 0.10" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -7063,7 +7987,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7078,8 +8001,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-bigint": { "version": "1.0.1", @@ -7133,7 +8055,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -7145,7 +8066,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7210,6 +8130,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -7292,7 +8217,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9323,6 +10247,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "node_modules/js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -9440,7 +10369,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -9457,8 +10385,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "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==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -9482,7 +10409,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "dependencies": { "minimist": "^1.2.5" }, @@ -9520,6 +10446,99 @@ "node": ">=0.6.0" } }, + "node_modules/jss": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.9.0.tgz", + "integrity": "sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz", + "integrity": "sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.9.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz", + "integrity": "sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz", + "integrity": "sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz", + "integrity": "sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz", + "integrity": "sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz", + "integrity": "sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz", + "integrity": "sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.9.0" + } + }, + "node_modules/keycharm": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.2.0.tgz", + "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=", + "peer": true + }, + "node_modules/keycode": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9572,8 +10591,7 @@ "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "node_modules/loader-runner": { "version": "4.2.0", @@ -9623,8 +10641,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -9739,6 +10761,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9760,6 +10787,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -10036,6 +11068,33 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-jdateformatparser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/moment-jdateformatparser/-/moment-jdateformatparser-1.1.0.tgz", + "integrity": "sha1-TGuuM+IJDONS05uHfpsxcJkoscc=", + "dependencies": { + "moment": ">=1.5.0" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/moo": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", @@ -10045,8 +11104,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -10077,6 +11135,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10206,8 +11265,7 @@ "node_modules/node-releases": { "version": "1.1.74", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", - "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==", - "dev": true + "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" }, "node_modules/node-sass": { "version": "6.0.1", @@ -10327,6 +11385,11 @@ "node": ">=0.10.0" } }, + "node_modules/normalizr": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.1.tgz", + "integrity": "sha512-8iEmqXmPtll8PwbEFrbPoDxVw7MKnNvt3PZzR2Xvq9nggEEOgBlNICPXYzyZ4w4AkHUzCU998mdatER3n2VaMA==" + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -10372,6 +11435,14 @@ "node": ">=0.10.0" } }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", + "engines": { + "node": "*" + } + }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -10408,7 +11479,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -10424,7 +11494,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -10660,7 +11729,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -10672,7 +11740,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -10750,8 +11817,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -10763,7 +11829,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -10771,8 +11836,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "node_modules/picomatch": { "version": "2.3.1", @@ -10807,6 +11871,11 @@ "node": ">=8" } }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -11034,6 +12103,26 @@ "reflect.ownkeys": "^0.2.0" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "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", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -11080,6 +12169,18 @@ "node": ">=0.6" } }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11113,11 +12214,15 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, "dependencies": { "performance-now": "^2.1.0" } }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -11191,6 +12296,95 @@ "node": ">=0.10.0" } }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0", + "react-dom": "^16.8.5 || ^17.0.0" + } + }, + "node_modules/react-bootstrap": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz", + "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==", + "dependencies": { + "@babel/runtime-corejs2": "^7.0.0", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "prop-types": "^15.6.1", + "prop-types-extra": "^1.0.1", + "react-overlays": "^0.9.0", + "react-prop-types": "^0.4.0", + "react-transition-group": "^2.0.0", + "uncontrollable": "^7.0.2", + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-bootstrap-toggle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/react-bootstrap-toggle/-/react-bootstrap-toggle-2.3.2.tgz", + "integrity": "sha512-OPoPt+z0uu0Y96RXJ57Hq71VJna+RVtCviRsAMu/5OFS7bO80qVhoASuxK/kNsclSrSpHAaBfygHjpf6sd6CLQ==", + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.5.10", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "dependencies": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-datepicker": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.2.1.tgz", + "integrity": "sha512-0gcvHMnX8rS1fV90PjjsB7MQdsWNU77JeVHf6bbwK9HnFxgwjVflTx40ebKmHV+leqe+f+FgUP9Nvqbe5RGyfA==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.0.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.10.0", + "react-popper": "^2.2.5" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17", + "react-dom": "^16.9.0 || ^17" + } + }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -11204,6 +12398,11 @@ "react": "17.0.2" } }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, "node_modules/react-hot-loader": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz", @@ -11240,6 +12439,17 @@ "node": ">= 8" } }, + "node_modules/react-input-autosize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -11250,6 +12460,152 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-onclickoutside": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", + "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x", + "react-dom": "^15.5.x || ^16.x || ^17.x" + } + }, + "node_modules/react-overlays": { + "version": "0.9.3", + "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", + "dom-helpers": "^3.2.1", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-transition-group": "^2.2.1", + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-popper": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", + "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17" + } + }, + "node_modules/react-popper/node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/react-prop-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "dependencies": { + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/react-redux": { + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-select": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", + "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.1.1", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-input-autosize": "^3.0.0", + "react-transition-group": "^4.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/react-select/node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/react-select/node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-sticky": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.3.tgz", + "integrity": "sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==", + "dependencies": { + "prop-types": "^15.5.8", + "raf": "^3.3.0" + }, + "peerDependencies": { + "react": ">=15", + "react-dom": ">=15" + } + }, "node_modules/react-tooltip": { "version": "4.2.21", "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz", @@ -11274,6 +12630,76 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/react-transition-group": { + "version": "2.9.0", + "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", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/react-treebeard": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-3.2.4.tgz", + "integrity": "sha512-TsvdUq2kbLavRXa8k4mmqfPse8HmSA9G9s1SZUtIpiYSccSwa0Tm6miMgx7DZ5gpKofQ+j/3Ua0rjsahM3/FQg==", + "dependencies": { + "@emotion/core": "^10.0.10", + "@emotion/styled": "^10.0.10", + "deep-equal": "^1.0.1", + "shallowequal": "^1.1.0", + "velocity-react": "^1.4.1" + }, + "peerDependencies": { + "@babel/runtime": ">=7.0.0", + "@emotion/styled": "^10.0.10", + "prop-types": ">=15.7.2", + "react": ">=16.7.0", + "react-dom": ">=16.7.0" + } + }, + "node_modules/react-treebeard/node_modules/velocity-react": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.3.tgz", + "integrity": "sha512-zvefGm85A88S3KdF9/dz5vqyFLAiwKYlXGYkHH2EbXl+CZUD1OT0a0aS1tkX/WXWTa/FUYqjBaAzAEFYuSobBQ==", + "dependencies": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-transition-group": "^2.0.0", + "velocity-animate": "^1.4.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0", + "react-dom": "^15.3.0 || ^16.0.0" + } + }, + "node_modules/reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "dependencies": { + "lodash": "^4.0.1" + } + }, + "node_modules/reactn": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/reactn/-/reactn-2.2.7.tgz", + "integrity": "sha512-cqnt23kWN/ABqEZhW3OlpqI1DgTaaNDeHpSHtyd81qk0H1jd32zPTzJ69Hpzti2WakwNYveGFPIgI6i7E7nXOA==", + "dependencies": { + "use-force-update": "^1.0.5" + }, + "peerDependencies": { + "@types/react": "^16.8.0", + "react": "*", + "react-dom": "*" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -11393,6 +12819,30 @@ "node": ">=8" } }, + "node_modules/reduce-reducers": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.1.5.tgz", + "integrity": "sha512-uoVmQnZQ+BtKKDKpBdbBri5SLNyIK9ULZGOA504++VbHcwouWE+fJDIo8AuESPF9/EYSkI0v05LDEQK6stCbTA==" + }, + "node_modules/redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-actions": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-2.3.2.tgz", + "integrity": "sha512-PPclrJFIbDzD48oNj46biisg34NTtb1VxP9MTTAxsgIFuV4mEe5UXLRNBwyqrlXrMQHUbmpnjJupxocS4mxpvA==", + "dependencies": { + "invariant": "^2.2.1", + "lodash": "^4.13.1", + "lodash-es": "^4.17.4", + "reduce-reducers": "^0.1.0" + } + }, "node_modules/reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", @@ -11420,8 +12870,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -11442,7 +12891,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -11552,6 +13000,16 @@ "node": ">= 6" } }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11582,11 +13040,15 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -11620,11 +13082,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } }, + "node_modules/resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -11833,8 +13299,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -12201,15 +13666,6 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -12220,7 +13676,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12428,6 +13883,14 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -12642,11 +14105,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -12907,6 +14374,24 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -12917,7 +14402,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, "engines": { "node": ">=4" } @@ -13167,6 +14651,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -13241,6 +14739,28 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, + "node_modules/use-force-update": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.7.tgz", + "integrity": "sha512-k5dppYhO+I5X/cd7ildbrzeMZJkWwdAh5adaIk0qKN2euh7J0h2GBGBcB4QZ385eyHHnp7LIygvebdRx3XKdwA==" + }, + "node_modules/use-immer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.6.0.tgz", + "integrity": "sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ==", + "peerDependencies": { + "immer": ">=2.0.0", + "react": "^16.8.0 || ^17.0.1" + } + }, + "node_modules/use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -13263,13 +14783,11 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -13305,6 +14823,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -13314,6 +14837,11 @@ "node": ">= 0.8" } }, + "node_modules/velocity-animate": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.2.tgz", + "integrity": "sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==" + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -13328,6 +14856,19 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vis-util": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-4.3.4.tgz", + "integrity": "sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -13358,6 +14899,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -14040,7 +15589,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -14169,7 +15717,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, "requires": { "@babel/highlight": "^7.14.5" } @@ -14177,14 +15724,12 @@ "@babel/compat-data": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", - "dev": true + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" }, "@babel/core": { "version": "7.14.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.14.3", @@ -14206,8 +15751,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -14215,7 +15759,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", - "dev": true, "requires": { "@babel/types": "^7.15.0", "jsesc": "^2.5.1", @@ -14245,7 +15788,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", - "dev": true, "requires": { "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", @@ -14256,8 +15798,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -14322,7 +15863,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -14333,7 +15873,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -14342,7 +15881,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -14351,7 +15889,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", - "dev": true, "requires": { "@babel/types": "^7.15.0" } @@ -14360,7 +15897,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -14369,7 +15905,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.15.0", @@ -14385,7 +15920,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -14393,8 +15927,7 @@ "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, "@babel/helper-remap-async-to-generator": { "version": "7.14.5", @@ -14411,7 +15944,6 @@ "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", - "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.15.0", "@babel/helper-optimise-call-expression": "^7.14.5", @@ -14423,7 +15955,6 @@ "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", - "dev": true, "requires": { "@babel/types": "^7.14.8" } @@ -14441,7 +15972,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -14449,14 +15979,12 @@ "@babel/helper-validator-identifier": { "version": "7.14.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", - "dev": true + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" }, "@babel/helper-validator-option": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { "version": "7.14.5", @@ -14474,7 +16002,6 @@ "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", - "dev": true, "requires": { "@babel/template": "^7.14.5", "@babel/traverse": "^7.15.0", @@ -14485,7 +16012,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -14495,8 +16021,7 @@ "@babel/parser": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", - "dev": true + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.14.5", @@ -14743,7 +16268,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -15330,64 +16854,377 @@ "@babel/plugin-transform-typescript": "^7.13.0" } }, - "@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", - "dev": true, + "@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs2": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.17.9.tgz", + "integrity": "sha512-+QThIsnjVY12uURTvmnW33risFZ7ulq6OWw0VJL08UwiYiWVp9PM63s+W1L2ppajYyKAYKb7afcGYSHzA0k04Q==", + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@emotion/babel-plugin": { + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + } + }, + "@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "@emotion/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", + "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + }, + "dependencies": { + "@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "requires": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, + "@emotion/css": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "requires": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + } + } + }, + "@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "@emotion/react": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "@emotion/styled": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", + "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", + "requires": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/styled-base": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", + "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + }, + "@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "requires": { - "regenerator-runtime": "^0.13.4" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, + "@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", - "dev": true, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", - "dev": true, + "@fortawesome/react-fontawesome": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.15.tgz", + "integrity": "sha512-/HFHdcoLESxxMkqZAcZ6RXDJ69pVApwdwRos/B2kiMWxDSAX2dFK8Er2/+rG+RsrzWB/dsAyjefLmemgmfE18g==", "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" + "prop-types": "^15.7.2" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@discoveryjs/json-ext": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", - "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", - "dev": true + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "requires": {} }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -15898,9 +17735,9 @@ } }, "@labkey/api": { - "version": "1.8.0", - "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.8.0.tgz", - "integrity": "sha1-DiGjCOphC25lFsGwX3BC7kGmhlc=" + "version": "1.10.0", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.10.0.tgz", + "integrity": "sha1-+n1L8fL1dpJRP0sc0qyjxN2F6GA=" }, "@labkey/build": { "version": "5.0.0", @@ -16017,6 +17854,259 @@ } } }, + "@labkey/components": { + "version": "2.157.0", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-2.157.0.tgz", + "integrity": "sha1-N5gCKlitMFruewPoYB/28/8cX8A=", + "requires": { + "@fortawesome/fontawesome-free": "5.15.4", + "@fortawesome/fontawesome-svg-core": "1.2.36", + "@fortawesome/free-regular-svg-icons": "5.15.4", + "@fortawesome/free-solid-svg-icons": "5.15.4", + "@fortawesome/react-fontawesome": "0.1.15", + "@labkey/api": "1.10.0", + "bootstrap": "3.4.1", + "classnames": "2.3.1", + "font-awesome": "4.7.0", + "formsy-react": "1.1.5", + "formsy-react-components": "1.1.0", + "history": "4.7.2", + "immer": "9.0.6", + "immutable": "3.8.2", + "jquery": "3.6.0", + "moment": "2.27.0", + "moment-jdateformatparser": "1.1.0", + "moment-timezone": "0.5.31", + "normalizr": "3.6.1", + "numeral": "2.0.6", + "react": "16.14.0", + "react-beautiful-dnd": "13.1.0", + "react-bootstrap": "0.33.1", + "react-bootstrap-toggle": "2.3.2", + "react-color": "2.19.3", + "react-datepicker": "4.2.1", + "react-dom": "16.14.0", + "react-redux": "5.1.0", + "react-router": "3.2.6", + "react-select": "4.3.1", + "react-sticky": "6.0.3", + "react-treebeard": "3.2.4", + "reactn": "2.2.7", + "redux-actions": "2.3.2", + "use-immer": "0.6.0", + "vis-network": "6.5.2" + }, + "dependencies": { + "formsy-react": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/formsy-react/-/formsy-react-1.1.5.tgz", + "integrity": "sha512-nNWe4Vbp6aDQ/zSxJ7gVQgD5+avFRVbydcjA2Om42flxpQFrKE54AAbuyEj3Jvv+2b9LVl+WLMAPalyvLjwNcQ==", + "requires": { + "form-data-to-object": "^0.2.0", + "prop-types": "^15.5.10" + } + }, + "formsy-react-components": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/formsy-react-components/-/formsy-react-components-1.1.0.tgz", + "integrity": "sha512-GUgnIqXbXNPf7auP4nwk5PF6477r5UhdQoO1aNCvQajLarUu/Jj8PaxTCHu56tNGSlewACqRV44m8MrYOMzdTQ==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.5.10" + } + }, + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-redux": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.0.tgz", + "integrity": "sha512-CRMpEx8+ccpoVxQrQDkG1obExNYpj6dZ1Ni7lUNFB9wcxOhy02tIqpFo4IUXc0kYvCGMu6ABj9A4imEX2VGZJQ==", + "requires": { + "@babel/runtime": "^7.1.2", + "hoist-non-react-statics": "^3.0.0", + "invariant": "^2.2.4", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.1", + "react-is": "^16.6.0", + "react-lifecycles-compat": "^3.0.0" + } + }, + "react-router": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.6.tgz", + "integrity": "sha512-nlxtQE8B22hb/JxdaslI1tfZacxFU8x8BJryXOnR2RxB4vc01zuHYAHAIgmBkdk1kzXaA25hZxK6KAH/+CXArw==", + "requires": { + "create-react-class": "^15.5.1", + "history": "^3.0.0", + "hoist-non-react-statics": "^3.3.2", + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.0", + "warning": "^3.0.0" + }, + "dependencies": { + "history": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz", + "integrity": "sha1-/O3M6PEpdTcVRdc1RhAzV5ptrpw=", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "query-string": "^4.2.2", + "warning": "^3.0.0" + } + } + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "vis-data": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-6.6.1.tgz", + "integrity": "sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==", + "peer": true, + "requires": {} + }, + "vis-network": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-6.5.2.tgz", + "integrity": "sha512-Dj5oEtZMUWuhq7D7dwdmxmtJgrK3kwfV4Ov/ePSrhPZgNdJlXzpeDZU/Eq0pKGyOAPLClemgVImc0bZpZ4Yafw==", + "requires": {} + } + } + }, + "@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "dependencies": { + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, + "@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, + "@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} + }, + "@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -16043,6 +18133,11 @@ "fastq": "^1.6.0" } }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -16204,6 +18299,15 @@ "@types/node": "*" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/html-minifier-terser": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", @@ -16286,8 +18390,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { "version": "2.4.3", @@ -16298,8 +18401,7 @@ "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/qs": { "version": "6.9.7", @@ -16313,12 +18415,46 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/react": { + "version": "16.14.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.25.tgz", + "integrity": "sha512-cXRVHd7vBT5v1is72mmvmsg9stZrbJO04DJqFeh3Yj2tVKO6vmxg5BI+ybI6Ls7ROXRG3aFbZj9x0WA3ZAoDQw==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-redux": { + "version": "7.1.24", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", + "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "requires": { + "@types/react": "*" + } + }, "@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -16353,6 +18489,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, "@types/ws": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", @@ -16738,7 +18880,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -17004,6 +19145,52 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-emotion": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", + "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "csstype": { + "version": "2.6.20", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", + "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" + } + } + }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -17029,6 +19216,16 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, "babel-plugin-polyfill-corejs2": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", @@ -17067,6 +19264,11 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -17196,6 +19398,11 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + }, "bootstrap-sass": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", @@ -17231,7 +19438,6 @@ "version": "4.16.7", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", @@ -17280,7 +19486,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -17289,8 +19494,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -17320,10 +19524,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", - "dev": true + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" }, "caseless": { "version": "0.12.0", @@ -17335,7 +19538,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -17432,6 +19634,11 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -17511,6 +19718,11 @@ "shallow-clone": "^3.0.0" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -17533,7 +19745,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -17541,14 +19752,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "combined-stream": { "version": "1.0.8", @@ -17666,7 +19875,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -17686,8 +19894,7 @@ "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { "version": "3.16.1", @@ -17717,7 +19924,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -17726,6 +19932,15 @@ "yaml": "^1.7.2" } }, + "create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -17766,6 +19981,14 @@ } } }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, "css-loader": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", @@ -17830,6 +20053,15 @@ "nth-check": "^2.0.0" } }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", @@ -17868,8 +20100,7 @@ "csstype": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==", - "dev": true + "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" }, "d": { "version": "1.0.1", @@ -17901,11 +20132,15 @@ "whatwg-url": "^8.0.0" } }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -17956,7 +20191,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -17997,7 +20231,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -18109,6 +20342,14 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", @@ -18197,8 +20438,7 @@ "electron-to-chromium": { "version": "1.3.803", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.803.tgz", - "integrity": "sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q==", - "dev": true + "integrity": "sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q==" }, "emittery": { "version": "0.8.1", @@ -18378,7 +20618,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -18463,8 +20702,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -18475,8 +20713,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "2.0.0", @@ -18821,6 +21058,11 @@ "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -18837,6 +21079,11 @@ "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -18946,6 +21193,11 @@ "mime-types": "^2.1.12" } }, + "form-data-to-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data-to-object/-/form-data-to-object-0.2.0.tgz", + "integrity": "sha1-96jmjd2RChEApl4lrGpIQUP/gWg=" + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -19001,8 +21253,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.4", @@ -19050,8 +21301,7 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", @@ -19063,7 +21313,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -19148,8 +21397,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "11.1.0", @@ -19214,7 +21462,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -19237,20 +21484,17 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -19267,6 +21511,18 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -19496,6 +21752,11 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -19518,11 +21779,20 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "immer": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", + "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==" + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -19583,6 +21853,14 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -19599,7 +21877,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -19608,8 +21885,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { "version": "1.0.1", @@ -19645,7 +21921,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -19653,8 +21928,7 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-docker": { "version": "2.2.1", @@ -19692,6 +21966,11 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -19747,7 +22026,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -21264,6 +23542,11 @@ } } }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -21359,8 +23642,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -21371,8 +23653,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "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==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -21396,7 +23677,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -21423,6 +23703,95 @@ "verror": "1.10.0" } }, + "jss": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.9.0.tgz", + "integrity": "sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz", + "integrity": "sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.9.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz", + "integrity": "sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "jss-plugin-global": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz", + "integrity": "sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "jss-plugin-nested": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz", + "integrity": "sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz", + "integrity": "sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz", + "integrity": "sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.9.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz", + "integrity": "sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.9.0" + } + }, + "keycharm": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.2.0.tgz", + "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=", + "peer": true + }, + "keycode": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -21460,8 +23829,7 @@ "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "loader-runner": { "version": "4.2.0", @@ -21501,8 +23869,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.debounce": { "version": "4.0.8", @@ -21598,6 +23970,11 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -21613,6 +23990,11 @@ "fs-monkey": "1.0.3" } }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -21816,6 +24198,27 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-jdateformatparser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/moment-jdateformatparser/-/moment-jdateformatparser-1.1.0.tgz", + "integrity": "sha1-TGuuM+IJDONS05uHfpsxcJkoscc=", + "requires": { + "moment": ">=1.5.0" + } + }, + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "requires": { + "moment": ">= 2.9.0" + } + }, "moo": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", @@ -21825,8 +24228,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -21853,7 +24255,8 @@ "nanoid": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -21953,8 +24356,7 @@ "node-releases": { "version": "1.1.74", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", - "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==", - "dev": true + "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" }, "node-sass": { "version": "6.0.1", @@ -22044,6 +24446,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalizr": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.1.tgz", + "integrity": "sha512-8iEmqXmPtll8PwbEFrbPoDxVw7MKnNvt3PZzR2Xvq9nggEEOgBlNICPXYzyZ4w4AkHUzCU998mdatER3n2VaMA==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -22080,6 +24487,11 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=" + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -22107,7 +24519,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -22116,8 +24527,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", @@ -22287,7 +24697,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -22296,7 +24705,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -22356,8 +24764,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -22368,14 +24775,12 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.3.1", @@ -22398,6 +24803,11 @@ "find-up": "^4.0.0" } }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -22572,6 +24982,25 @@ "reflect.ownkeys": "^0.2.0" } }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "dependencies": { + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -22608,6 +25037,15 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -22624,11 +25062,15 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, "requires": { "performance-now": "^2.1.0" } }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -22689,6 +25131,76 @@ "object-assign": "^4.1.1" } }, + "react-beautiful-dnd": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz", + "integrity": "sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, + "react-bootstrap": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz", + "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==", + "requires": { + "@babel/runtime-corejs2": "^7.0.0", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "prop-types": "^15.6.1", + "prop-types-extra": "^1.0.1", + "react-overlays": "^0.9.0", + "react-prop-types": "^0.4.0", + "react-transition-group": "^2.0.0", + "uncontrollable": "^7.0.2", + "warning": "^3.0.0" + } + }, + "react-bootstrap-toggle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/react-bootstrap-toggle/-/react-bootstrap-toggle-2.3.2.tgz", + "integrity": "sha512-OPoPt+z0uu0Y96RXJ57Hq71VJna+RVtCviRsAMu/5OFS7bO80qVhoASuxK/kNsclSrSpHAaBfygHjpf6sd6CLQ==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.5.10", + "resize-observer-polyfill": "^1.5.0" + } + }, + "react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "react-datepicker": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.2.1.tgz", + "integrity": "sha512-0gcvHMnX8rS1fV90PjjsB7MQdsWNU77JeVHf6bbwK9HnFxgwjVflTx40ebKmHV+leqe+f+FgUP9Nvqbe5RGyfA==", + "requires": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.0.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.10.0", + "react-popper": "^2.2.5" + } + }, "react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -22699,6 +25211,11 @@ "scheduler": "^0.20.2" } }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, "react-hot-loader": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz", @@ -22721,6 +25238,14 @@ } } }, + "react-input-autosize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "requires": { + "prop-types": "^15.5.8" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -22731,6 +25256,117 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-onclickoutside": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", + "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==", + "requires": {} + }, + "react-overlays": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz", + "integrity": "sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ==", + "requires": { + "classnames": "^2.2.5", + "dom-helpers": "^3.2.1", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-transition-group": "^2.2.1", + "warning": "^3.0.0" + } + }, + "react-popper": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", + "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "dependencies": { + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "react-prop-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "requires": { + "warning": "^3.0.0" + } + }, + "react-redux": { + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "react-select": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", + "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.1.1", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-input-autosize": "^3.0.0", + "react-transition-group": "^4.3.0" + }, + "dependencies": { + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, + "react-sticky": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.3.tgz", + "integrity": "sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==", + "requires": { + "prop-types": "^15.5.8", + "raf": "^3.3.0" + } + }, "react-tooltip": { "version": "4.2.21", "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz", @@ -22747,6 +25383,58 @@ } } }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "react-treebeard": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-3.2.4.tgz", + "integrity": "sha512-TsvdUq2kbLavRXa8k4mmqfPse8HmSA9G9s1SZUtIpiYSccSwa0Tm6miMgx7DZ5gpKofQ+j/3Ua0rjsahM3/FQg==", + "requires": { + "@emotion/core": "^10.0.10", + "@emotion/styled": "^10.0.10", + "deep-equal": "^1.0.1", + "shallowequal": "^1.1.0", + "velocity-react": "^1.4.1" + }, + "dependencies": { + "velocity-react": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.3.tgz", + "integrity": "sha512-zvefGm85A88S3KdF9/dz5vqyFLAiwKYlXGYkHH2EbXl+CZUD1OT0a0aS1tkX/WXWTa/FUYqjBaAzAEFYuSobBQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-transition-group": "^2.0.0", + "velocity-animate": "^1.4.0" + } + } + } + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, + "reactn": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/reactn/-/reactn-2.2.7.tgz", + "integrity": "sha512-cqnt23kWN/ABqEZhW3OlpqI1DgTaaNDeHpSHtyd81qk0H1jd32zPTzJ69Hpzti2WakwNYveGFPIgI6i7E7nXOA==", + "requires": { + "use-force-update": "^1.0.5" + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -22843,6 +25531,30 @@ "strip-indent": "^3.0.0" } }, + "reduce-reducers": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.1.5.tgz", + "integrity": "sha512-uoVmQnZQ+BtKKDKpBdbBri5SLNyIK9ULZGOA504++VbHcwouWE+fJDIo8AuESPF9/EYSkI0v05LDEQK6stCbTA==" + }, + "redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-actions": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-2.3.2.tgz", + "integrity": "sha512-PPclrJFIbDzD48oNj46biisg34NTtb1VxP9MTTAxsgIFuV4mEe5UXLRNBwyqrlXrMQHUbmpnjJupxocS4mxpvA==", + "requires": { + "invariant": "^2.2.1", + "lodash": "^4.13.1", + "lodash-es": "^4.17.4", + "reduce-reducers": "^0.1.0" + } + }, "reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", @@ -22867,8 +25579,7 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { "version": "0.14.5", @@ -22889,7 +25600,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -22977,6 +25687,14 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "require-directory": { @@ -23003,11 +25721,15 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -23033,8 +25755,12 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" }, "resolve-url": { "version": "0.2.1", @@ -23193,8 +25919,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -23497,14 +26222,6 @@ "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } } }, "source-list-map": { @@ -23516,8 +26233,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { "version": "0.6.2", @@ -23702,6 +26418,11 @@ } } }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -23852,11 +26573,15 @@ } } }, + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -24037,6 +26762,21 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -24046,8 +26786,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-regex-range": { "version": "5.0.1", @@ -24216,6 +26955,17 @@ "which-boxed-primitive": "^1.0.2" } }, + "uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "requires": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -24271,6 +27021,23 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "use-force-update": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.7.tgz", + "integrity": "sha512-k5dppYhO+I5X/cd7ildbrzeMZJkWwdAh5adaIk0qKN2euh7J0h2GBGBcB4QZ385eyHHnp7LIygvebdRx3XKdwA==" + }, + "use-immer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.6.0.tgz", + "integrity": "sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ==", + "requires": {} + }, + "use-memo-one": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -24290,10 +27057,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-to-istanbul": { "version": "8.1.1", @@ -24324,12 +27090,22 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "velocity-animate": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.2.tgz", + "integrity": "sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -24341,6 +27117,12 @@ "extsprintf": "^1.2.0" } }, + "vis-util": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-4.3.4.tgz", + "integrity": "sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw==", + "peer": true + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -24368,6 +27150,14 @@ "makeerror": "1.0.12" } }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -24867,8 +27657,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "13.3.2", diff --git a/mcc/package.json b/mcc/package.json index 5640dced8..ab785410c 100644 --- a/mcc/package.json +++ b/mcc/package.json @@ -12,16 +12,20 @@ }, "dependencies": { "@labkey/api": "^1.8.0", + "@labkey/components": "2.157.0", "chart.js": "^3.7.0", - "nanoid": "^3.2.0", + "uuid": "^8.3.2", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-hot-loader": "^4.13.0", "react-tooltip": "^4.2.21", - "react-hot-loader": "^4.13.0" + "@material-ui/core": "^4.12.4", + "@material-ui/styles": "^4.11.5" }, "devDependencies": { "@labkey/build": "^5.0.0", "@types/jest": "^27.4.0", + "@types/uuid": "^8.3.4", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.6", "jest": "^27.4.7", diff --git a/mcc/resources/folderTypes/MCC.folderType.xml b/mcc/resources/folderTypes/MCC.folderType.xml index dc2f8a18d..5b3689b43 100644 --- a/mcc/resources/folderTypes/MCC.folderType.xml +++ b/mcc/resources/folderTypes/MCC.folderType.xml @@ -22,6 +22,10 @@ MCC Dashboard Webpart body + + MCC Menu + menu + diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index 2ff66207d..b126b5712 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -12,7 +12,16 @@ function beforeUpdate(row, oldRow, errors){ } function beforeUpsert(row, oldRow, errors) { - row.status = row.status || 'draft' + if (!row.status) { + console.error('Request row being submitted without a status: ' + row.objectid) + } + + row.status = row.status || 'Draft' + + if (!triggerHelper.hasPermission(row.status)) { + errors._form = 'Insufficient permissions to update this request'; + return; + } } function afterInsert(row, errors){ @@ -24,20 +33,65 @@ function afterUpdate(row, oldRow, errors){ } function afterUpsert(row, oldRow, errors) { - if (row.status === 'submitted') { - if (!oldRow || oldRow.status !== 'submitted') { - triggerHelper.sendNotification(row.rowid); - } + if (row.status && row.status !== 'Draft') { + triggerHelper.ensureReviewRecordsCreated(row.objectId, row.status, oldRow ? oldRow.status : null, calculatePreliminaryScore(row)); } } // cascade delete co-i, cohorts: function beforeDelete(row, errors){ + if (!row.status) { + errors._form = 'Request lacks a status, cannot delete'; + return; + } + + if (!triggerHelper.hasPermission(row.status)) { + errors._form = 'Insufficient permissions to delete this request'; + return; + } + if (row.objectid) { triggerHelper.cascadeDelete('mcc', 'coinvestigators', 'requestid', row.objectid); triggerHelper.cascadeDelete('mcc', 'requestcohorts', 'requestid', row.objectid); + + triggerHelper.cascadeDelete('mcc', 'requestreviews', 'requestid', row.objectid); + triggerHelper.cascadeDelete('mcc', 'requestscores', 'requestid', row.objectid); } else { console.error('MCC animalRequests row lacks objectid. row ID: ' + row.rowid); } +} + +function calculatePreliminaryScore(row) { + // NOTE: the initial score is two, such that the final range is 0-10 + var score = 2; + + score += row.earlystageinvestigator ? 1 : 0; + if (row.institutiontype === 'minorityServing' || row.institutiontype === 'university') { + score += 1; + } + else if (row.institutiontype === 'commercial') { + score -= 1; + } + else { + console.error('Unknown MCC institutiontype: ' + row.institutiontype) + } + + if (['nih', 'other-federal', 'start-up', 'foundation'].indexOf(row.fundingsource) !== -1) { + score += 1; + } + else if (row.fundingsource === 'private' || row.fundingsource === 'no-funding') { + // no score change + } + else { + console.error('Unknown MCC fundingsource: ' + row.fundingsource) + } + + score += row.existingnhpfacilities === 'existing' ? 1 : -1; + score += row.existingmarmosetcolony === 'existing' ? 1 : 0; + + //TODO: verify values + score += row.isbreedinganimals ? 1 : 0; + + return score; } \ No newline at end of file diff --git a/mcc/resources/queries/mcc/animalRequests/.qview.xml b/mcc/resources/queries/mcc/animalRequests/.qview.xml index b87e37920..9f5fc4327 100644 --- a/mcc/resources/queries/mcc/animalRequests/.qview.xml +++ b/mcc/resources/queries/mcc/animalRequests/.qview.xml @@ -7,6 +7,7 @@ + diff --git a/mcc/resources/queries/mcc/animalRequests/Detailed.qview.xml b/mcc/resources/queries/mcc/animalRequests/Detailed.qview.xml deleted file mode 100644 index ae436edec..000000000 --- a/mcc/resources/queries/mcc/animalRequests/Detailed.qview.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mcc/resources/queries/mcc/myRequests.sql b/mcc/resources/queries/mcc/myRequests.sql index f17e699ff..e05514bea 100644 --- a/mcc/resources/queries/mcc/myRequests.sql +++ b/mcc/resources/queries/mcc/myRequests.sql @@ -3,8 +3,10 @@ SELECT t.lastname, t.firstname, t.created, + t.createdby, t.status, - t.objectid + t.objectid, + t.actions FROM mcc.animalRequests t WHERE ISMEMBEROF(t.createdby) diff --git a/mcc/resources/queries/mcc/requestReviews.js b/mcc/resources/queries/mcc/requestReviews.js new file mode 100644 index 000000000..8c0b81b5a --- /dev/null +++ b/mcc/resources/queries/mcc/requestReviews.js @@ -0,0 +1,18 @@ +var console = require("console"); +var LABKEY = require("labkey"); + +var triggerHelper = new org.labkey.mcc.query.TriggerHelper(LABKEY.Security.currentUser.id, LABKEY.Security.currentContainer.id); + +function beforeInsert(row, errors){ + beforeUpsert(row, null, errors); +} + +function beforeUpdate(row, oldRow, errors){ + beforeUpsert(row, oldRow, errors); +} + +function beforeUpsert(row, oldRow, errors) { + row.status = row.status || 'draft' + + //TODO: check permissions +} \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestReviews/.qview.xml b/mcc/resources/queries/mcc/requestReviews/.qview.xml new file mode 100644 index 000000000..e873756c1 --- /dev/null +++ b/mcc/resources/queries/mcc/requestReviews/.qview.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores/.qview.xml b/mcc/resources/queries/mcc/requestScores/.qview.xml new file mode 100644 index 000000000..7b28e864d --- /dev/null +++ b/mcc/resources/queries/mcc/requestScores/.qview.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml b/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml new file mode 100644 index 000000000..edd394758 --- /dev/null +++ b/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/queries/study/demographics.query.xml b/mcc/resources/queries/study/demographics.query.xml index 16d276219..d2be9bc01 100644 --- a/mcc/resources/queries/study/demographics.query.xml +++ b/mcc/resources/queries/study/demographics.query.xml @@ -85,6 +85,9 @@ code + + Alternate IDs + diff --git a/mcc/resources/referenceStudy/datasets/datasets_metadata.xml b/mcc/resources/referenceStudy/datasets/datasets_metadata.xml index 5ae113419..57c9fc814 100644 --- a/mcc/resources/referenceStudy/datasets/datasets_metadata.xml +++ b/mcc/resources/referenceStudy/datasets/datasets_metadata.xml @@ -655,6 +655,9 @@ varchar + + varchar + Demographics diff --git a/mcc/resources/schemas/dbscripts/postgresql/mcc-20.008-20.009.sql b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.008-20.009.sql new file mode 100644 index 000000000..2a8da5896 --- /dev/null +++ b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.008-20.009.sql @@ -0,0 +1,38 @@ +CREATE TABLE mcc.requestReviews ( + rowid SERIAL, + reviewerId int, + review varchar(1000), + score int, + comments varchar(4000), + status varchar(1000), + requestid ENTITYID, + + container entityid, + created timestamp, + createdby userid, + modified timestamp, + modifiedby userid, + + CONSTRAINT PK_requestReviews PRIMARY KEY (rowid) +); + +CREATE TABLE mcc.requestScores ( + rowid SERIAL, + preliminaryScore int, + resourceAvailabilityScore varchar(200), + researchAreaPriorityScore varchar(200), + + proposalScore varchar(200), + comments varchar(4000), + requestid ENTITYID, + + container entityid, + created timestamp, + createdby userid, + modified timestamp, + modifiedby userid, + + CONSTRAINT PK_requestScores PRIMARY KEY (rowid) +); + +ALTER TABLE mcc.animalRequests add earlystageinvestigator boolean; \ No newline at end of file diff --git a/mcc/resources/schemas/dbscripts/postgresql/mcc-20.009-20.010.sql b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.009-20.010.sql new file mode 100644 index 000000000..8c3ff857f --- /dev/null +++ b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.009-20.010.sql @@ -0,0 +1,4 @@ +ALTER TABLE mcc.animalRequests drop column isprincipalinvestigator; + +ALTER TABLE mcc.animalRequests DROP COLUMN certify; +ALTER TABLE mcc.animalRequests ADD COLUMN certify boolean; \ No newline at end of file diff --git a/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.008-20.009.sql b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.008-20.009.sql new file mode 100644 index 000000000..b0e079107 --- /dev/null +++ b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.008-20.009.sql @@ -0,0 +1,38 @@ +CREATE TABLE mcc.requestReviews ( + rowid int IDENTITY(1,1), + reviewerId int, + review varchar(1000), + score int, + comments varchar(4000), + status varchar(1000), + requestid ENTITYID, + + container entityid, + created datetime, + createdby userid, + modified datetime, + modifiedby userid, + + CONSTRAINT PK_requestReviews PRIMARY KEY (rowid) +); + +CREATE TABLE mcc.requestScores ( + rowid int IDENTITY(1,1), + preliminaryScore int, + resourceAvailabilityScore varchar(200), + researchAreaPriorityScore varchar(200), + + proposalScore varchar(200), + comments varchar(4000), + requestid ENTITYID, + + container entityid, + created datetime, + createdby userid, + modified datetime, + modifiedby userid, + + CONSTRAINT PK_requestScores PRIMARY KEY (rowid) +); + +ALTER TABLE mcc.animalRequests add earlystageinvestigator bit; diff --git a/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.009-20.010.sql b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.009-20.010.sql new file mode 100644 index 000000000..6ca156d1b --- /dev/null +++ b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.009-20.010.sql @@ -0,0 +1,4 @@ +ALTER TABLE mcc.animalRequests drop column isprincipalinvestigator; + +ALTER TABLE mcc.animalRequests DROP COLUMN certify; +ALTER TABLE mcc.animalRequests ADD certify bit; \ No newline at end of file diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index a265fec47..770a47f2f 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -240,8 +240,8 @@ Middle Initial true - - Is Principal Investigator + + Is Early Stage Investigator? true @@ -380,6 +380,13 @@ 29 true + + Actions + 200 + + org.labkey.mcc.query.AnimalRequestActionsDisplayColumnFactory + + @@ -559,4 +566,163 @@
+ + Request Reviews + + + + + + rowid + + + Row ID + false + + + Reviewer + false + + + core + users + userid + + + + Review + true + + + Score + true + + + Comments + true + + + Status + true + + + Request ID + false + + mcc + animalrequests + objectid + + + + true + + + true + + + false + false + false + true + 29 + true + + + true + + + false + false + false + true + 29 + true + + + Actions + 200 + + org.labkey.mcc.query.RequestReviewActionsDisplayColumnFactory + + + +
+ + + + + + + Animal Request Reviews + rowid + + + Row ID + false + + + Preliminary Score + true + + + Resource Availability Score + true + + + + Research Area Priority Score + true + + + Proposal Score + true + + + Comments + true + + + Request ID + false + + mcc + animalrequests + objectid + + + + true + + + true + + + false + false + false + true + 29 + true + + + true + + + false + false + false + true + 29 + true + + + Actions + 200 + + org.labkey.mcc.query.RequestScoreActionsDisplayColumnFactory + + + +
diff --git a/mcc/resources/views/mccAdmin.html b/mcc/resources/views/mccAdmin.html index 2d43fa619..7412eecf4 100644 --- a/mcc/resources/views/mccAdmin.html +++ b/mcc/resources/views/mccAdmin.html @@ -1,27 +1,37 @@ \ No newline at end of file diff --git a/mcc/resources/views/mccMenu.html b/mcc/resources/views/mccMenu.html index 70b60b78e..a6a948dcd 100644 --- a/mcc/resources/views/mccMenu.html +++ b/mcc/resources/views/mccMenu.html @@ -40,6 +40,13 @@ }]; if (MCC.Utils.isRequestAdmin()) { + menuItems.push({ + label: 'RAB Reviewer Dashboard', + name: 'reviewerDashboard', + url: LABKEY.ActionURL.buildURL('mcc', 'rabRequestReview', ctx['MCCRequestContainer']), + visible: true + }) + menuItems.push({ label: 'Request Admin', name: 'requestAdmin', diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index fbeb00caa..cb1a9cd8b 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -6,23 +6,59 @@ if(!ctx) return; + //TODO: + // Review advisory board table + // figure with workflow + Ext4.get(webpart.wrapperDivId).update( 'Below are all pending and historic animal requests to MCC. You can use the edit link to view/update any request. You can also use the left-hand \'Views\' button to toggle between submitted requests, all requests, etc.' + '

' + 'Click Here to View Documentation on the Request Process and Scoring Criteria' + + '
' + + 'Outline of Request Workflow' + + '
' + + 'Manage RAB Members (admin permission needed)' + + '

' + + '
' + + '

' + + '
' + '

' + - '
' + '
' ); LDK.Utils.getBasicQWP({ - title: 'MCC Animal Requests', + title: 'All Pending RAB Reviews', + schemaName: 'mcc', + queryName: 'requestReviews', + //frame: 'none', + filterArray: [ + LABKEY.Filter.create('review', null, LABKEY.Filter.Types.ISBLANK) + ], + showRecordSelectors: false, + showDetailsColumn: false, + buttonBar: {position: 'top', includeStandardButtons: true, items: []} + }).render(webpart.wrapperDivId + '-webpartAssignments'); + + LDK.Utils.getBasicQWP({ + title: 'All Pending MCC Requests', frame: 'left-nav', schemaName: 'mcc', - queryName: 'animalRequests', - viewName: 'Submitted', + queryName: 'requestScores', + //viewName: 'In Progress', showRecordSelectors: true, showDetailsColumn: true, buttonBar: {position: 'top', includeStandardButtons: true, items: []} }).render(webpart.wrapperDivId + '-webpartPending'); + + LDK.Utils.getBasicQWP({ + title: 'Current RAB Members', + //frame: 'none', + schemaName: 'core', + queryName: 'Members', + filterArray: [LABKEY.Filter.create('GroupId/Name', 'MCC RAB')], + showRecordSelectors: false, + showDetailsColumn: false, + buttonBar: {position: 'top', includeStandardButtons: true, items: []} + }).render(webpart.wrapperDivId + '-webpartRAB'); }); \ No newline at end of file diff --git a/mcc/resources/views/rabRequestReview.html b/mcc/resources/views/rabRequestReview.html new file mode 100644 index 000000000..b01a4c8d4 --- /dev/null +++ b/mcc/resources/views/rabRequestReview.html @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/mcc/resources/views/rabRequestReview.view.xml b/mcc/resources/views/rabRequestReview.view.xml new file mode 100644 index 000000000..7e62677d0 --- /dev/null +++ b/mcc/resources/views/rabRequestReview.view.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/mcc/resources/web/mcc/img/mccRequest.png b/mcc/resources/web/mcc/img/mccRequest.png new file mode 100644 index 0000000000000000000000000000000000000000..43ea4c4b075833f81a6d09cb34f0705da33bf891 GIT binary patch literal 77058 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

ZSxPaidib*Jx|;Oi93863qPRd}iP(t4=Xv12p)> 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 + const [stateRollbackOnFailure, setStateRollbackOnFailure] = useState(requestData?.request?.status) + + if (!requestData) { + queryRequestInformation(requestId, handleFailure).then((model) => { + setRequestData(model) + }) + } + + if (!requestData || !requestData?.dataLoaded) { + return ( +

+
+
+ ) + } + else if (requestData.dataLoaded === true && !requestData.request) { + return(
There is no request with id: {requestId}
) + } function handleFailure(response) { + console.error(response.exception) + console.error(response) alert(response.exception) //this is probably what you want to show. An example would be to submit data with a long value for middle initial (>14 characters) setDisplayOverlay(false) - setAnimalRequests({ - "returned": stateRollbackOnFailure.returned, - "data": { ...stateRollbackOnFailure.data, status: stateRollbackOnFailure.data.status } - }) + + requestData.request.status = stateRollbackOnFailure + setRequestData({...requestData}) } - - function getRequired() { - switch (animalRequests.data.status) { - case "draft": - return false - case "submitting": - return true - case "submitted": - return false - case "approving": - return true - case "under-review": - return true - case "approving-final": - return true - case "rejecting": - return true - default: - return false - } + function doEnforceRequiredFields() { + return isSubmitting || requestData.request.status !== "Draft" } // The general idea is that users with MCCRequestAdminPermission can edit all states. @@ -140,106 +79,43 @@ export function AnimalRequest() { return true } - if (!animalRequests.data.status) { + if (!requestData.request.status) { return true } - return "draft" === animalRequests.data.status || "submitting" === animalRequests.data.status + return "Draft" === requestData.request.status } - function handleNextStateSubmitButton() { - setIsSubmitting(true); - - if (animalRequests.data.status === "draft") { - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"submitting" } - }); - } else if (animalRequests.data.status === "submitted") { - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"approving" } - }); - } else if (animalRequests.data.status === "under-review") { - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"approving-final" } - }); + function handleSubmitButton(e, isSubmitting) { + setIsSubmitting(isSubmitting); + + if (!isSubmitting) { + // Use this to reset each field's error state + e.target.form.querySelectorAll('input, select, textarea').forEach(function(e){ + e.checkValidity() + }) } } function getSubmitButtonText() { - switch (animalRequests.data.status) { - case "draft": + switch (requestData.request.status) { + case "Draft": return "Submit" - case "submitting": - return "Submit" - case "submitted": - return "Approve Request" - case "approving": - return "Approve Request" - case "under-review": - return "Approve" - case "approving-final": - return "Approve" - case "rejecting": - return "Approve" default: - "Submit" + return "Update Request" } } - - function handleNextStateSaveButton() { - setIsSubmitting(false) - - if (animalRequests.data.status === "submitting") { - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"draft" } - }); - } else if (animalRequests.data.status === "approving") { - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"submitted" } - }); - } else if (animalRequests.data.status === "under-review") { - setIsSubmitting(true) - setAnimalRequests({ - "returned": true, - "data": { ...animalRequests.data, status:"rejecting" } - }); - } - } - function getSaveButtonText() { - switch (animalRequests.data.status) { - case "draft": - return "Save" - case "submitting": - return "Save" - case "submitted": - return "Save" - case "approving": - return "Save" - case "under-review": - return "Reject" - case "approving-final": - return "Reject" - case "rejecting": - return "Reject" - default: - "Save" - } + return "Save" } - - function get_coinvestigator_commands(data, objectId) { + function getCoinvestigatorCommands(data, objectId) { let commands = [] let i = 0 - if(requestId && coinvestigators.data.length > 0) { - for(const coinvestigator of coinvestigators.data) { + if (requestId && requestData.coinvestigators.length > 0) { + for (const coinvestigator of requestData.coinvestigators) { commands.push({ command: "delete", schemaName: "mcc", @@ -272,13 +148,12 @@ export function AnimalRequest() { return commands } - - function get_animal_cohort_commands(data, objectId) { + function getAnimalCohortCommands(data, objectId) { let commands = [] let i = 0 - if(requestId && animalCohorts.data.length > 0) { - for(const cohort of animalCohorts.data) { + if (requestId && requestData.cohorts.length > 0) { + for (const cohort of requestData.cohorts) { commands.push({ command: "delete", schemaName: "mcc", @@ -310,32 +185,33 @@ export function AnimalRequest() { return commands } - function handleSubmit(e: FormEvent) { e.preventDefault() setDisplayOverlay(true) - setStateRollbackOnFailure({ - "returned": animalRequests.returned, - "data": { ...animalRequests.data, status: animalRequests.data.status } - }) - if(animalRequests.data.status === "submitting") { - animalRequests.data.status = "submitted" - } else if(animalRequests.data.status === "approving") { - animalRequests.data.status = "under-review" - } else if(animalRequests.data.status === "approving-final") { - animalRequests.data.status = "approved" - } else if(animalRequests.data.status === "rejecting") { - animalRequests.data.status = "rejected" - } + // NOTE: the idea is that when the user hits 'submit', this changes Draft to Submitted. + // Any other action preserved the status as-is + if (isSubmitting) { + setStateRollbackOnFailure(requestData.request.status) + if (requestData.request.status === 'Draft') { + requestData.request.status = 'Submitted' - const data = new FormData(e.currentTarget as HTMLFormElement) + setRequestData({...requestData}) + } + } + + const el = e.currentTarget as HTMLFormElement + const data = new FormData(el) + el.querySelectorAll('select[multiple]').forEach(function(x){ + data.set(x.id, Array.from(x.selectedOptions, option => option.value).join(',')) + }) - const objectId = requestId || nanoid() - let coinvestigatorCommands = get_coinvestigator_commands(data, objectId) - let cohortCommands = get_animal_cohort_commands(data, objectId) + // NOTE: use a proper v4 UUID so this is compatible with the sqlserver ENTITYID datatype + const objectId = requestId || uuidv4() + let coinvestigatorCommands = getCoinvestigatorCommands(data, objectId) + let cohortCommands = getAnimalCohortCommands(data, objectId) - let rowId = requestId ? {"rowid": animalRequests.data.rowid} : {} + let rowId = requestId ? {"rowid": requestData.request.rowid} : {} Query.saveRows({ commands: [ @@ -348,7 +224,7 @@ export function AnimalRequest() { "lastname": data.get("investigator-last-name"), "firstname": data.get("investigator-first-name"), "middleinitial": data.get("investigator-middle-initial"), - "isprincipalinvestigator": data.get("is-principal-investigator"), + "earlystageinvestigator": data.get("is-early-stage-investigator"), "institutionname": data.get("institution-name"), "institutioncity": data.get("institution-city"), "institutionstate": data.get("institution-state"), @@ -368,7 +244,7 @@ export function AnimalRequest() { "existingmarmosetcolony": data.get("existing-marmoset-colony"), "existingnhpfacilities": data.get("existing-nhp-facilities"), "animalwelfare": data.get("animal-welfare"), - "certify": data.get("certify"), + "certify": !!data.get("certify"), "vetlastname": data.get("vet-last-name"), "vetfirstname": data.get("vet-first-name"), "vetemail": data.get("vet-email"), @@ -376,7 +252,7 @@ export function AnimalRequest() { "iacucprotocol": data.get("iacuc-protocol"), "grantnumber" : data.get("funding-grant-number"), "applicationduedate": data.get("funding-application-due-date"), - "status": animalRequests.data.status, + "status": requestData.request.status, ...rowId }] }, @@ -384,344 +260,241 @@ export function AnimalRequest() { ...cohortCommands ], success: function(response) { - window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view') + setDisplayOverlay(false) + if (isSubmitting) { + window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view') + } }, failure: handleFailure }) } + return ( + <> +
+

General Information

+ +
+ - function fillForm() { - setIsFormQueried(true) - - Query.selectRows({ - schemaName: "mcc", - queryName: "animalrequests", - columns: [ - "rowid", - "objectId", - "lastname", - "firstname", - "middleinitial", - "isprincipalinvestigator", - "institutionname", - "institutioncity", - "institutionstate", - "institutioncountry", - "institutiontype", - "officiallastname", - "officialfirstname", - "officialemail", - "fundingsource", - "experimentalrationale", - "methodsproposed", - "collaborations", - "isbreedinganimals", - "breedingpurpose", - "researcharea", - "otherjustification", - "existingmarmosetcolony", - "existingnhpfacilities", - "animalwelfare", - "certify", - "vetlastname", - "vetfirstname", - "vetemail", - "iacucapproval", - "iacucprotocol", - "grantnumber", - "applicationduedate", - "status" - ], - filterArray: [ - Filter.create('objectId', requestId) - ], - success: function(resp) { - let returnedData = resp.rows[0] + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="investigator-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} placeholder="Last Name" defaultValue={requestData.request.lastname}/> + </div> - setAnimalRequests({ - "returned": true, - "data": returnedData - }) - }, - failure: handleFailure - }) + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="investigator-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} placeholder="First Name" defaultValue={requestData.request.firstname}/> + </div> + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="investigator-middle-initial" isSubmitting={isSubmitting} required={false} placeholder="Middle Initial" defaultValue={requestData.request.middleinitial} maxLength="8"/> + </div> + </div> + </ErrorMessageHandler> + + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <div className="tw-relative tw-w-full tw-mb-6 md:tw-mb-0"> + <Title text="2. Are you an early-stage investigator? "/> + <Tooltip id="early-stage-investigator-helper" + text={earlyInvestigatorTooltip} + /> + </div> - Query.selectRows({ - schemaName: "mcc", - queryName: "coinvestigators", - columns: [ - "rowid", - "requestId", - "lastname", - "firstname", - "middleinitial", - "institutionname", - ], - filterArray: [ - Filter.create('requestId', requestId) - ], - success: function(resp) { - let returnedData = resp.rows - setCoinvestigators({ - "returned": true, - "data": returnedData - }) - }, - failure: handleFailure - }) + <div className="tw-w-full tw-px-3 tw-mt-6"> + <YesNoRadio id="is-early-stage-investigator" ariaLabel="Early Stage Investigator" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} defaultValue={requestData.request.earlystageinvestigator}/> + </div> + </div> + </ErrorMessageHandler> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <Title text="3. Affiliated research institution*"/> - Query.selectRows({ - schemaName: "mcc", - queryName: "requestcohorts", - columns: [ - "rowid", - "requestId", - "numberofanimals", - "sex", - "othercharacteristics", - ], - filterArray: [ - Filter.create('requestId', requestId) - ], - success: function(resp) { - let returnedData = resp.rows - setAnimalCohorts({ - "returned": true, - "data": returnedData - }) - }, - failure: handleFailure - }) + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="institution-name" ariaLabel="Institution Name" isSubmitting={isSubmitting} placeholder="Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.institutionname}/> + </div> - } + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="institution-city" ariaLabel="Institution City" isSubmitting={isSubmitting} placeholder="City" required={doEnforceRequiredFields()} defaultValue={requestData.request.institutioncity}/> + </div> + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="institution-state" ariaLabel="Institution State" isSubmitting={isSubmitting} placeholder="State" required={doEnforceRequiredFields()} defaultValue={requestData.request.institutionstate}/> + </div> - if (requestId && (animalRequests.returned === false || coinvestigators.returned === false || animalCohorts.returned === false)) { - if (isFormQueried === false) { - fillForm() - } + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="institution-country" ariaLabel="Institution Country" isSubmitting={isSubmitting} placeholder="Country" required={doEnforceRequiredFields()} defaultValue={requestData.request.institutioncountry}/> + </div> - return ( - <div className="tw-flex tw-justify-center tw-items-center"> - <div style={{ borderBottom: "2px solid #3495d2" }} className="tw-animate-spin tw-rounded-full tw-h-32 tw-w-32"></div> - </div> - ) - } else if (requestId && animalRequests.returned === true && animalRequests.data === undefined) { - return(<Title text="No such request."/>) - } else { - return ( - <> - <form className="tw-w-full tw-max-w-4xl" onSubmit={handleSubmit} autoComplete="off"> - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Principal Investigator*"/> + <Title text="4. Affiliated Research Institution Type*"/> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="investigator-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} required={getRequired()} placeholder="Last Name" defaultValue={animalRequests.data.lastname}/> - </div> + <div className="tw-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Select id="institution-type" ariaLabel="Institution Type" isSubmitting={isSubmitting} placeholder="Type" required={doEnforceRequiredFields()} defaultValue={requestData.request.institutiontype} options={institutionTypeOptions}/> + </div> + </div> + </ErrorMessageHandler> + + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <div className="tw-relative tw-w-full tw-mb-6 md:tw-mb-0"> + <Title text="5. Institution Signing Official* "/> + <Tooltip id="signing-official-helper" + text={signingOfficialTooltip} + /> + </div> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="investigator-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} required={getRequired()} placeholder="First Name" defaultValue={animalRequests.data.firstname}/> - </div> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="investigator-middle-initial" isSubmitting={isSubmitting} required={false} placeholder="Middle Initial" defaultValue={animalRequests.data.middleinitial} maxLength="8"/> + <div className="tw-flex tw-flex-wrap tw-mt-6"> + <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="official-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} placeholder="Last Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.officiallastname}/> </div> - </div> - </ErrorMessageHandler> - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <div className="tw-relative tw-w-full tw-mb-6 md:tw-mb-0"> - <Title text="Are you an early-stage investigator? "/> - <Tooltip id="early-stage-investigator-helper" - text={earlyInvestigatorTooltip} - /> + <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="official-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} placeholder="First Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.officialfirstname}/> </div> - <div className="tw-w-full tw-px-3 tw-mt-6"> - <YesNoRadio id="is-principal-investigator" ariaLabel="Principal Investigator" isSubmitting={isSubmitting} required={getRequired()} defaultValue={animalRequests.data.isprincipalinvestigator}/> + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="official-email" ariaLabel="Email Address" isSubmitting={isSubmitting} placeholder="Email Address" required={doEnforceRequiredFields()} defaultValue={requestData.request.officialemail}/> </div> </div> - </ErrorMessageHandler> - - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Affiliated research institution*"/> + </div> + </ErrorMessageHandler> - <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="institution-name" ariaLabel="Institution Name" isSubmitting={isSubmitting} placeholder="Name" required={getRequired()} defaultValue={animalRequests.data.institutionname}/> - </div> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-10"> + <Title text="6. Co-Investigators"/> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="institution-city" ariaLabel="Institution City" isSubmitting={isSubmitting} placeholder="City" required={getRequired()} defaultValue={animalRequests.data.institutioncity}/> - </div> + <CoInvestigators isSubmitting={isSubmitting} defaultValue={requestData.coinvestigators} required={doEnforceRequiredFields()}/> + </div> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="institution-state" ariaLabel="Institution State" isSubmitting={isSubmitting} placeholder="State" required={getRequired()} defaultValue={animalRequests.data.institutionstate}/> - </div> + <Title text="7. Existing or proposed funding source (select all that apply)"/> + <Funding id="funding" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="institution-country" ariaLabel="Institution Country" isSubmitting={isSubmitting} placeholder="Country" required={getRequired()} defaultValue={animalRequests.data.institutioncountry}/> + <h3>Institutional Animal Facilities and Capabilities</h3> + <div className="tw-w-full tw-px-3"> + <Title text="1. Does your institution have existing NHP facilities?"/> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <Select id="existing-nhp-facilities" ariaLabel="Existing NHP Facilities" isSubmitting={isSubmitting} options={existingNHPFacilityOptions} defaultValue={requestData.request.existingnhpfacilities} required={doEnforceRequiredFields()}/> </div> - </div> </ErrorMessageHandler> + <Title text="2. Does your institution have an existing marmoset colony?"/> <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <div className="tw-relative tw-w-full tw-mb-6 md:tw-mb-0"> - <Title text="Institution Signing Official* "/> - <Tooltip id="signing-official-helper" - text={signingOfficialTooltip} - /> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <Select id="existing-marmoset-colony" ariaLabel="Existing Marmoset Colony" isSubmitting={isSubmitting} options={existingMarmosetColonyOptions} defaultValue={requestData.request.existingmarmosetcolony} required={doEnforceRequiredFields()}/> </div> + </ErrorMessageHandler> + <Title text="3. Do you plan to breed marmosets?"/> + <div className="tw-w-full tw-px-3 tw-mb-4"> + <AnimalBreeding id="animal-breeding" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> + </div> + </div> - <div className="tw-flex tw-flex-wrap tw-mt-6"> - <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="official-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} placeholder="Last Name" required={getRequired()} defaultValue={animalRequests.data.officiallastname}/> - </div> + <h3>Research Details</h3> - <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="official-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} placeholder="First Name" required={getRequired()} defaultValue={animalRequests.data.officialfirstname}/> - </div> + <div className="tw-flex tw-flex-wrap tw-mx-2"> + <Title text="1. Research Area"/> - <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="official-email" ariaLabel="Email Address" isSubmitting={isSubmitting} placeholder="Email Address" required={getRequired()} defaultValue={animalRequests.data.officialemail}/> - </div> - </div> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <ResearchArea id="research-area" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> </div> - </ErrorMessageHandler> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-10"> - <Title text="Co-investigators"/> + <div className="tw-w-full tw-px-3 tw-mb-4"> + <Title text={"2. " + experimentalRationalePlaceholder}/> + <Tooltip id="research-use-statement-helper" + text={experimentalRationalePlaceholder} + /> - <CoInvestigators isSubmitting={isSubmitting} defaultValue={coinvestigators.data} required={getRequired()}/> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <TextArea id="experiment-rationale" ariaLabel="Experimental rationale" isSubmitting={isSubmitting} placeholder={experimentalRationalePlaceholder} required={doEnforceRequiredFields()} defaultValue={requestData.request.experimentalrationale}/> + </ErrorMessageHandler> </div> - <Funding id="funding" isSubmitting={isSubmitting} defaultValue={animalRequests.data} required={getRequired()}/> - - <div className="tw-flex tw-flex-wrap tw-mx-2"> - <div className="tw-relative tw-w-full tw-mb-6 md:tw-mb-0"> - <Title text="Research Use Statement* "/> - <Tooltip id="research-use-statement-helper" - text={experimentalRationalePlaceholder} - /> - </div> + <Title text="3. Animal Cohorts"/> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-6"> + <AnimalCohorts isSubmitting={isSubmitting} defaultValue={requestData.cohorts} required={doEnforceRequiredFields()}/> + </div> + <Title text={"4. " + methodsProposedPlaceholder}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-w-full tw-px-3 tw-mb-6 tw-mt-6"> - <TextArea id="experiment-rationale" ariaLabel="Experimental rationale" isSubmitting={isSubmitting} placeholder={experimentalRationalePlaceholder} required={getRequired()} defaultValue={animalRequests.data.experimentalrationale}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <TextArea id="methods-proposed" ariaLabel="Methods Proposed" isSubmitting={isSubmitting} placeholder={methodsProposedPlaceholder} required={doEnforceRequiredFields()} defaultValue={requestData.request.methodsproposed}/> </div> </ErrorMessageHandler> + </div> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-6"> - <Title text="Animal Cohorts"/> - - <AnimalCohorts isSubmitting={isSubmitting} defaultValue={animalCohorts.data} required={getRequired()}/> + <Title text={"5. " + collaborationsPlaceholder}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <TextArea id="collaborations" ariaLabel="Collaborations" isSubmitting={isSubmitting} placeholder={collaborationsPlaceholder} required={doEnforceRequiredFields()} defaultValue={requestData.request.collaborations}/> </div> + </ErrorMessageHandler> + </div> + <Title text={"6. " + animalWellfarePlaceholder}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-w-full tw-px-3 tw-mb-4"> - <TextArea id="methods-proposed" ariaLabel="Methods Proposed" isSubmitting={isSubmitting} placeholder={methodsProposedPlaceholder} required={getRequired()} defaultValue={animalRequests.data.methodsproposed}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <TextArea id="animal-welfare" ariaLabel="Animal Welfare" isSubmitting={isSubmitting} placeholder={animalWellfarePlaceholder} required={doEnforceRequiredFields()} defaultValue={requestData.request.animalwelfare}/> </div> </ErrorMessageHandler> <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-w-full tw-px-3 tw-mb-4"> - <TextArea id="collaborations" ariaLabel="Collaborations" isSubmitting={isSubmitting} placeholder={collaborationsPlaceholder} required={getRequired()} defaultValue={animalRequests.data.collaborations}/> + <div className="tw-w-full tw-px-3 tw-mb-6"> + <input type="checkbox" name="certify" id="certify" aria-label="Certify" className={(isSubmitting ? "custom-invalid" : "")} required={doEnforceRequiredFields()} defaultChecked={requestData.request.certify}/> + <label className="tw-text-gray-700 ml-1">{certificationLabel}</label> </div> </ErrorMessageHandler> + </div> - <div className="tw-w-full tw-px-3 tw-mb-4"> - <div className="tw-mb-6"> - <Title text="Do you plan to breed animals?"/> - </div> - <AnimalBreeding id="animal-breeding" isSubmitting={isSubmitting} defaultValue={animalRequests.data} required={getRequired()}/> - </div> + <ErrorMessageHandler isSubmitting={isSubmitting}> + <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> + <Title text="7. Attending veterinarian"/> - <ResearchArea id="research-area" isSubmitting={isSubmitting} defaultValue={animalRequests.data} required={getRequired()}/> - - <div className="tw-w-full tw-px-3"> - <div className="tw-mb-6"> - <Title text="Institutional Animal Facilities and Capabilities"/> - </div> - - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Does your institution have an existing marmoset colony?"/> - <Select id="existing-marmoset-colony" ariaLabel="Existing Marmoset Colony" isSubmitting={isSubmitting} options={existingMarmosetColonyOptions} defaultValue={animalRequests.data.existingmarmosetcolony} required={getRequired()}/> - </div> - </ErrorMessageHandler> - - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Does your institution have existing NHP facilities?"/> - <Select id="existing-nhp-facilities" ariaLabel="Existing NHP Facilities" isSubmitting={isSubmitting} options={existingNHPFacilityOptions} defaultValue={animalRequests.data.existingnhpfacilities} required={getRequired()}/> - </div> - </ErrorMessageHandler> + <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="vet-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} placeholder="Last Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.vetlastname}/> </div> - <div className="tw-w-full tw-px-3 tw-mb-6"> - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-w-full tw-px-3 tw-mb-6"> - <TextArea id="animal-welfare" ariaLabel="Animal Welfare" isSubmitting={isSubmitting} placeholder={animalWellfarePlaceholder} required={getRequired()} defaultValue={animalRequests.data.animalwelfare}/> - </div> - </ErrorMessageHandler> - - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-w-full tw-px-3 tw-mb-6"> - <input type="checkbox" name="certify" id="certify" aria-label="Certify" className={(isSubmitting ? "custom-invalid" : "")} required={getRequired()} defaultChecked={animalRequests.data.certify}/> - <label className="tw-text-gray-700 ml-1">{certificationLabel}</label> - </div> - </ErrorMessageHandler> + <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="vet-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} placeholder="First Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.vetfirstname}/> </div> - <ErrorMessageHandler isSubmitting={isSubmitting}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Attending veterinarian"/> - - <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="vet-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} placeholder="Last Name" required={getRequired()} defaultValue={animalRequests.data.vetlastname}/> - </div> - - <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="vet-first-name" ariaLabel="First Name" isSubmitting={isSubmitting} placeholder="First Name" required={getRequired()} defaultValue={animalRequests.data.vetfirstname}/> - </div> - - <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id="vet-email" ariaLabel="Email" isSubmitting={isSubmitting} placeholder="Email Address" required={getRequired()} defaultValue={animalRequests.data.vetemail}/> - </div> + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id="vet-email" ariaLabel="Email" isSubmitting={isSubmitting} placeholder="Email Address" required={doEnforceRequiredFields()} defaultValue={requestData.request.vetemail}/> </div> - </ErrorMessageHandler> </div> - - <IACUCProtocol id="iacuc" isSubmitting={isSubmitting} required={getRequired()} defaultValue={animalRequests.data}/> + </ErrorMessageHandler> + </div> - <div className="tw-flex tw-flex-wrap tw-mx-2"> - <button className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-4 tw-mt-2 tw-px-6 tw-border-none tw-rounded" onClick={(e) => { - e.preventDefault() + <IACUCProtocol id="iacuc" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} defaultValue={requestData.request}/> - if (confirm("You are about to leave this page.")) { - window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view'); - } - }}>Cancel</button> + <div className="tw-flex tw-flex-wrap tw-mx-2"> + <Title text="Request Status: "/>{requestData.request.status} + </div> - <Button onClick={() => { - handleNextStateSaveButton(); - }} text={getSaveButtonText()} display={hasEditPermission() && animalRequests.data.status != "rejected"}/> + <div className="tw-flex tw-flex-wrap tw-mx-2"> + <button className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-4 tw-mt-2 tw-px-6 tw-border-none tw-rounded" onClick={(e) => { + e.preventDefault() - <Button onClick={() => { - handleNextStateSubmitButton(); - }} text={getSubmitButtonText()} display={hasEditPermission() && animalRequests.data.status != "rejected"}/> - </div> - </form> + if (confirm("You are about to leave this page.")) { + window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view'); + } + }}>Cancel</button> + + <Button onClick={(e) => { + handleSubmitButton(e, false); + }} text={getSaveButtonText()} display={hasEditPermission()}/> + + <Button onClick={(e) => { + handleSubmitButton(e, true); + }} text={getSubmitButtonText()} display={hasEditPermission()}/> + </div> + </form> - <SavingOverlay display={displayOverlay} /> - </> - ) - } + <SavingOverlay display={displayOverlay} /> + </> + ) } diff --git a/mcc/src/client/AnimalRequest/app.tsx b/mcc/src/client/AnimalRequest/app.tsx index 54fcf9081..a7fdfdd8d 100644 --- a/mcc/src/client/AnimalRequest/app.tsx +++ b/mcc/src/client/AnimalRequest/app.tsx @@ -1,11 +1,15 @@ import React from 'react' import ReactDOM from 'react-dom' +import { ErrorBoundary } from '@labkey/components'; -import './tailwind.css'; +import '../tailwind.css'; import { AnimalRequest } from './animal-request' // Need to wait for container element to be available in labkey wrapper before render window.addEventListener('DOMContentLoaded', (event) => { - ReactDOM.render(<AnimalRequest />, document.getElementById('app')); + ReactDOM.render( + <ErrorBoundary> + <AnimalRequest/> + </ErrorBoundary>, document.getElementById('app')); }); diff --git a/mcc/src/client/AnimalRequest/co-investigators.tsx b/mcc/src/client/AnimalRequest/co-investigators.tsx deleted file mode 100644 index 16d939395..000000000 --- a/mcc/src/client/AnimalRequest/co-investigators.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useState, Fragment } from 'react' -import { nanoid } from 'nanoid' - -import Input from './input' -import Title from './title' -import ErrorMessageHandler from './error-message-handler' - -export default function CoInvestigators(props) { - const [coInvestigators, setCoInvestigators] = useState(new Set( - props.defaultValue.map((coInvestigator) => ({ - ...coInvestigator, - "uuid": nanoid() - })) - )) - - function addInvestigator() { - coInvestigators.add({ - "uuid": nanoid() - }) - setCoInvestigators(new Set(coInvestigators)) - } - - function removeCoInvestigator(coInvestigator) { - coInvestigators.delete(coInvestigator) - setCoInvestigators(new Set(coInvestigators)) - } - - return ( - <> - {[...coInvestigators].map((coInvestigator, index) => ( - <ErrorMessageHandler isSubmitting={props.isSubmitting} keyInternal={coInvestigator.uuid} key={coInvestigator.uuid + "-errorHandler"}> - <div className="tw-flex tw-flex-wrap tw-w-full tw-mx-2 tw-mb-4" key={coInvestigator.uuid}> - <div className="tw-flex tw-flex-wrap tw-w-full tw-mb-6"> - <div className="tw-w-1/2 md:tw-mb-0"> - <Title text={ "Co-Investigator " + (index + 1)} /> - </div> - - <div className="tw-flex tw-flex-wrap tw-w-full md:tw-w-1/2 md:tw-mb-0"> - <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" onClick={() => removeCoInvestigator(coInvestigator)} value="Remove" /> - </div> - </div> - - <div className="tw-w-full md:tw-w-1/3 tw-px-3 md:tw-mb-0"> - <Input id={"coinvestigators-" + index + "-" + "lastName"} ariaLabel={"Last Name" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Last Name" required={props.required} defaultValue={coInvestigator.lastname}/> - </div> - - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id={"coinvestigators-" + index + "-" + "firstName"} ariaLabel={"First Name" + "#" + index} isSubmitting={props.isSubmitting} placeholder="First Name" required={props.required} defaultValue={coInvestigator.firstname}/> - </div> - - <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id={"coinvestigators-" + index + "-" + "middleInitial"} ariaLabel={"Middle Initial" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Middle Initial" required={false} defaultValue={coInvestigator.middleinitial} maxLength="8"/> - </div> - - <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <Input id={"coinvestigators-" + index + "-" + "institution"} ariaLabel={"Institution" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Institution" required={props.required} defaultValue={coInvestigator.institutionname}/> - </div> - </div> - </ErrorMessageHandler> - ))} - - <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={addInvestigator} value="Add Co-investigator" /> - </div> - </> - ) -} diff --git a/mcc/src/client/AnimalRequest/animal-breeding.tsx b/mcc/src/client/AnimalRequest/components/animal-breeding.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/animal-breeding.tsx rename to mcc/src/client/AnimalRequest/components/animal-breeding.tsx diff --git a/mcc/src/client/AnimalRequest/animal-cohort.tsx b/mcc/src/client/AnimalRequest/components/animal-cohort.tsx similarity index 79% rename from mcc/src/client/AnimalRequest/animal-cohort.tsx rename to mcc/src/client/AnimalRequest/components/animal-cohort.tsx index 85c1d9b58..2f10c9f78 100644 --- a/mcc/src/client/AnimalRequest/animal-cohort.tsx +++ b/mcc/src/client/AnimalRequest/components/animal-cohort.tsx @@ -1,33 +1,26 @@ -import React, { useState, Fragment } from 'react' -import { nanoid } from 'nanoid' +import React, { useState } from 'react'; -import InputNumber from './input-number' -import Select from './select' -import Title from './title' -import TextArea from './text-area' -import ErrorMessageHandler from './error-message-handler' +import InputNumber from './input-number'; +import Select from './select'; +import Title from './title'; +import TextArea from './text-area'; +import ErrorMessageHandler from './error-message-handler'; -import { animalSexes, otherCharacteristicsPlaceholder } from './values' +import { animalSexes, otherCharacteristicsPlaceholder } from './values'; +import { AnimalCohort } from '../../components/RequestUtils'; export default function AnimalCohorts(props) { - const [cohorts, setCohorts] = useState(new Set( - props.defaultValue.map((cohort) => ({ - ...cohort, - "uuid": nanoid() - })) - )) - + const [cohorts, setCohorts] = useState<AnimalCohort[]>(props.defaultValue) + function addCohort() { - cohorts.add({ - "uuid": nanoid() - }) - setCohorts(new Set(cohorts)) + cohorts.push(new AnimalCohort()) + setCohorts([...cohorts]) } function removeCohort(cohort) { - if(cohorts.size > 1) { - cohorts.delete(cohort) - setCohorts(new Set(cohorts)) + // NOTE: dont allow removing all cohorts + if (cohorts.length > 1) { + setCohorts([...cohorts.filter(item => item.uuid !== cohort.uuid)]) } } @@ -43,7 +36,7 @@ export default function AnimalCohorts(props) { <div className="tw-flex tw-flex-wrap tw-w-full md:tw-w-1/2 md:tw-mb-0"> <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" - onClick={() => removeCohort(cohort)} value="Remove" style={{display: cohorts.size > 1 ? null : "none"}}/> + onClick={() => removeCohort(cohort)} value="Remove" style={{display: index > 0 ? null : "none"}}/> </div> </div> diff --git a/mcc/src/client/AnimalRequest/button.tsx b/mcc/src/client/AnimalRequest/components/button.tsx similarity index 72% rename from mcc/src/client/AnimalRequest/button.tsx rename to mcc/src/client/AnimalRequest/components/button.tsx index f410b1b0d..0ec1c1e27 100644 --- a/mcc/src/client/AnimalRequest/button.tsx +++ b/mcc/src/client/AnimalRequest/components/button.tsx @@ -1,9 +1,9 @@ -import React from 'react' +import React from 'react'; export default function Button(props) { - function onClick() { + function onClick(e) { if(props.onClick) { - props.onClick() + props.onClick(e) } } if(props.display === false) { @@ -14,7 +14,7 @@ export default function Button(props) { } else { return ( <button className="tw-ml-16 tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-4 tw-mt-2 tw-px-6 tw-border-none tw-rounded" - onClick={() => onClick()}>{props.text}</button> + onClick={(e) => onClick(e)}>{props.text}</button> ) } } diff --git a/mcc/src/client/AnimalRequest/components/co-investigators.tsx b/mcc/src/client/AnimalRequest/components/co-investigators.tsx new file mode 100644 index 000000000..ca375ee80 --- /dev/null +++ b/mcc/src/client/AnimalRequest/components/co-investigators.tsx @@ -0,0 +1,61 @@ +import React, { useState } from 'react'; + +import Input from './input'; +import Title from './title'; +import ErrorMessageHandler from './error-message-handler'; +import { CoInvestigatorModel } from '../../components/RequestUtils'; + +export default function CoInvestigators(props) { + const [coInvestigators, setCoInvestigators] = useState<CoInvestigatorModel[]>(props.defaultValue || []) + + function addInvestigator() { + coInvestigators.push(new CoInvestigatorModel()) + setCoInvestigators([...coInvestigators]) + } + + function removeCoInvestigator(coInvestigator) { + if (coInvestigators.length) { + setCoInvestigators([...coInvestigators.filter(item => item.uuid !== coInvestigator.uuid)]) + } + } + + return ( + <> + {[...coInvestigators].map((coInvestigator, index) => ( + <ErrorMessageHandler isSubmitting={props.isSubmitting} keyInternal={coInvestigator.uuid} key={coInvestigator.uuid + "-errorHandler"}> + <div className="tw-flex tw-flex-wrap tw-w-full tw-mx-2 tw-mb-4" key={coInvestigator.uuid}> + <div className="tw-flex tw-flex-wrap tw-w-full tw-mb-6"> + <div className="tw-w-1/2 md:tw-mb-0"> + <Title text={ "Co-Investigator " + (index + 1)} /> + </div> + + <div className="tw-flex tw-flex-wrap tw-w-full md:tw-w-1/2 md:tw-mb-0"> + <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" onClick={() => removeCoInvestigator(coInvestigator)} value="Remove" /> + </div> + </div> + + <div className="tw-w-full md:tw-w-1/3 tw-px-3 md:tw-mb-0"> + <Input id={"coinvestigators-" + index + "-" + "lastName"} ariaLabel={"Last Name" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Last Name" required={props.required} defaultValue={coInvestigator.lastname}/> + </div> + + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id={"coinvestigators-" + index + "-" + "firstName"} ariaLabel={"First Name" + "#" + index} isSubmitting={props.isSubmitting} placeholder="First Name" required={props.required} defaultValue={coInvestigator.firstname}/> + </div> + + <div className="tw-w-full md:tw-w-1/3 tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id={"coinvestigators-" + index + "-" + "middleInitial"} ariaLabel={"Middle Initial" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Middle Initial" required={false} defaultValue={coInvestigator.middleinitial} maxLength="8"/> + </div> + + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <Input id={"coinvestigators-" + index + "-" + "institution"} ariaLabel={"Institution" + "#" + index} isSubmitting={props.isSubmitting} placeholder="Institution" required={props.required} defaultValue={coInvestigator.institutionname}/> + </div> + </div> + </ErrorMessageHandler> + ))} + + <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> + <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={addInvestigator} value="Add Co-investigator" /> + </div> + </> + ) +} diff --git a/mcc/src/client/AnimalRequest/date.tsx b/mcc/src/client/AnimalRequest/components/date.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/date.tsx rename to mcc/src/client/AnimalRequest/components/date.tsx diff --git a/mcc/src/client/AnimalRequest/error-message-handler.tsx b/mcc/src/client/AnimalRequest/components/error-message-handler.tsx similarity index 50% rename from mcc/src/client/AnimalRequest/error-message-handler.tsx rename to mcc/src/client/AnimalRequest/components/error-message-handler.tsx index 018d79bd1..9e47d0a4a 100644 --- a/mcc/src/client/AnimalRequest/error-message-handler.tsx +++ b/mcc/src/client/AnimalRequest/components/error-message-handler.tsx @@ -2,40 +2,45 @@ import React from 'react' import { nanoid } from 'nanoid' export default function ErrorMessageHandler(props) { - const ref = React.useRef() - const [errors, setErrors] = React.useState(new Set()) + const ref = React.useRef(null) + const [errors, setErrors] = React.useState(new Set()) + + React.useEffect(() => { + if (ref && ref.current && props.isSubmitting) { + const el = ref.current as HTMLElement + if (!el) { + return + } - React.useEffect(() => { - if (ref.current && props.isSubmitting) { - const el = ref.current - const handleValidationMessages = () => { const tmp = new Set() - - for (const e of el.querySelectorAll('input, select, textarea')) { + el.querySelectorAll<HTMLSelectElement>('input, select, textarea').forEach(function(e){ if (!e.checkValidity()) { const name = e.getAttribute("aria-label").split("#")[0] const message = e.validationMessage tmp.add(`${name}: ${message}`) } - } - + }) + setErrors(tmp) } - + el.addEventListener('input', handleValidationMessages) handleValidationMessages() + } else { + // NOTE: if we're not actively submitting, reset the errors + setErrors(new Set()) } }, [props.isSubmitting, props.rerender]); return ( - <> + <> <span ref={ref} key={props.id + "-error-message-handler-children"}> {props.children} </span> - <ul className="tw-mx-2 tw-mb-6" key={props.id + "-error-message-handler-errors"}> - {[...errors].map(txt => <li className="tw-tracking-wide tw-text-red-500" key={nanoid()}>{txt}</li>)} - </ul> - </> + <ul className="tw-mx-2 tw-mb-6" key={props.id + "-error-message-handler-errors"}> + {[...errors].map(txt => <li className="tw-tracking-wide tw-text-red-500" key={nanoid()}>{txt}</li>)} + </ul> + </> ) } diff --git a/mcc/src/client/AnimalRequest/funding.tsx b/mcc/src/client/AnimalRequest/components/funding.tsx similarity index 82% rename from mcc/src/client/AnimalRequest/funding.tsx rename to mcc/src/client/AnimalRequest/components/funding.tsx index 6c9d678c1..a8cc6fb1a 100644 --- a/mcc/src/client/AnimalRequest/funding.tsx +++ b/mcc/src/client/AnimalRequest/components/funding.tsx @@ -22,10 +22,9 @@ export default function Funding(props) { return ( <ErrorMessageHandler isSubmitting={props.isSubmitting} rerender={displayApplicationDate}> - <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="Existing or proposed funding source*"/> + <div className="tw-w-full tw-mx-2 tw-mb-4"> <div className="tw-w-full tw-px-3 tw-mb-6"> - <Select id={props.id + "-source"} ariaLabel="Proposed Funding Source" isSubmitting={props.isSubmitting} options={fundingSourceOptions} onChange={(e) => setDisplayApplicationDateField(e.currentTarget.value)} required={props.required} defaultValue={props.defaultValue.fundingsource} /> + <Select id={props.id + "-source"} ariaLabel="Proposed Funding Source(s)" isSubmitting={props.isSubmitting} options={fundingSourceOptions} onChange={(e) => setDisplayApplicationDateField(e.currentTarget.value)} multiSelect={true} required={props.required} defaultValue={props.defaultValue.fundingsource} /> </div> <div className="tw-w-full tw-px-3"> diff --git a/mcc/src/client/AnimalRequest/iacuc-protocol.tsx b/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx similarity index 97% rename from mcc/src/client/AnimalRequest/iacuc-protocol.tsx rename to mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx index 2e775c5a2..f9a1e4730 100644 --- a/mcc/src/client/AnimalRequest/iacuc-protocol.tsx +++ b/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx @@ -22,7 +22,7 @@ export default function IACUCProtocol(props) { return ( <ErrorMessageHandler isSubmitting={props.isSubmitting} rerender={displayProtocol}> <div className="tw-flex tw-flex-wrap tw-mx-2"> - <Title text="IACUC Approval"/> + <Title text="8. IACUC Approval"/> <div className="tw-w-full tw-px-3 md:tw-mb-0"> diff --git a/mcc/src/client/AnimalRequest/input-number.tsx b/mcc/src/client/AnimalRequest/components/input-number.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/input-number.tsx rename to mcc/src/client/AnimalRequest/components/input-number.tsx diff --git a/mcc/src/client/AnimalRequest/input.tsx b/mcc/src/client/AnimalRequest/components/input.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/input.tsx rename to mcc/src/client/AnimalRequest/components/input.tsx diff --git a/mcc/src/client/AnimalRequest/select.tsx b/mcc/src/client/AnimalRequest/components/select.tsx similarity index 59% rename from mcc/src/client/AnimalRequest/select.tsx rename to mcc/src/client/AnimalRequest/components/select.tsx index 27245fab3..03d43ee5a 100644 --- a/mcc/src/client/AnimalRequest/select.tsx +++ b/mcc/src/client/AnimalRequest/components/select.tsx @@ -11,11 +11,20 @@ export default function Select(props) { } } + const isMultiple = props.multiSelect || false + let defaultValue = props.defaultValue + if (isMultiple && !Array.isArray(defaultValue)) { + defaultValue = defaultValue ? defaultValue.split(',') : [] + } + else { + defaultValue = defaultValue || "" + } + return ( <select className={"tw-block tw-border tw-border-gray-300" + (props.isSubmitting && " tw-invalid ") + "tw-text-gray-700 tw-py-3 tw-pr-8 tw-rounded tw-leading-tight focus:tw-outline-none"} - name={props.id} aria-label={props.ariaLabel} id={props.id} required={props.required} defaultValue={props.defaultValue || ""} onChange={(e) => onChange(e)}> + name={props.id} aria-label={props.ariaLabel} id={props.id} multiple={isMultiple} required={props.required} defaultValue={defaultValue} onChange={(e) => onChange(e)}> - <option disabled value=""> -- </option> + {isMultiple ? null : (<option disabled value=""> -- </option>)} {props.options.map(({ value, label }, _) => <option key={value} value={value}>{label}</option>)} </select> ) diff --git a/mcc/src/client/AnimalRequest/text-area.tsx b/mcc/src/client/AnimalRequest/components/text-area.tsx similarity index 93% rename from mcc/src/client/AnimalRequest/text-area.tsx rename to mcc/src/client/AnimalRequest/components/text-area.tsx index d7e7b4845..d609f42a7 100644 --- a/mcc/src/client/AnimalRequest/text-area.tsx +++ b/mcc/src/client/AnimalRequest/components/text-area.tsx @@ -11,7 +11,6 @@ export default function TextArea(props) { } else { return ( <div className="tw-flex tw-flex-wrap"> - <Title text={props.placeholder}/> <textarea className={"tw-w-full tw-h-36 tw-px-3 tw-py-2 tw-text-base" + (props.isSubmitting && " tw-invalid ") + "tw-text-gray-700 tw-placeholder-gray-600 tw-border tw-rounded-lg focus:tw-shadow-outline"} name={props.id} aria-label={props.ariaLabel} id={props.id} placeholder={props.placeholder} required={props.required} defaultValue={props.defaultValue}/> </div> diff --git a/mcc/src/client/AnimalRequest/title.tsx b/mcc/src/client/AnimalRequest/components/title.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/title.tsx rename to mcc/src/client/AnimalRequest/components/title.tsx diff --git a/mcc/src/client/AnimalRequest/tooltip.tsx b/mcc/src/client/AnimalRequest/components/tooltip.tsx similarity index 91% rename from mcc/src/client/AnimalRequest/tooltip.tsx rename to mcc/src/client/AnimalRequest/components/tooltip.tsx index a9982718f..50f5fdb6f 100644 --- a/mcc/src/client/AnimalRequest/tooltip.tsx +++ b/mcc/src/client/AnimalRequest/components/tooltip.tsx @@ -4,7 +4,7 @@ import ReactTooltip from 'react-tooltip'; export default function Tooltip(props) { return ( <> - <svg data-tip={props.text} data-for={props.id} xmlns="http://www.w3.org/2000/svg" className="tw-h-6 tw-w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" tabIndex="-1"> + <svg data-tip={props.text} data-for={props.id} xmlns="http://www.w3.org/2000/svg" className="tw-h-6 tw-w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" tabIndex={-1}> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> diff --git a/mcc/src/client/AnimalRequest/values.ts b/mcc/src/client/AnimalRequest/components/values.ts similarity index 93% rename from mcc/src/client/AnimalRequest/values.ts rename to mcc/src/client/AnimalRequest/components/values.ts index 416f7c59d..d33c5247c 100644 --- a/mcc/src/client/AnimalRequest/values.ts +++ b/mcc/src/client/AnimalRequest/components/values.ts @@ -13,11 +13,6 @@ export const animalWellfarePlaceholder = "Animal welfare (proposed care and use) export const certificationLabel = "I certify and I have obtained approval for this study from my institution." -export const isPrincipalInvestigatorOptions = [ - { value: 'yes', label: 'Yes' }, - { value: 'no', label: 'No' }, -] - export const fundingSourceOptions = [ {value: 'nih', label: 'NIH-supported research'}, {value: 'other-federal', label: 'Other federal agency support'}, @@ -32,12 +27,17 @@ export const researchAreaOptions = [ {value: 'public-health', label: 'Public health emergency response (COVID or other)'}, {value: 'rare-disease', label: 'Rare disease research'}, {value: 'no-models', label: 'Paucity of existing disease animal models'}, - {value: 'nih-ic-interest', label: 'NIH IC interest'}, {value: 'new-colony-trans', label: 'Set up new breeding colony—transgenics'}, {value: 'new-colony-non-trans', label: 'Set up new breeding colony—not transgenics'}, {value: 'other', label: 'Other (specify)'}, ] +export const institutionTypeOptions = [ + {value: 'minorityServing', label: 'Minority serving'}, + {value: 'university', label: 'University/Non-profit'}, + {value: 'commercial', label: 'Commercial entity'} +] + export const existingMarmosetColonyOptions = [ {value: 'existing', label: 'Existing marmoset colony'}, {value: 'no-existing', label: 'No existing marmoset colony'}, diff --git a/mcc/src/client/AnimalRequest/yes-no-radio.tsx b/mcc/src/client/AnimalRequest/components/yes-no-radio.tsx similarity index 100% rename from mcc/src/client/AnimalRequest/yes-no-radio.tsx rename to mcc/src/client/AnimalRequest/components/yes-no-radio.tsx diff --git a/mcc/src/client/AnimalRequest/research-area.tsx b/mcc/src/client/AnimalRequest/research-area.tsx index 27415e873..522f9e89a 100644 --- a/mcc/src/client/AnimalRequest/research-area.tsx +++ b/mcc/src/client/AnimalRequest/research-area.tsx @@ -1,18 +1,19 @@ import React, { useState } from 'react'; -import Select from './select' -import Input from './input' -import Title from './title' -import ErrorMessageHandler from './error-message-handler' +import Select from './components/select' +import Input from './components/input' +import Title from './components/title' +import ErrorMessageHandler from './components/error-message-handler' -import { researchAreaOptions } from './values' +import { researchAreaOptions } from './components/values' export default function ResearchArea(props) { const [displayOther, setDisplayOther] = useState(props.defaultValue.researcharea == "other" ? true : false) - function setDisplayOtherField(value) { - if(value == "other") { + function setDisplayOtherField(el) { + const valArray = Array.prototype.map.call(el.selectedOptions, function(x){ return x.value }) + if (valArray && valArray.indexOf("other") > -1) { setDisplayOther(true) } else { setDisplayOther(false) @@ -22,14 +23,11 @@ export default function ResearchArea(props) { return ( <ErrorMessageHandler isSubmitting={props.isSubmitting} rerender={displayOther}> <div className="tw-w-full tw-px-3 tw-mb-10"> - <div className="tw-mb-6"> - <Title text="Research Area"/> - </div> - <div className="tw-w-full tw-mb-6"> - <Select id={props.id} options={researchAreaOptions} ariaLabel="Research Area" isSubmitting={props.isSubmitting} onChange={(e) => setDisplayOtherField(e.currentTarget.value)} defaultValue={props.defaultValue.researcharea} required={props.required}/> + <div className="tw-w-full tw-mb-8"> + <Select id={props.id} options={researchAreaOptions} ariaLabel="Research Area" multiSelect={true} isSubmitting={props.isSubmitting} onChange={(e) => setDisplayOtherField(e.currentTarget)} defaultValue={props.defaultValue.researcharea} required={props.required}/> </div> - <div className="tw-w-full tw-mb-6"> + <div className="tw-w-full tw-mb-8"> <Input id={props.id + "-other-specify"} ariaLabel="Other" isSubmitting={props.isSubmitting} placeholder="Please specify" display={displayOther} required={displayOther && props.required} defaultValue={props.defaultValue.otherjustification}/> </div> </div> diff --git a/mcc/src/client/Dashboard/Dashboard.tsx b/mcc/src/client/Dashboard/Dashboard.tsx index a898c5c26..bdf772750 100644 --- a/mcc/src/client/Dashboard/Dashboard.tsx +++ b/mcc/src/client/Dashboard/Dashboard.tsx @@ -29,7 +29,7 @@ export function Dashboard() { queryName: 'demographics', columns: 'Id,birth,death,gender/meaning,species,colony,calculated_status,u24_status,Id/age/AgeFriendly,Id/ageClass/label', success: function(results) { - setLiving(results.rows.filter(row => row.calculated_status === 'Alive')); + setLiving(results.rows.filter(row => row.calculated_status === 'Alive' || row.calculated_status === 'alive')); setu24Assigned(results.rows.filter(row => row.u24_status === true)); setDemographics(results.rows); }, diff --git a/mcc/src/client/RequestReview/app.tsx b/mcc/src/client/RequestReview/app.tsx new file mode 100644 index 000000000..1709dc8cb --- /dev/null +++ b/mcc/src/client/RequestReview/app.tsx @@ -0,0 +1,11 @@ +import React from 'react' +import ReactDOM from 'react-dom' + +import '../tailwind.css'; + +import { RequestView } from './request-review' + +// Need to wait for container element to be available in labkey wrapper before render +window.addEventListener('DOMContentLoaded', (event) => { + ReactDOM.render(<RequestView />, document.getElementById('app')); +}); diff --git a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx new file mode 100644 index 000000000..0c846df0c --- /dev/null +++ b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx @@ -0,0 +1,85 @@ +import React, { FormEvent, useState } from 'react'; +import { Filter, Query } from '@labkey/api'; +import { Box, Button, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; + +export default function InternalReviewForm(props: {requestId: string, readOnly?: boolean}) { + const [ recordData, setRecordData ] = useState(null) + + Query.selectRows({ + schemaName: "mcc", + queryName: "requestScores", + columns: [ + "rowid", + "preliminaryScore", + "resourceAvailabilityScore", + "researchAreaPriorityScore", + "proposalScore", + "comments", + "requestid" + ], + filterArray: [ + Filter.create('requestId', props.requestId) + ], + success: function (resp) { + setRecordData(resp.rows[0] ? {...resp.rows[0]} : {}) + }, + failure: function(response) { + alert(response.exception) + } + }) + + if (!recordData) { + return(<div>Loading...</div>) + } + + if (props.readOnly) { + return(<div>This needs to render a simple read-only table of the fields so RAB reviewers have this information</div>) + } + + const handleChange = (e) => { + recordData[e.target.name] = e.target.value ? e.target.value.trim() : null + setRecordData({...recordData}) + + console.log(e.target.name) + console.log(e.target.value.trim()) + console.log(recordData) + }; + + const onFormSubmit = (e: FormEvent) => { + e.preventDefault() + + console.log(recordData) + + // TODO: save this record and also update the original request record with new status + } + + return ( + <> + <h2>Enter MCC Review</h2> + <Box key={"mccReviewBox"} style={{display: 'inline-block'}}> + <form key={"internalReviewForm"} noValidate autoComplete='off' onSubmit={onFormSubmit}> + <Table width={500}> + <TableBody> + <TableRow> + <TableCell><TextField key={"preliminaryScore"} label={"Preliminary Score"} onChange={handleChange} variant={'outlined'} value={recordData.preliminaryScore || ''} disabled={true} fullWidth={true}/></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"researchAreaPriorityScore"} label={"Research Area Priority Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.researchAreaPriorityScore || ''} fullWidth={true} /></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"proposalScore"} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + </TableRow> + </TableBody> + </Table> + <Button key={"saveReviewBtn"} variant={"contained"} style={{marginRight: 10}} type={'submit'}>Save Review</Button> + </form> + </Box> + </> + ) +} \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx new file mode 100644 index 000000000..188147e2a --- /dev/null +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -0,0 +1,95 @@ +import { Filter, getServerContext, Query } from '@labkey/api'; +import React, { FormEvent, useState } from 'react'; +import { Box, Button, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; + +export default function RabReviewForm(props: {requestId: string, readOnly?: boolean}) { + const [ recordData, setRecordData ] = useState(null) + + const filters = [ + Filter.create('requestId', props.requestId) + ] + + // NOTE: consider re-naming this param. When readOnly=false, this form is used for the current user to enter their review. + // When readOnly=true, this is used to summarize the reviews from all reviewers. + if (!props.readOnly) { + filters.push(Filter.create('reviewerid', getServerContext().user.userId)) + } + + Query.selectRows({ + schemaName: "mcc", + queryName: "requestReviews", + columns: [ + "rowid", + "reviewerid", + "reviewerid/displayName", + "reviewerid/email", + "review", + "score", + "comments", + "requestid" + ], + filterArray: filters, + success: function (resp) { + if (!resp.rows.length) { + //TODO: error? + } + + if (resp.rows.review) { + //TODO: this indicates the review was already entered. Do we want to allow updates? + } + + setRecordData({...resp.rows[0]}) + }, + failure: function(response) { + alert(response.exception) + } + }) + + if (!recordData) { + return(<div>Loading...</div>) + } + + if (props.readOnly) { + return(<div>This needs to render a simple read-only table of the reviews</div>) + } + + const handleChange = (e) => { + recordData[e.target.name] = e.target.value ? e.target.value.trim() : null + setRecordData({...recordData}) + + console.log(e.target.name) + console.log(e.target.value.trim()) + console.log(recordData) + }; + + const onFormSubmit = (e: FormEvent) => { + e.preventDefault() + + console.log(recordData) + + // TODO: save this record and navigateBack to + } + + return ( + <> + <h2>Enter MCC Review</h2> + <form noValidate autoComplete='off' onSubmit={onFormSubmit}> + <Box style={{display: 'inline-block'}}> + <Table width={500}> + <TableBody> + <TableRow> + {/*TODO: this probably needs to be a select*/} + <TableCell><TextField key={"review"} label={"Review"} onChange={handleChange} variant={'outlined'} value={recordData.review || ''} disabled={true} fullWidth={true}/></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + </TableRow> + </TableBody> + </Table> + <p /> + <Button variant={"contained"} style={{marginRight: 10}} type={'submit'}>Submit Review</Button> + </Box> + </form> + </> + ) +} \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx new file mode 100644 index 000000000..404216904 --- /dev/null +++ b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx @@ -0,0 +1,218 @@ +import React from 'react'; +import { AnimalRequestModel, AnimalRequestProps } from '../../components/RequestUtils'; +import { + existingMarmosetColonyOptions, + existingNHPFacilityOptions, + IACUCApprovalOptions, + institutionTypeOptions, + researchAreaOptions +} from '../../AnimalRequest/components/values'; +import { Box, Button, Grid, makeStyles, Table, TableBody, TableCell, TableHead, TableRow } from '@material-ui/core'; +import { ActionURL } from '@labkey/api'; + +function formatPIName(request: AnimalRequestProps) { + return(formatName(request.lastname, request.firstname, request.middleinitial)) +} + +function formatName(lastname, firstname, middleinitial) { + if (!lastname) { + return('NOT ENTERED') + } + + return(lastname + ', ' + (firstname || 'NOT_ENTERED') + (middleinitial ? ' ' + middleinitial : '')) +} + +function findDisplayValue(value, translationMap) { + if (!value) { + return '' + } + + return translationMap.filter((rec) => rec.value == value).map((rec) => rec.label).join(', ') +} + +function translateRawToDisplayValue(value, translationMap: any[], isMulti = false) { + if (isMulti) { + return value.split(',').map((value) => findDisplayValue(value, translationMap)) + } + else { + return findDisplayValue(value, translationMap) + } +} +export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel}) { + const { requestData } = props + const styles = makeStyles({ + fieldLabel: { + fontSize: "14px", + fontWeight: "bold" + }, + tableHead: { + fontWeight: "bold" + } + })() + + if (!requestData?.dataLoaded) { + return null + } + + return( + <> + <h2>Request Details</h2> + <Box display={"inline-block"} style={{marginBottom: 30}}> + <h4 style={{marginTop: 10}}>General Information</h4> + <Grid container spacing={1} style={{marginLeft: 10}}> + <Grid item xs={2} className={styles.fieldLabel}> + PI Name: + </Grid> + <Grid item xs={10}> + {formatPIName(requestData.request)} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Early State Investigator: + </Grid> + <Grid item xs={10}> + {requestData.request.earlystageinvestigator ? 'Yes' : 'No'} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + <div>Institution: </div> + </Grid> + <Grid item xs={10}> + {requestData.request.institutionname || ''} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + <div>Institution City: </div> + </Grid> + <Grid item xs={10}> + {requestData.request.institutioncity}, {requestData.request.institutionstate} {requestData.request.institutioncountry} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + <div>Institution Type: </div> + </Grid> + <Grid item xs={10}> + {translateRawToDisplayValue(requestData.request.institutiontype, institutionTypeOptions)} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + <div>Signing Official: </div> + </Grid> + <Grid item xs={10}> + {formatName(requestData.request.officiallastname, requestData.request.officialfirstname, null)} + {requestData.request.officialemail ? ' (' + requestData.request.officialemail + ')' : ''} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + <div>Co-Investigators: </div> + </Grid> + <Grid item xs={10}> + {requestData.coinvestigators.length ? requestData.coinvestigators.map(coi => { + return([ + formatName(coi.lastname, coi.firstname, coi.middleinitial) + ': ' +coi.institutionname + ]) + }).join('<br>') : 'N/A'} + </Grid> + </Grid> + + <p /> + <h4 style={{marginTop: 10}}>Institutional Animal Facilities and Capabilities</h4> + <Grid container spacing={1} style={{marginLeft: 10}}> + <Grid item xs={2} className={styles.fieldLabel}> + Has Existing NHP Facilities: + </Grid> + <Grid item xs={10}> + {translateRawToDisplayValue(requestData.request.existingnhpfacilities, existingNHPFacilityOptions)} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Has Existing Marmoset Colony: + </Grid> + <Grid item xs={10}> + {translateRawToDisplayValue(requestData.request.existingmarmosetcolony, existingMarmosetColonyOptions)} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Plans to Breed Marmosets: + </Grid> + <Grid item xs={10}> + {requestData.request.isbreedinganimals} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Breeding Purpose: + </Grid> + <Grid item xs={10}> + {requestData.request.breedingpurpose || 'N/A'} + </Grid> + </Grid> + + <p /> + <h4 style={{marginTop: 10}}>Research Details</h4> + <Grid container spacing={1} style={{marginLeft: 10}}> + <Grid item xs={2} className={styles.fieldLabel}> + Research Area: + </Grid> + <Grid item xs={10}> + {translateRawToDisplayValue(requestData.request.researcharea, researchAreaOptions)} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Experimental Rationale: + </Grid> + <Grid item xs={10}> + {requestData.request.otherjustification} + </Grid> + + <Grid item xs={2} className={styles.fieldLabel}> + Animal Cohorts: + </Grid> + <Grid item xs={10}> + {requestData.cohorts.length ? ( + <Table style={{display: "inline-block"}} cellPadding={1} cellSpacing={1} > + <TableHead><TableRow key={"cohorts-header"}> + <TableCell className={styles.tableHead}>Number of Animals</TableCell><TableCell className={styles.tableHead}>Sex</TableCell><TableCell className={styles.tableHead}>Other Characteristics</TableCell> + </TableRow> + </TableHead> + <TableBody> + {requestData.cohorts.map(cohort => { + return( + <TableRow key={cohort.rowid}> + <TableCell>{cohort.numberofanimals}</TableCell> + <TableCell>{cohort.sex}</TableCell> + <TableCell>{cohort.othercharacteristics}</TableCell> + </TableRow> + ) + })} + </TableBody> + </Table> + ) : 'No cohorts entered'} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Methods Proposed: + </Grid> + <Grid item xs={10}> + {requestData.request.methodsproposed} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Collaborations: + </Grid> + <Grid item xs={10}> + {requestData.request.collaborations || 'N/A'} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Animal Welfare: + </Grid> + <Grid item xs={10}> + {requestData.request.animalwelfare} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Attending Veterinarian: + </Grid> + <Grid item xs={10}> + {requestData.request.vetlastname ? (requestData.request.vetlastname + (requestData.request.vetfirstname ? ', ' + requestData.request.vetfirstname : '')) : ''} + {requestData.request.vetemail ? ' (' + requestData.request.vetemail + ')' : ''} + </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + IACUC Approval: + </Grid> + <Grid item xs={10}> + {translateRawToDisplayValue(requestData.request.iacucprotocol, IACUCApprovalOptions)} + </Grid> + </Grid> + <p /> + <Button variant={"contained"} style={{marginLeft: 10}} href={ActionURL.buildURL('mcc', 'animalRequest', null, {requestId: requestData.request.objectid})}>Edit Request</Button> + </Box> + </> + ) +} \ No newline at end of file diff --git a/mcc/src/client/RequestReview/request-review.tsx b/mcc/src/client/RequestReview/request-review.tsx new file mode 100644 index 000000000..fd7a19a8a --- /dev/null +++ b/mcc/src/client/RequestReview/request-review.tsx @@ -0,0 +1,92 @@ +import React, { useState } from 'react'; +import { AnimalRequestModel, queryRequestInformation } from '../components/RequestUtils'; +import { default as ReadOnlyRequest } from './components/ReadOnlyRequest'; +import Title from '../AnimalRequest/components/title'; +import RabReviewForm from './components/RabReviewForm'; +import InternalReviewForm from './components/InternalReviewForm'; + +import { ThemeProvider } from '@material-ui/styles'; +import { createTheme } from '@material-ui/core/styles'; +import '../labkeyOverrides.css'; + +export function RequestView() { + const mode = (new URLSearchParams(window.location.search)).get("mode") + const requestId = (new URLSearchParams(window.location.search)).get("requestId") + + const [requestData, setRequestData] = useState<AnimalRequestModel>(null) + + if (!requestId) { + return(<div>No request Id provided</div>) + } + + if (!mode) { + return(<div>Must provide the mode parameter for this page on the URL</div>) + } + + if (!requestData) { + queryRequestInformation(requestId, handleFailure).then((model) => { + setRequestData(model) + }) + } + + if (!requestData || !requestData?.dataLoaded) { + return ( + <div className="tw-flex tw-justify-center tw-items-center"> + <div style={{ borderBottom: "2px solid #3495d2" }} className="tw-animate-spin tw-rounded-full tw-h-32 tw-w-32"></div> + </div> + ) + } + else if (requestData.dataLoaded === true && !requestData.request) { + return(<Title text="No such request."/>) + } + + function handleFailure(response) { + alert(response.exception) //this is probably what you want to show. An example would be to submit data with a long value for middle initial (>14 characters) + + setRequestData(requestData) + } + + let reviewForms = null + switch (mode) { + case "primaryReview": + reviewForms = [ + <InternalReviewForm key={"internalReviewForm"} requestId={requestId}/> + ] + break + case "rabReview": + reviewForms = ( + <> + <InternalReviewForm key={"internalReviewForm"} requestId={requestId} readOnly={true}/> + <RabReviewForm key={"rabReviewForm"} requestId={requestId}/> + </> + ) + break + case "finalReview": + reviewForms = ( + <> + <RabReviewForm key={"rabReviewForm"} requestId={requestId} readOnly={true}/> + <InternalReviewForm key={"internalReviewForm"} requestId={requestId}/> + </> + ) + break + } + + const theme = createTheme({ + overrides: { + MuiTableCell: { + root: { + borderBottom: "none" + } + } + } + }); + + return( + <> + <ThemeProvider theme={theme}> + <ReadOnlyRequest requestData={requestData} /> + {reviewForms} + </ThemeProvider> + </> + ) +} \ No newline at end of file diff --git a/mcc/src/client/components/RequestUtils.tsx b/mcc/src/client/components/RequestUtils.tsx new file mode 100644 index 000000000..ed79c4101 --- /dev/null +++ b/mcc/src/client/components/RequestUtils.tsx @@ -0,0 +1,187 @@ +import React from 'react'; +import { Filter, Query } from '@labkey/api'; +import { v4 as uuidv4 } from 'uuid'; + +export class AnimalRequestModel { + request: AnimalRequestProps = new AnimalRequestProps(); + coinvestigators: CoInvestigatorModel[] = []; + cohorts: AnimalCohort[] = []; + dataLoaded: boolean = false; +} + +export class AnimalRequestProps { + status: string = 'Draft'; + middleinitial: string; + lastname: string; + firstname: string; + earlystageinvestigator: string; + institutionname: string; + institutioncity: string; + institutionstate: string; + institutioncountry: string; + institutiontype: string; + officiallastname: string; + officialfirstname: string; + officialemail: string; + experimentalrationale: string; + isbreedinganimals: boolean; + breedingpurpose: string; + methodsproposed: string; + collaborations: string; + researcharea: string; + otherjustification: string; + iacucprotocol: string; + existingmarmosetcolony: string; + existingnhpfacilities: string; + rowid: number; + certify: boolean; + animalwelfare: string; + vetlastname: string; + vetemail: string; + vetfirstname: string; + objectid: string; +} + +export class CoInvestigatorModel { + rowid: number; + requestId: string; + lastname: string; + firstname: string; + middleinitial: string; + institutionname: string; + uuid: string = uuidv4(); +} + +export class AnimalCohort { + rowid: number; + requestId: string; + numberofanimals: number; + sex: string; + othercharacteristics: string; + uuid: string = uuidv4(); +} + +export async function queryRequestInformation(requestId, handleFailure) { + const requestData = new AnimalRequestModel() + + if (!requestId) { + requestData.dataLoaded = true + requestData.cohorts = [new AnimalCohort()] + return(requestData) + } + + const promises = [new Promise<any>((resolve, reject) => { + Query.selectRows({ + schemaName: "mcc", + queryName: "animalrequests", + columns: [ + "rowid", + "objectId", + "lastname", + "firstname", + "middleinitial", + "earlystageinvestigator", + "institutionname", + "institutioncity", + "institutionstate", + "institutioncountry", + "institutiontype", + "officiallastname", + "officialfirstname", + "officialemail", + "fundingsource", + "experimentalrationale", + "methodsproposed", + "collaborations", + "isbreedinganimals", + "breedingpurpose", + "researcharea", + "otherjustification", + "existingmarmosetcolony", + "existingnhpfacilities", + "animalwelfare", + "certify", + "vetlastname", + "vetfirstname", + "vetemail", + "iacucapproval", + "iacucprotocol", + "grantnumber", + "applicationduedate", + "status" + ], + filterArray: [ + Filter.create('objectId', requestId) + ], + success: function (resp) { + resolve(resp.rows[0]) + }, + failure: handleFailure + }) + }), + new Promise<any>((resolve, reject) => { + Query.selectRows({ + schemaName: "mcc", + queryName: "coinvestigators", + columns: [ + "rowid", + "requestId", + "lastname", + "firstname", + "middleinitial", + "institutionname", + ], + filterArray: [ + Filter.create('requestId', requestId) + ], + success: function (resp) { + if (resp.rows.length) { + // NOTE: this property is purely for client-side UI and not persisted in the DB, so create a value + resp.rows.map(c => c.uuid = uuidv4()) + } + + resolve(resp.rows) + }, + failure: handleFailure + }) + }), + new Promise<any>((resolve, reject) => { + Query.selectRows({ + schemaName: "mcc", + queryName: "requestcohorts", + columns: [ + "rowid", + "requestId", + "numberofanimals", + "sex", + "othercharacteristics", + ], + filterArray: [ + Filter.create('requestId', requestId) + ], + success: function (resp) { + // NOTE: abort so that we preserve the default value of one empty row + if (!resp.rows.length) { + requestData.cohorts = [new AnimalCohort()] + } else { + requestData.cohorts = resp.rows + + // NOTE: this property is purely for client-side UI and not persisted in the DB, so create a value + requestData.cohorts.map(c => c.uuid = uuidv4()) + } + + resolve(requestData.cohorts) + }, + failure: handleFailure + }) + })] + + return await Promise.all(promises).then(values => { + requestData.request = values[0] + requestData.coinvestigators = values[1] + requestData.cohorts = values[2] + requestData.dataLoaded = true + + return(requestData) + }) +} diff --git a/mcc/src/client/entryPoints.js b/mcc/src/client/entryPoints.js index 9a628fda2..eedf6e4b8 100644 --- a/mcc/src/client/entryPoints.js +++ b/mcc/src/client/entryPoints.js @@ -15,5 +15,11 @@ module.exports = { title: 'Animal Requests', permission: 'read', path: './src/client/AnimalRequest' + },{ + name: 'requestReview', + title: 'Animal Request Review', + permission: 'read', + template: 'home', + path: './src/client/RequestReview' }] }; diff --git a/mcc/src/client/labkeyOverrides.css b/mcc/src/client/labkeyOverrides.css new file mode 100644 index 000000000..75c029ff8 --- /dev/null +++ b/mcc/src/client/labkeyOverrides.css @@ -0,0 +1,3 @@ +html { + font-size: 16px !important; +} diff --git a/mcc/src/client/AnimalRequest/tailwind.config.js b/mcc/src/client/tailwind.config.js similarity index 100% rename from mcc/src/client/AnimalRequest/tailwind.config.js rename to mcc/src/client/tailwind.config.js diff --git a/mcc/src/client/AnimalRequest/tailwind.css b/mcc/src/client/tailwind.css similarity index 100% rename from mcc/src/client/AnimalRequest/tailwind.css rename to mcc/src/client/tailwind.css diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index 954e45e07..c7671dade 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -69,6 +69,7 @@ import javax.mail.Message; import javax.mail.internet.InternetAddress; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -528,6 +529,63 @@ public void setComment(String comment) } } + @RequiresPermission(AdminPermission.class) + public class ConfigureMccAction extends ConfirmAction<Object> + { + @Override + public ModelAndView getConfirmView(Object o, BindException errors) throws Exception + { + setTitle("Configure MCC"); + + StringBuilder sb = new StringBuilder(); + sb.append("This will ensure various settings required by MCC are configured on this server. Do you want to continue?"); + + return new HtmlView(HtmlString.unsafe(sb.toString())); + } + + @Override + public boolean handlePost(Object o, BindException errors) throws Exception + { + + + return true; + } + + @Override + public void validateCommand(Object o, Errors errors) + { + Container mccContainer = MccManager.get().getMCCContainer(); + if (mccContainer == null) + { + + } + + Container requestContainer = MccManager.get().getMCCRequestContainer(); + if (requestContainer == null) + { + + } + + for (String gn : Arrays.asList(MccManager.REQUEST_GROUP_NAME, MccManager.ANIMAL_GROUP_NAME, MccManager.REQUEST_REVIEW_GROUP_NAME)) + { + Group g1 = GroupManager.getGroup(ContainerManager.getRoot(), gn, GroupEnumType.SITE); + if (g1 == null) + { + g1 = SecurityManager.createGroup(ContainerManager.getRoot(), MccManager.REQUEST_GROUP_NAME); + } + } + + //TODO + } + + @NotNull + @Override + public URLHelper getSuccessURL(Object o) + { + return PageFlowUtil.urlProvider(PipelineUrls.class).urlBegin(getContainer()); + } + } + @RequiresPermission(AdminPermission.class) public class ResetZimsRuntimeAction extends ConfirmAction<Object> { @@ -599,4 +657,8 @@ public URLHelper getSuccessURL(Object o) return PageFlowUtil.urlProvider(PipelineUrls.class).urlBegin(getContainer()); } } + + //TODO: + // assign to reviewers + } diff --git a/mcc/src/org/labkey/mcc/MccMaintenanceTask.java b/mcc/src/org/labkey/mcc/MccMaintenanceTask.java new file mode 100644 index 000000000..336e4f7eb --- /dev/null +++ b/mcc/src/org/labkey/mcc/MccMaintenanceTask.java @@ -0,0 +1,5 @@ +package org.labkey.mcc; + +public class MccMaintenanceTask +{ +} diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index e227dcfd0..d0f00fbe3 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -30,6 +30,9 @@ import org.labkey.api.security.UserManager; import org.labkey.api.security.UserPrincipal; import org.labkey.api.security.ValidEmail; +import org.labkey.api.security.permissions.Permission; +import org.labkey.mcc.security.MccRequestAdminPermission; +import org.labkey.mcc.security.MccRequestorPermission; import javax.mail.Address; import java.io.File; @@ -40,6 +43,35 @@ public class MccManager { private static final Logger _log = LogManager.getLogger(MccManager.class); + public enum RequestStatus + { + Draft(1, "Draft", MccRequestorPermission.class), + Submitted(2, "Submitted", MccRequestorPermission.class), + FormCheck(3, "Internal Review", MccRequestAdminPermission.class), + RabReview(4, "RAB Review", MccRequestAdminPermission.class), + FinalReview(5, "Final Review", MccRequestAdminPermission.class), + Approved(6, "Approved", MccRequestAdminPermission.class), + Rejected(7, "Rejected", MccRequestAdminPermission.class), + Processing(8, "Processing", MccRequestAdminPermission.class), + Fulfilled(8, "Fulfilled", MccRequestAdminPermission.class); + + int sortOrder; + String label; + Class<? extends Permission> editPermission; + + RequestStatus(int sortOrder, String label, Class<? extends Permission> editPermission) + { + this.sortOrder = sortOrder; + this.label = label; + this.editPermission = editPermission; + } + + public boolean canEdit(User u, Container c) + { + return c.hasPermission(u, this.editPermission); + } + } + public static final String ContainerPropName = "MCCContainer"; public static final String NotifyPropName = "MCCContactUsers"; public static final String MCCRequestNotificationUsers = "MCCRequestNotificationUsers"; @@ -49,6 +81,7 @@ public class MccManager public static final String MCC_GROUP_NAME = "MCC Users"; public static final String ANIMAL_GROUP_NAME = "MCC Animal Data Access"; public static final String REQUEST_GROUP_NAME = "MCC Animal Requestors"; + public static final String REQUEST_REVIEW_GROUP_NAME = "MCC RAB Members"; private static final MccManager _instance = new MccManager(); @@ -73,6 +106,11 @@ public Container getMCCRequestContainer() return ContainerManager.getForPath(path); } + public String getMccAdminEmail() + { + return "mcc@ohsu.edu"; + } + public Container getMCCContainer() { Module m = ModuleLoader.getInstance().getModule(MccModule.NAME); @@ -84,6 +122,18 @@ public Container getMCCContainer() return ContainerManager.getForPath(path); } + public boolean isRequestAdmin(User u) + { + Container c = getMCCRequestContainer(); + if (c == null) + { + _log.error("MccManager.isRequestAdmin called, but MCCRequestContainer has not been set"); + return false; + } + + return c.hasPermission(u, MccRequestAdminPermission.class); + } + public File getZimsImportFolder(Container c) { Module m = ModuleLoader.getInstance().getModule(MccModule.NAME); diff --git a/mcc/src/org/labkey/mcc/MccModule.java b/mcc/src/org/labkey/mcc/MccModule.java index 979dcba5c..5c17604fe 100644 --- a/mcc/src/org/labkey/mcc/MccModule.java +++ b/mcc/src/org/labkey/mcc/MccModule.java @@ -50,7 +50,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 20.008; + return 20.010; } @Override diff --git a/mcc/src/org/labkey/mcc/MccSchema.java b/mcc/src/org/labkey/mcc/MccSchema.java index f1ab31378..1745b67bb 100644 --- a/mcc/src/org/labkey/mcc/MccSchema.java +++ b/mcc/src/org/labkey/mcc/MccSchema.java @@ -28,6 +28,9 @@ public class MccSchema public static final String TABLE_USER_REQUESTS = "userRequests"; public static final String TABLE_ETL_TRANSLATIONS = "etltranslations"; public static final String TABLE_ANIMAL_MAPPING = "animalMapping"; + public static final String TABLE_ANIMAL_REQUESTS = "animalRequests"; + public static final String TABLE_REQUEST_REVIEWS = "requestReviews"; + public static final String TABLE_REQUEST_SCORE = "requestScores"; public static MccSchema getInstance() { diff --git a/mcc/src/org/labkey/mcc/MccUserSchema.java b/mcc/src/org/labkey/mcc/MccUserSchema.java index cfcd60fc1..309665611 100644 --- a/mcc/src/org/labkey/mcc/MccUserSchema.java +++ b/mcc/src/org/labkey/mcc/MccUserSchema.java @@ -6,8 +6,14 @@ import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbSchema; import org.labkey.api.data.TableInfo; +import org.labkey.api.ldk.table.CustomPermissionsTable; import org.labkey.api.query.SimpleUserSchema; import org.labkey.api.security.User; +import org.labkey.api.security.permissions.DeletePermission; +import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.security.permissions.UpdatePermission; +import org.labkey.mcc.security.MccRequestAdminPermission; public class MccUserSchema extends SimpleUserSchema { @@ -20,6 +26,17 @@ public MccUserSchema(User user, Container container, DbSchema dbschema) @Nullable protected TableInfo createWrappedTable(String name, @NotNull TableInfo schemaTable, ContainerFilter cf) { + if (MccSchema.TABLE_REQUEST_REVIEWS.equalsIgnoreCase(name) || MccSchema.TABLE_REQUEST_SCORE.equalsIgnoreCase(name)) + { + CustomPermissionsTable<?> ret = new CustomPermissionsTable<>(this, schemaTable, cf); + ret.addPermissionMapping(ReadPermission.class, MccRequestAdminPermission.class); + ret.addPermissionMapping(InsertPermission.class, MccRequestAdminPermission.class); + ret.addPermissionMapping(UpdatePermission.class, MccRequestAdminPermission.class); + ret.addPermissionMapping(DeletePermission.class, MccRequestAdminPermission.class); + + return ret.init(); + } + return super.createWrappedTable(name, schemaTable, cf); } } diff --git a/mcc/src/org/labkey/mcc/query/AbstractMccDisplayColumn.java b/mcc/src/org/labkey/mcc/query/AbstractMccDisplayColumn.java new file mode 100644 index 000000000..44065cf7c --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/AbstractMccDisplayColumn.java @@ -0,0 +1,43 @@ +package org.labkey.mcc.query; + +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.DataColumn; +import org.labkey.api.query.FieldKey; + +public abstract class AbstractMccDisplayColumn extends DataColumn +{ + public AbstractMccDisplayColumn(ColumnInfo colInfo) + { + super(colInfo); + } + + protected FieldKey getBoundKey(String... colNames) + { + FieldKey ret = null; + for (String colName : colNames) + { + if (ret == null) + { + ret = new FieldKey(getBoundColumn().getFieldKey().getParent(), colName); + } + else + { + ret = ret.append(colName); + } + } + + return ret; + } + + @Override + public boolean isFilterable() + { + return false; + } + + @Override + public boolean isSortable() + { + return false; + } +} diff --git a/mcc/src/org/labkey/mcc/query/AnimalRequestActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/AnimalRequestActionsDisplayColumnFactory.java new file mode 100644 index 000000000..7b85c29ca --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/AnimalRequestActionsDisplayColumnFactory.java @@ -0,0 +1,45 @@ +package org.labkey.mcc.query; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.DisplayColumn; +import org.labkey.api.data.DisplayColumnFactory; +import org.labkey.api.data.RenderContext; +import org.labkey.api.query.FieldKey; +import org.labkey.api.security.User; +import org.labkey.api.security.UserManager; +import org.labkey.mcc.MccManager; + +import java.io.IOException; +import java.io.Writer; +import java.util.Set; + +public class AnimalRequestActionsDisplayColumnFactory implements DisplayColumnFactory +{ + private static final Logger _log = LogManager.getLogger(AnimalRequestActionsDisplayColumnFactory.class); + + @Override + public DisplayColumn createRenderer(ColumnInfo colInfo) + { + return new AbstractMccDisplayColumn(colInfo) + { + @Override + public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + { + int rowId = ctx.get(getBoundKey("rowid"), Integer.class); + out.write("<a class=\"labkey-text-link\" href=\"mailto:" + MccManager.get().getMccAdminEmail() + "?subject=MCC Request #" + rowId + "\">Contact MCC</a>"); + } + + @Override + public void addQueryFieldKeys(Set<FieldKey> keys) + { + super.addQueryFieldKeys(keys); + + keys.add(getBoundKey("rowid")); + keys.add(getBoundKey("createdby")); + keys.add(getBoundKey("status")); + } + }; + } +} diff --git a/mcc/src/org/labkey/mcc/query/MccRequest.java b/mcc/src/org/labkey/mcc/query/MccRequest.java new file mode 100644 index 000000000..6b9ef28ce --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/MccRequest.java @@ -0,0 +1,451 @@ +package org.labkey.mcc.query; + +import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.TableSelector; +import org.labkey.api.query.FieldKey; +import org.labkey.mcc.MccSchema; + +import java.util.Date; + +public class MccRequest +{ + private int _rowId; + private String _lastname; + private String _firstname; + private String _middleinitial; + private Boolean _isprincipalinvestigator; + + + private String _institutionname; + private String _institutioncity; + private String _institutionstate; + private String _institutioncountry; + private String _institutiontype; + private String _officiallastname; + private String _officialfirstname; + private String _officialemail; + private String _fundingsource; + private String _grantnumber; + + private Date _applicationduedate; + private String _experimentalrationale; + private String _methodsproposed; + private String _collaborations; + private Boolean _isbreedinganimals; + private String _breedingpurpose; + private String _otherjustification; + private Boolean _existingmarmosetcolony; + private Boolean _existingnhpfacilities; + private String _animalwelfare; + private Boolean _certify; + private String _vetlastname; + private String _vetfirstname; + private String _vetemail; + private String _iacucapproval; + private String _iacucprotocol; + private String _status; + + private String _objectId; + private String _container; + private Date _created; + private int _createdby; + private Date _modified; + private int _modifiedby; + + public MccRequest() + { + + } + + public int getRowId() + { + return _rowId; + } + + public void setRowId(int rowId) + { + _rowId = rowId; + } + + public String getLastname() + { + return _lastname; + } + + public void setLastname(String lastname) + { + _lastname = lastname; + } + + public String getFirstname() + { + return _firstname; + } + + public void setFirstname(String firstname) + { + _firstname = firstname; + } + + public String getMiddleinitial() + { + return _middleinitial; + } + + public void setMiddleinitial(String middleinitial) + { + _middleinitial = middleinitial; + } + + public Boolean getIsprincipalinvestigator() + { + return _isprincipalinvestigator; + } + + public void setIsprincipalinvestigator(Boolean isprincipalinvestigator) + { + _isprincipalinvestigator = isprincipalinvestigator; + } + + public String getInstitutionname() + { + return _institutionname; + } + + public void setInstitutionname(String institutionname) + { + _institutionname = institutionname; + } + + public String getInstitutioncity() + { + return _institutioncity; + } + + public void setInstitutioncity(String institutioncity) + { + _institutioncity = institutioncity; + } + + public String getInstitutionstate() + { + return _institutionstate; + } + + public void setInstitutionstate(String institutionstate) + { + _institutionstate = institutionstate; + } + + public String getInstitutioncountry() + { + return _institutioncountry; + } + + public void setInstitutioncountry(String institutioncountry) + { + _institutioncountry = institutioncountry; + } + + public String getInstitutiontype() + { + return _institutiontype; + } + + public void setInstitutiontype(String institutiontype) + { + _institutiontype = institutiontype; + } + + public String getOfficiallastname() + { + return _officiallastname; + } + + public void setOfficiallastname(String officiallastname) + { + _officiallastname = officiallastname; + } + + public String getOfficialfirstname() + { + return _officialfirstname; + } + + public void setOfficialfirstname(String officialfirstname) + { + _officialfirstname = officialfirstname; + } + + public String getOfficialemail() + { + return _officialemail; + } + + public void setOfficialemail(String officialemail) + { + _officialemail = officialemail; + } + + public String getFundingsource() + { + return _fundingsource; + } + + public void setFundingsource(String fundingsource) + { + _fundingsource = fundingsource; + } + + public String getGrantnumber() + { + return _grantnumber; + } + + public void setGrantnumber(String grantnumber) + { + _grantnumber = grantnumber; + } + + public Date getApplicationduedate() + { + return _applicationduedate; + } + + public void setApplicationduedate(Date applicationduedate) + { + _applicationduedate = applicationduedate; + } + + public String getExperimentalrationale() + { + return _experimentalrationale; + } + + public void setExperimentalrationale(String experimentalrationale) + { + _experimentalrationale = experimentalrationale; + } + + public String getMethodsproposed() + { + return _methodsproposed; + } + + public void setMethodsproposed(String methodsproposed) + { + _methodsproposed = methodsproposed; + } + + public String getCollaborations() + { + return _collaborations; + } + + public void setCollaborations(String collaborations) + { + _collaborations = collaborations; + } + + public Boolean getIsbreedinganimals() + { + return _isbreedinganimals; + } + + public void setIsbreedinganimals(Boolean isbreedinganimals) + { + _isbreedinganimals = isbreedinganimals; + } + + public String getBreedingpurpose() + { + return _breedingpurpose; + } + + public void setBreedingpurpose(String breedingpurpose) + { + _breedingpurpose = breedingpurpose; + } + + public String getOtherjustification() + { + return _otherjustification; + } + + public void setOtherjustification(String otherjustification) + { + _otherjustification = otherjustification; + } + + public Boolean getExistingmarmosetcolony() + { + return _existingmarmosetcolony; + } + + public void setExistingmarmosetcolony(Boolean existingmarmosetcolony) + { + _existingmarmosetcolony = existingmarmosetcolony; + } + + public Boolean getExistingnhpfacilities() + { + return _existingnhpfacilities; + } + + public void setExistingnhpfacilities(Boolean existingnhpfacilities) + { + _existingnhpfacilities = existingnhpfacilities; + } + + public String getAnimalwelfare() + { + return _animalwelfare; + } + + public void setAnimalwelfare(String animalwelfare) + { + _animalwelfare = animalwelfare; + } + + public Boolean getCertify() + { + return _certify; + } + + public void setCertify(Boolean certify) + { + _certify = certify; + } + + public String getVetlastname() + { + return _vetlastname; + } + + public void setVetlastname(String vetlastname) + { + _vetlastname = vetlastname; + } + + public String getVetfirstname() + { + return _vetfirstname; + } + + public void setVetfirstname(String vetfirstname) + { + _vetfirstname = vetfirstname; + } + + public String getVetemail() + { + return _vetemail; + } + + public void setVetemail(String vetemail) + { + _vetemail = vetemail; + } + + public String getIacucapproval() + { + return _iacucapproval; + } + + public void setIacucapproval(String iacucapproval) + { + _iacucapproval = iacucapproval; + } + + public String getIacucprotocol() + { + return _iacucprotocol; + } + + public void setIacucprotocol(String iacucprotocol) + { + _iacucprotocol = iacucprotocol; + } + + public String getStatus() + { + return _status; + } + + public void setStatus(String status) + { + _status = status; + } + + public String getObjectId() + { + return _objectId; + } + + public void setObjectId(String objectId) + { + _objectId = objectId; + } + + public String getContainer() + { + return _container; + } + + public void setContainer(String container) + { + _container = container; + } + + public Date getCreated() + { + return _created; + } + + public void setCreated(Date created) + { + _created = created; + } + + public int getCreatedby() + { + return _createdby; + } + + public void setCreatedby(int createdby) + { + _createdby = createdby; + } + + public Date getModified() + { + return _modified; + } + + public void setModified(Date modified) + { + _modified = modified; + } + + public int getModifiedby() + { + return _modifiedby; + } + + public void setModifiedby(int modifiedby) + { + _modifiedby = modifiedby; + } + + public static MccRequest getForId(String objectId) + { + return new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS)).getObject(objectId, MccRequest.class); + } + + public static MccRequest getForRowId(int rowId) + { + SimpleFilter filter = new SimpleFilter(FieldKey.fromString("rowid"), rowId); + + return new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS), filter, null).getObject(MccRequest.class); + } +} diff --git a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java new file mode 100644 index 000000000..a2f492843 --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java @@ -0,0 +1,60 @@ +package org.labkey.mcc.query; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.Container; +import org.labkey.api.data.DataColumn; +import org.labkey.api.data.DisplayColumn; +import org.labkey.api.data.DisplayColumnFactory; +import org.labkey.api.data.RenderContext; +import org.labkey.api.query.DetailsURL; +import org.labkey.api.query.FieldKey; +import org.labkey.api.security.User; +import org.labkey.api.security.UserManager; +import org.labkey.mcc.MccManager; + +import java.io.IOException; +import java.io.Writer; +import java.util.Set; + +public class RequestReviewActionsDisplayColumnFactory implements DisplayColumnFactory +{ + private static final Logger _log = LogManager.getLogger(RequestReviewActionsDisplayColumnFactory.class); + + @Override + public DisplayColumn createRenderer(ColumnInfo colInfo) + { + return new AbstractMccDisplayColumn(colInfo) + { + @Override + public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + { + int userId = ctx.get(getBoundKey("reviewerId"), Integer.class); + User u = UserManager.getUser(userId); + if (u == null) + { + _log.error("Unknown user: " + userId + " for MCC review record " + userId, new Exception()); + return; + } + + String requestId = ctx.get(getBoundKey("requestId"), String.class); + + Container requestContainer = MccManager.get().getMCCRequestContainer(); + DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=rabReview", requestContainer); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Review</a>"); + } + + @Override + public void addQueryFieldKeys(Set<FieldKey> keys) + { + super.addQueryFieldKeys(keys); + + keys.add(getBoundKey("container")); + keys.add(getBoundKey("requestid")); + keys.add(getBoundKey("rowid")); + keys.add(getBoundKey("reviewerId")); + } + }; + } +} diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java new file mode 100644 index 000000000..82b043300 --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -0,0 +1,113 @@ +package org.labkey.mcc.query; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.Container; +import org.labkey.api.data.DataColumn; +import org.labkey.api.data.DisplayColumn; +import org.labkey.api.data.DisplayColumnFactory; +import org.labkey.api.data.RenderContext; +import org.labkey.api.query.DetailsURL; +import org.labkey.api.query.FieldKey; +import org.labkey.api.security.User; +import org.labkey.api.security.UserManager; +import org.labkey.api.view.template.ClientDependency; +import org.labkey.mcc.MccManager; + +import java.io.IOException; +import java.io.Writer; +import java.util.Set; + +public class RequestScoreActionsDisplayColumnFactory implements DisplayColumnFactory +{ + private static final Logger _log = LogManager.getLogger(RequestScoreActionsDisplayColumnFactory.class); + + @Override + public DisplayColumn createRenderer(ColumnInfo colInfo) + { + return new AbstractMccDisplayColumn(colInfo) + { + @Override + public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + { + int rowId = ctx.get(getBoundKey("rowid"), Integer.class); + if (MccManager.get().isRequestAdmin(ctx.getViewContext().getUser())) + { + int userId = ctx.get(getBoundKey("createdby"), Integer.class); + User u = UserManager.getUser(userId); + if (u == null) + { + _log.error("Unknown user: " + userId + " for MCC request " + rowId, new Exception()); + return; + } + + out.write("<a class=\"labkey-text-link\" href=\"mailto:" + u.getEmail() + "?subject=MCC Request #" + rowId + "\">Contact Investigator</a>"); + } + + String status = ctx.get(getBoundKey("requestId", "status"), String.class); + if (status == null) + { + _log.error("MCC Request lacks status: " + rowId, new Exception()); + } + else + { + try + { + String requestId = ctx.get(getBoundKey("requestId"), String.class); + + MccManager.RequestStatus st = MccManager.RequestStatus.valueOf(status); + Container requestContainer = MccManager.get().getMCCRequestContainer(); + if (requestContainer == null) + { + _log.error("RequestScoreActionsDisplayColumnFactory was called, but MCCRequestContainer is not set", new Exception()); + return; + } + + if (st == MccManager.RequestStatus.Submitted) + { + DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=primaryReview", requestContainer); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter MCC Internal Review</a>"); + } + else if (st == MccManager.RequestStatus.FormCheck) + { + out.write("<br><a class=\"labkey-text-link\" href=\"javascript:void(0)\">Submit For RAB Review</a>"); + } + else if (st == MccManager.RequestStatus.RabReview) + { + DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Final Review</a>"); + } + else if (st == MccManager.RequestStatus.Approved) + { + out.write("<br><a class=\"labkey-text-link\" href=\"javascript:alert('This is not enabled yet')\">Update Animal Status</a>"); + } + } + catch (IllegalArgumentException e) + { + _log.error("Unknown MCC Request status: " + rowId, new Exception()); + } + } + } + + @Override + public void addQueryFieldKeys(Set<FieldKey> keys) + { + super.addQueryFieldKeys(keys); + + keys.add(getBoundKey("rowid")); + keys.add(getBoundKey("createdby")); + keys.add(getBoundKey("requestId")); + keys.add(getBoundKey("requestId/status")); + } + + @Override + public @NotNull Set<ClientDependency> getClientDependencies() + { + //TODO + return super.getClientDependencies(); + } + }; + } +} diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 060d06ac8..6b7955675 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -3,6 +3,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; +import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.DbSchema; @@ -10,28 +12,36 @@ import org.labkey.api.data.DbSequence; import org.labkey.api.data.DbSequenceManager; import org.labkey.api.data.SimpleFilter; -import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; +import org.labkey.api.query.BatchValidationException; import org.labkey.api.query.DetailsURL; +import org.labkey.api.query.DuplicateKeyException; import org.labkey.api.query.FieldKey; +import org.labkey.api.query.InvalidKeyException; import org.labkey.api.query.QueryService; +import org.labkey.api.query.QueryUpdateServiceException; +import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; import org.labkey.api.security.permissions.DeletePermission; import org.labkey.api.settings.AppProps; -import org.labkey.api.util.ExceptionUtil; import org.labkey.api.util.MailHelper; +import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.UnauthorizedException; import org.labkey.mcc.MccManager; import org.labkey.mcc.MccSchema; import javax.mail.Address; import javax.mail.Message; -import javax.mail.internet.InternetAddress; import java.sql.SQLException; -import java.util.HashSet; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * Created by bimber @@ -76,7 +86,79 @@ public boolean isAliasInUse(String alias) return new TableSelector(_animalMapping, new SimpleFilter(FieldKey.fromString("externalAlias"), alias), null).exists(); } - public void sendNotification(int rowid) { + public void ensureReviewRecordsCreated(String objectId, String status, @Nullable String previousStatus, int score) + { + try + { + MccManager.RequestStatus st = MccManager.RequestStatus.valueOf(status); + if (st == MccManager.RequestStatus.Draft) + { + return; + } + + TableSelector ts = new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_REQUEST_SCORE), PageFlowUtil.set("rowid", "preliminaryScore"), new SimpleFilter(FieldKey.fromString("requestid"), objectId), null); + if (!ts.exists()) + { + Map<String, Object> toInsert = new CaseInsensitiveHashMap<>(); + toInsert.put("requestId", objectId); + toInsert.put("preliminaryScore", score); + + toInsert.put("container", _container); + toInsert.put("created", new Date()); + toInsert.put("createdby", _user.getUserId()); + toInsert.put("modified", new Date()); + toInsert.put("modifiedby", _user.getUserId()); + + try + { + BatchValidationException bve = new BatchValidationException(); + TableInfo ti = QueryService.get().getUserSchema(_user, _container, MccSchema.NAME).getTable(MccSchema.TABLE_REQUEST_SCORE); + ti.getUpdateService().insertRows(_user, _container, Arrays.asList(toInsert), bve, null, null); + } + catch (QueryUpdateServiceException | BatchValidationException | DuplicateKeyException | SQLException e) + { + _log.error("Unable to create requestScore rows for request: " + objectId, e); + } + } + else + { + // Ensure score is accurate in the case the underlying data changed: + List<Map> records = ts.getArrayList(Map.class); + if (records.size() != 1) + { + _log.error("More than one requestScore record found for requestId: " + objectId); + } + + Map<String, Object> row = records.get(0); + if (score != (Integer)row.get("preliminaryScore")) + { + try + { + row.put("preliminaryScore", score); + TableInfo ti = QueryService.get().getUserSchema(_user, _container, MccSchema.NAME).getTable(MccSchema.TABLE_REQUEST_SCORE); + ti.getUpdateService().updateRows(_user, _container, Arrays.asList(row), Arrays.asList(Collections.singletonMap("rowid", row.get("rowid"))), null, null); + } + catch (QueryUpdateServiceException | BatchValidationException | InvalidKeyException | SQLException e) + { + _log.error("Unable to update score for: " + objectId, e); + } + } + } + + // This indicates the form was submitted immediately (i.e. not a draft), or it was in draft state and has advanced. + MccManager.RequestStatus st2 = previousStatus == null ? null : MccManager.RequestStatus.valueOf(previousStatus); + if (st2 == null || st2 == MccManager.RequestStatus.Draft) + { + sendInitialNotification(); + } + } + catch (IllegalArgumentException e) + { + _log.error("Unknown MCC status: " + status); + } + } + + private void sendInitialNotification() { Set<Address> emails = MccManager.get().getRequestNotificationUserEmails(); if (emails == null || emails.isEmpty()) { @@ -105,7 +187,7 @@ public void sendNotification(int rowid) { public void cascadeDelete(String schemaName, String queryName, String keyField, Object keyValue) throws SQLException { - DbSchema schema = QueryService.get().getUserSchema(_user, _container, schemaName).getDbSchema(); + UserSchema schema = QueryService.get().getUserSchema(_user, _container, schemaName); if (schema == null) throw new RuntimeException("Unknown schema: " + schemaName); @@ -116,7 +198,27 @@ public void cascadeDelete(String schemaName, String queryName, String keyField, if (!_container.hasPermission(_user, DeletePermission.class)) throw new UnauthorizedException("User does not have permission to delete from the table: " + table.getPublicName()); - SimpleFilter filter = new SimpleFilter(FieldKey.fromString(keyField), keyValue); - Table.delete(table, filter); + try + { + List<Map<String, Object>> toDelete = new TableSelector(table, PageFlowUtil.set("rowid"), new SimpleFilter(FieldKey.fromString(keyField), keyValue), null).stream(Integer.class).map(x -> new CaseInsensitiveHashMap<Object>(Collections.singletonMap("rowId", x))).collect(Collectors.toList()); + table.getUpdateService().deleteRows(_user, _container, toDelete, null, null); + } + catch (QueryUpdateServiceException | InvalidKeyException | BatchValidationException e) + { + _log.error("Unable to delete from: " + queryName, e); + } + } + + public boolean hasPermission(String status) + { + try + { + return MccManager.RequestStatus.valueOf(status).canEdit(_user, _container); + } + catch (IllegalArgumentException e) + { + _log.error("Unknown MCC status: " + status); + return false; + } } } diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index 807252057..777f6fa4c 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -16,35 +16,32 @@ package org.labkey.test.tests.mcc; -import org.apache.commons.io.FileUtils; import org.jetbrains.annotations.Nullable; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.labkey.remoteapi.query.Filter; import org.labkey.remoteapi.query.SelectRowsCommand; import org.labkey.remoteapi.query.SelectRowsResponse; import org.labkey.remoteapi.query.Sort; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; -import org.labkey.test.Locators; import org.labkey.test.ModulePropertyValue; -import org.labkey.test.TestFileUtils; import org.labkey.test.TestTimeoutException; import org.labkey.test.WebTestHelper; import org.labkey.test.categories.External; import org.labkey.test.categories.LabModule; import org.labkey.test.util.DataRegionTable; -import org.openqa.selenium.Keys; -import java.io.File; -import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Category({External.class, LabModule.class}) public class MccTest extends BaseWebDriverTest @@ -56,108 +53,154 @@ public void testMccModule() throws Exception doRequestFormTest(); doRequestFormTestWithFailure(); + + testInvalidId(); } private static class FormElement { String inputType = "input"; - String databaseFieldName = null; - boolean isCheckBox = false; + String databaseValue = null; final String inputName; - final CharSequence sendKeysValue; + final Object fieldValue; + final String databaseFieldName; - public FormElement(String inputName, CharSequence sendKeysValue) + public FormElement(String inputName, String databaseFieldName, Object fieldValue) { this.inputName = inputName; - this.sendKeysValue = sendKeysValue; + this.fieldValue = fieldValue; + this.databaseFieldName = databaseFieldName; } - public FormElement withDatabaseField(String databaseFieldName) + public String getDatabaseFieldName() { - this.databaseFieldName = databaseFieldName; + return databaseFieldName; + } + public FormElement checkBox() + { + if (!(fieldValue instanceof Boolean)) + { + throw new IllegalStateException("Checkbox must have a boolean input fieldValue"); + } + + this.inputType = "checkbox"; return this; } - public FormElement isCheckBox() + public FormElement select(String databaseValue) { - this.isCheckBox = true; + this.databaseValue = databaseValue; + this.inputType = "select"; + return this; } - public FormElement withInput(String inputType) + public FormElement radio() { - this.inputType = inputType; + if (!(fieldValue instanceof Boolean)) + { + throw new IllegalStateException("Radio must have a boolean input fieldValue"); + } + + this.inputType = "radio"; + return this; + } + public Object getDatabaseValue() + { + return databaseValue == null ? fieldValue : databaseValue; + } + + public FormElement inputType(String inputType) + { + this.inputType = inputType; return this; } - public String getFieldName() + public String getInputName() { + if ("radio".equals(inputType)) + { + return inputName + ((boolean)fieldValue ? "-yes" : "-no"); + } + return inputName; } - public String getInputType() + public Locator getLocator() { - return inputType; + return Locator.tagWithId("radio".equals(inputType) || "checkbox".equals(inputType) ? "input" : inputType, getInputName()); } public void waitFor(BaseWebDriverTest test) { - Locator loc = Locator.tagWithId(getInputType(), getFieldName()); - test.waitForElement(loc); + test.waitForElement(getLocator()); } public void setFieldValue(BaseWebDriverTest test) { - Locator loc = Locator.tagWithId(getInputType(), getFieldName()); waitFor(test); - if (this.sendKeysValue == null) + if ("checkbox".equals(inputType) || "radio".equals(inputType)) { - test.waitAndClick(loc); + test.waitAndClick(getLocator()); } else { - loc.findElement(test.getDriver()).sendKeys(this.sendKeysValue); + test.setFormElement(getLocator(), String.valueOf(fieldValue)); + } + } + + public String getExpectedInputFieldValue() + { + if (fieldValue instanceof Boolean) + { + boolean val = (boolean)fieldValue; + if ("checkbox".equals(inputType)) + { + return val ? "on" : null; + } + else if ("radio".equals(inputType)) + { + return val ? "yes" : "no"; + } } + return String.valueOf(databaseValue == null ? fieldValue : databaseValue); } } // Field name / field value: final FormElement[] FORM_DATA = new FormElement[]{ - new FormElement("investigator-last-name", "last name"), - new FormElement("investigator-first-name", "first name"), - new FormElement("investigator-middle-initial", "m"), - new FormElement("is-principal-investigator-yes", null).isCheckBox(), - new FormElement("institution-name", "institution name"), - new FormElement("institution-city", "institution city"), - new FormElement("institution-state", "institution state"), - new FormElement("institution-country", "institution country"), - new FormElement("official-last-name", "official last name"), - new FormElement("official-first-name", "official first name"), - new FormElement("official-email", "official@email.com"), - new FormElement("funding-source", Keys.ARROW_DOWN).withInput("select"), - new FormElement("funding-grant-number", "grant number"), - new FormElement("experiment-rationale", "rationale").withInput("textarea"), - - - new FormElement("animal-cohorts-0-numberofanimals", "1"), - new FormElement("animal-cohorts-0-sex", Keys.ARROW_DOWN).withInput("select"), - new FormElement("animal-cohorts-0-othercharacteristics", "characteristics").withInput("textarea"), - new FormElement("methods-proposed", "methods").withInput("textarea"), - new FormElement("collaborations", "collaborations").withInput("textarea"), - new FormElement("animal-breeding-is-planning-to-breed-animals-no", null).isCheckBox(), - new FormElement("research-area", Keys.ARROW_DOWN).withInput("select"), - new FormElement("existing-marmoset-colony", Keys.ARROW_DOWN).withInput("select"), - new FormElement("existing-nhp-facilities", Keys.ARROW_DOWN).withInput("select"), - new FormElement("animal-welfare", "welfare").withInput("textarea"), - new FormElement("certify", null).isCheckBox(), - new FormElement("vet-last-name", "vet last name"), - new FormElement("vet-first-name", "vet first name"), - new FormElement("vet-email", "vet@email.com"), - new FormElement("iacuc-approval", Keys.ARROW_DOWN).withInput("select") + new FormElement("investigator-last-name", "lastName", "last name"), + new FormElement("investigator-first-name", "firstName", "first name"), + new FormElement("investigator-middle-initial", "middleinitial", "m"), + new FormElement("is-early-stage-investigator", "earlystageinvestigator", true).radio(), + new FormElement("institution-name", "institutionname", "institution name"), + new FormElement("institution-city", "institutioncity", "institution city"), + new FormElement("institution-state", "institutionstate", "institution state"), + new FormElement("institution-type", "institutiontype", "Minority serving").select("minorityServing"), + new FormElement("institution-country", "institutioncountry", "institution country"), + new FormElement("official-last-name", "officiallastname", "official last name"), + new FormElement("official-first-name", "officialfirstname", "official first name"), + new FormElement("official-email", "officialemail", "official@email.com"), + //TODO: multi-select + new FormElement("funding-source", "fundingsource", "NIH-supported research").select("nih"), + new FormElement("funding-grant-number", "grantnumber", "grant number"), + new FormElement("experiment-rationale", "experimentalrationale", "rationale").inputType("textarea"), + new FormElement("methods-proposed", "methodsproposed", "methods").inputType("textarea"), + new FormElement("collaborations", "collaborations", "collaborations").inputType("textarea"), + new FormElement("animal-breeding-is-planning-to-breed-animals", "isbreedinganimals", false).radio(), + new FormElement("research-area", "researcharea", "Rare disease research").select("rare-disease"), + new FormElement("existing-marmoset-colony", "existingmarmosetcolony", "Existing marmoset colony").select("existing"), + new FormElement("existing-nhp-facilities", "existingnhpfacilities", "Existing NHP facilities").select("existing"), + new FormElement("animal-welfare", "animalwelfare", "welfare").inputType("textarea"), + new FormElement("certify", "certify", true).checkBox(), + new FormElement("vet-last-name", "vetlastname", "vet last name"), + new FormElement("vet-first-name", "vetfirstname", "vet first name"), + new FormElement("vet-email", "vetemail", "vet@email.com"), + new FormElement("iacuc-approval", "iacucapproval", "Provisional").select("provisional") }; private Locator getButton(String text) @@ -173,21 +216,114 @@ private void goToAnimalRequests() waitForElement(Locator.tagWithText("a", "Submit New Animal Request")); } + private void waitForSaveToComplete() + { + waitForElementToDisappear(Locator.tagWithText("h2", "Saving").withClass("text-xl")); + } + private void doRequestFormTest() throws Exception { goToAnimalRequests(); waitAndClickAndWait(Locator.tagWithText("a", "Submit New Animal Request")); - waitForElement(getButton("Submit")); + waitForElement(getButton("Save")); - setFormValues(null); + setAllFormValues(); - waitAndClickAndWait(getButton("Save")); + addCohort(0); + + addCoinvestigator(0, true); + addCoinvestigator(1, true); + + waitAndClick(getButton("Save")); + waitForSaveToComplete(); // Verify record created: Map<String, Object> request = getLastModifiedRequestRow(); for (FormElement f : FORM_DATA) { - //TODO: check data + Assert.assertEquals(request.get(f.databaseFieldName), f.getDatabaseValue()); + } + + assertCohortValues((String)request.get("objectid"), 1); + assertCoinvestigatorValues((String)request.get("objectid"), 2); + } + + private FormElement[] getCoinvestigatorFields(int idx) + { + return new FormElement[]{ + new FormElement("coinvestigators-" + idx + "-lastName", "lastname", "coinvestigators-lastName"), + new FormElement("coinvestigators-" + idx + "-firstName", "firstname", "coinvestigators-firstName"), + new FormElement("coinvestigators-" + idx + "-middleInitial", "middleInitial", "mi"), + new FormElement("coinvestigators-" + idx + "-institution", "institutionname", "coinvestigators-institution") + }; + } + + private FormElement[] getCohortFields(int idx) + { + return new FormElement[]{ + new FormElement("animal-cohorts-" + idx + "-numberofanimals", "numberofanimals", 12), + new FormElement("animal-cohorts-" + idx + "-sex", "sex", "Male").select("male"), + new FormElement("animal-cohorts-" + idx + "-othercharacteristics", "othercharacteristics", "cohort-othercharacteristics").inputType("textarea") + }; + } + + private void addCoinvestigator(int idx, boolean clickBtn) + { + if (clickBtn) + { + waitAndClick(Locator.tagWithAttribute("input", "value", "Add Co-investigator")); + } + + FormElement[] fields = getCoinvestigatorFields(idx); + for (FormElement f : fields) + { + f.setFieldValue(this); + } + } + + private void addCohort(int idx) + { + if (idx > 0) + { + waitAndClick(Locator.tagWithText("button", "Add Cohort")); + } + + FormElement[] cohort = getCohortFields(idx); + for (FormElement f : cohort) + { + f.setFieldValue(this); + } + } + + private void assertCoinvestigatorValues(String requestId, int expectedRecords) throws Exception + { + List<Map<String, Object>> rows = getCoinvestigatorRecords(requestId); + Assert.assertEquals(rows.size(), expectedRecords); + + for (int i=0;i<rows.size();i++) + { + Map<String, Object> row = rows.get(i); + FormElement[] cohort = getCoinvestigatorFields(i); + for (FormElement f : cohort) + { + Assert.assertEquals(f.getDatabaseValue(), row.get(f.getDatabaseFieldName())); + } + } + } + + private void assertCohortValues(String requestId, int expectedRecords) throws Exception + { + List<Map<String, Object>> cohortRows = getCohortRecords(requestId); + Assert.assertEquals(cohortRows.size(), expectedRecords); + + for (int i=0;i<cohortRows.size();i++) + { + Map<String, Object> row = cohortRows.get(i); + FormElement[] cohort = getCohortFields(i); + for (FormElement f : cohort) + { + Assert.assertEquals(f.getDatabaseValue(), row.get(f.getDatabaseFieldName())); + } } } @@ -195,10 +331,38 @@ private Map<String, Object> getLastModifiedRequestRow() throws Exception { SelectRowsCommand sr = new SelectRowsCommand("mcc", "animalrequests"); sr.addSort(new Sort("modified", Sort.Direction.DESCENDING)); + List<String> cols = new ArrayList<>(Arrays.stream(FORM_DATA).map(FormElement::getDatabaseFieldName).collect(Collectors.toList())); + cols.add("objectid"); + sr.setColumns(cols); + SelectRowsResponse srr = sr.execute(createDefaultConnection(), getProjectName()); return srr.getRows().get(0); } + private List<Map<String, Object>> getCohortRecords(String requestId) throws Exception + { + SelectRowsCommand sr = new SelectRowsCommand("mcc", "requestcohorts"); + sr.addSort(new Sort("rowid", Sort.Direction.ASCENDING)); + sr.setColumns(Arrays.stream(getCohortFields(0)).map(FormElement::getDatabaseFieldName).collect(Collectors.toList())); + sr.addFilter(new Filter("requestid", requestId)); + + SelectRowsResponse srr = sr.execute(createDefaultConnection(), getProjectName()); + + return srr.getRows(); + } + + private List<Map<String, Object>> getCoinvestigatorRecords(String requestId) throws Exception + { + SelectRowsCommand sr = new SelectRowsCommand("mcc", "coinvestigators"); + sr.addSort(new Sort("rowid", Sort.Direction.ASCENDING)); + sr.setColumns(Arrays.stream(getCoinvestigatorFields(0)).map(FormElement::getDatabaseFieldName).collect(Collectors.toList())); + sr.addFilter(new Filter("requestid", requestId)); + + SelectRowsResponse srr = sr.execute(createDefaultConnection(), getProjectName()); + + return srr.getRows(); + } + private void doRequestFormTestWithFailure() throws Exception { goToAnimalRequests(); @@ -207,7 +371,8 @@ private void doRequestFormTestWithFailure() throws Exception waitForElement(getButton("Submit")); // This omits a required field - setFormValues(Arrays.asList("investigator-last-name")); + setFormValues(Arrays.asList("lastName")); + addCohort(0); waitAndClick(getButton("Submit")); waitForElement(Locator.tagWithText("li", "Last Name: Please fill out this field.")); @@ -216,10 +381,8 @@ private void doRequestFormTestWithFailure() throws Exception waitAndClick(Locator.tagWithAttribute("input", "value", "Add Co-investigator")); waitForElement(Locator.tagWithText("li", "Institution: Please fill out this field.")); - // To full exercise saving, add a cohort and co-investigator - new FormElement("coinvestigators-0-lastName", "coinvestigators-lastName").setFieldValue(this); - new FormElement("coinvestigators-0-firstName", "coinvestigators-firstName").setFieldValue(this); - new FormElement("coinvestigators-0-institution", "coinvestigators-institution").setFieldValue(this); + addCoinvestigator(0, false); //the button was clicked above + waitAndClick(getButton("Save")); waitForElementToDisappear(Locator.tagWithText("li", "Institution: Please fill out this field.")); // Add another, which makes it invalid again @@ -244,29 +407,48 @@ private void doRequestFormTestWithFailure() throws Exception waitAndClick(removeBtn); // Even though last name is missing, it should still be savable: - waitAndClickAndWait(getButton("Save")); + waitAndClick(getButton("Save")); + waitForSaveToComplete(); + + doAndWaitForPageToLoad(() -> { + waitAndClick(getButton("Cancel")); + assertAlert("You are about to leave this page."); + }); // Now reopen this form: DataRegionTable dr = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); dr.clickEditRow(0); - getFormElementByName("investigator-last-name").waitFor(this); + getFormElementByName("lastName").waitFor(this); // TODO: make sure the field values are remembered // including cohort and co-investigator + for (FormElement f : FORM_DATA) + { + if ("lastName".equals(f.getDatabaseFieldName())) + { + continue; + } + + Assert.assertEquals(getFormElement(f.getLocator()), f.getExpectedInputFieldValue()); + } // Now fill in the missing field: - getFormElementByName("investigator-last-name").setFieldValue(this); + getFormElementByName("lastName").setFieldValue(this); waitAndClickAndWait(getButton("Submit")); dr = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); - Assert.assertEquals("submitted", dr.getDataAsText(0, "status")); + Assert.assertEquals("Submitted", dr.getDataAsText(0, "status")); dr.clickEditRow(0); - getFormElementByName("investigator-last-name").waitFor(this); - waitForElement(getButton("Approve Request")); + getFormElementByName("lastName").waitFor(this); + + waitForElement(getButton("Update Request")); + assertElementNotPresent(getButton("Submit")); impersonateRoles("Editor", "MCC Requestor"); + + assertElementNotPresent(getButton("Save")); assertElementNotPresent(getButton("Submit")); assertElementNotPresent(getButton("Approve Request")); } @@ -275,7 +457,7 @@ private FormElement getFormElementByName(String name) { for (FormElement e : FORM_DATA) { - if (name.equals(e.getFieldName())) + if (name.equals(e.databaseFieldName)) { return e; } @@ -284,11 +466,16 @@ private FormElement getFormElementByName(String name) throw new IllegalArgumentException("Unknown field: " + name); } + private void setAllFormValues() + { + setFormValues(null); + } + private void setFormValues(@Nullable Collection<String> fieldsToSkip) { for (FormElement el : FORM_DATA) { - if (fieldsToSkip != null && fieldsToSkip.contains(el.getFieldName())) + if (fieldsToSkip != null && fieldsToSkip.contains(el.databaseFieldName)) { continue; } @@ -327,11 +514,14 @@ private void doSetup() throws Exception )); } - private String getModulePath() + private void testInvalidId() { - return "server/modules/BimberLabKeyModules/mcc"; + beginAt("/mcc/" + getProjectName() + "/animalRequest.view?requestId=foo"); + + assertElementPresent(Locator.tagWithText("div", "There is no request with id: foo")); } + private void importStudy() { beginAt(WebTestHelper.getBaseURL() + "/mcc/" + getProjectName() + "/importStudy.view"); From 27ea9e82ff17c2777dcc65ea1be2f650c0d63668 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Thu, 28 Apr 2022 10:31:18 -0700 Subject: [PATCH 32/63] More tolerant resolution of legacy MCC request records --- mcc/src/org/labkey/mcc/MccManager.java | 17 +++++++++++++++++ mcc/src/org/labkey/mcc/query/TriggerHelper.java | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index d0f00fbe3..f951fdacd 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -70,6 +70,23 @@ public boolean canEdit(User u, Container c) { return c.hasPermission(u, this.editPermission); } + + public static RequestStatus resolveStatus(String val) + { + if (val == null) + { + return null; + } + + try + { + return valueOf(val); + } + catch (IllegalArgumentException e) + { + return valueOf(val.substring(0, 1).toUpperCase() + val.substring(1).toLowerCase()); + } + } } public static final String ContainerPropName = "MCCContainer"; diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 6b7955675..f069d5c6a 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -90,7 +90,7 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable { try { - MccManager.RequestStatus st = MccManager.RequestStatus.valueOf(status); + MccManager.RequestStatus st = MccManager.RequestStatus.resolveStatus(status); if (st == MccManager.RequestStatus.Draft) { return; @@ -146,7 +146,7 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable } // This indicates the form was submitted immediately (i.e. not a draft), or it was in draft state and has advanced. - MccManager.RequestStatus st2 = previousStatus == null ? null : MccManager.RequestStatus.valueOf(previousStatus); + MccManager.RequestStatus st2 = previousStatus == null ? null : MccManager.RequestStatus.resolveStatus(previousStatus); if (st2 == null || st2 == MccManager.RequestStatus.Draft) { sendInitialNotification(); @@ -213,7 +213,7 @@ public boolean hasPermission(String status) { try { - return MccManager.RequestStatus.valueOf(status).canEdit(_user, _container); + return MccManager.RequestStatus.resolveStatus(status).canEdit(_user, _container); } catch (IllegalArgumentException e) { From 8f93b80fc86bc92648f3ae71287d0474f26ccfac Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Thu, 28 Apr 2022 11:30:23 -0700 Subject: [PATCH 33/63] Add more audit logging for MCC --- mcc/resources/schemas/mcc.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 770a47f2f..30c576db7 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -216,6 +216,7 @@ <importUrl>mcc/animalRequest.view</importUrl> <insertUrl></insertUrl> <updateUrl>mcc/animalRequest.view?requestId=${objectid}</updateUrl> + <auditLogging>DETAILED</auditLogging> <pkColumnName>rowid</pkColumnName> <columns> <column columnName="rowid"> @@ -392,6 +393,7 @@ <table tableName="coinvestigators" tableDbType="TABLE"> <tableTitle>Co-investigators</tableTitle> <pkColumnName>rowid</pkColumnName> + <auditLogging>DETAILED</auditLogging> <columns> <column columnName="rowid"> <columnTitle>Row ID</columnTitle> @@ -453,6 +455,7 @@ <table tableName="requestcohorts" tableDbType="TABLE"> <tableTitle>Request Cohorts</tableTitle> <pkColumnName>rowid</pkColumnName> + <auditLogging>DETAILED</auditLogging> <columns> <column columnName="rowid"> <columnTitle>Cohort Id</columnTitle> @@ -568,6 +571,7 @@ </table> <table tableName="requestReviews" tableDbType="TABLE"> <tableTitle>Request Reviews</tableTitle> + <auditLogging>DETAILED</auditLogging> <insertUrl /> <importUrl /> <updateUrl /> @@ -655,6 +659,7 @@ <tableUrl /> <deleteUrl /> <tableTitle>Animal Request Reviews</tableTitle> + <auditLogging>DETAILED</auditLogging> <pkColumnName>rowid</pkColumnName> <columns> <column columnName="rowid"> From e50a99562fb5b6ba0edcc16141195f6bdcb89106 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Thu, 28 Apr 2022 11:35:45 -0700 Subject: [PATCH 34/63] Update MCC url --- mcc/resources/views/mccRequestAdmin.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index cb1a9cd8b..941ed6b87 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -17,7 +17,7 @@ '<br>' + '<a class="labkey-text-link" href="<%=contextPath%>/mcc/img/mccRequest.png">Outline of Request Workflow</a>' + '<br>' + - '<a class="labkey-text-link" href="<%=contextPath%>/' + ctx.MCCRequestContainer + '/security-permissions.view?t=sitegroups">Manage RAB Members (admin permission needed)</a>' + + '<a class="labkey-text-link" href="<%=contextPath%>/security/' + ctx.MCCRequestContainer + '/permissions.view?t=sitegroups">Manage RAB Members (admin permission needed)</a>' + '<p></p>' + '<div id="' + webpart.wrapperDivId + '-webpartAssignments"></div>' + '<p></p>' + From 9272aec81e0c39b1c8943385fa1ee8dd355592de Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Thu, 28 Apr 2022 18:56:24 -0700 Subject: [PATCH 35/63] Bugfixes to MCC request (#62) * Bugfixes to MCC request --- mcc/resources/folderTypes/MCC.folderType.xml | 10 +- .../requestReviews/Pending Reviews.qview.xml | 8 + .../queries/mcc/requestScores/.qview.xml | 5 +- .../mcc/requestScores/Detailed.qview.xml | 16 - .../requestScores/Pending Requests.qview.xml | 8 + .../postgresql/mcc-20.010-20.011.sql | 4 + .../dbscripts/sqlserver/mcc-20.010-20.011.sql | 4 + mcc/resources/schemas/mcc.xml | 21 +- mcc/resources/views/mccMenu.html | 2 +- mcc/resources/views/mccRequestAdmin.html | 9 +- mcc/resources/views/mccRequests.html | 2 +- mcc/resources/views/rabRequestReview.html | 4 +- .../client/AnimalRequest/animal-request.tsx | 275 +++++++++++++----- .../components/animal-breeding.tsx | 9 +- .../components/animal-cohort.tsx | 24 +- .../components/co-investigators.tsx | 22 +- .../components/iacuc-protocol.tsx | 13 +- .../client/AnimalRequest/research-area.tsx | 36 --- .../components/InternalReviewForm.tsx | 4 - .../components/RabReviewForm.tsx | 50 +++- .../components/ReadOnlyRequest.tsx | 18 +- mcc/src/client/components/RequestUtils.tsx | 7 +- mcc/src/org/labkey/mcc/MccModule.java | 2 +- mcc/src/org/labkey/mcc/MccUserSchema.java | 52 +++- mcc/src/org/labkey/mcc/query/MccRequest.java | 11 - .../org/labkey/test/tests/mcc/MccTest.java | 53 +++- 26 files changed, 418 insertions(+), 251 deletions(-) create mode 100644 mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml delete mode 100644 mcc/resources/queries/mcc/requestScores/Detailed.qview.xml create mode 100644 mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml create mode 100644 mcc/resources/schemas/dbscripts/postgresql/mcc-20.010-20.011.sql create mode 100644 mcc/resources/schemas/dbscripts/sqlserver/mcc-20.010-20.011.sql delete mode 100644 mcc/src/client/AnimalRequest/research-area.tsx diff --git a/mcc/resources/folderTypes/MCC.folderType.xml b/mcc/resources/folderTypes/MCC.folderType.xml index 5b3689b43..ff45df62e 100644 --- a/mcc/resources/folderTypes/MCC.folderType.xml +++ b/mcc/resources/folderTypes/MCC.folderType.xml @@ -1,6 +1,12 @@ <folderType xmlns="http://labkey.org/data/xml/folderType"> <name>MCC</name> <description>The default folder layout for MCC</description> + <preferredWebParts> + <webPart> + <name>MCC Menu</name> + <location>menu</location> + </webPart> + </preferredWebParts> <folderTabs> <folderTab> <name>mcc</name> @@ -22,10 +28,6 @@ <name>MCC Dashboard Webpart</name> <location>body</location> </webPart> - <webPart> - <name>MCC Menu</name> - <location>menu</location> - </webPart> </preferredWebParts> </folderTab> </folderTabs> diff --git a/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml b/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml new file mode 100644 index 000000000..66ea1c787 --- /dev/null +++ b/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml @@ -0,0 +1,8 @@ +<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="Pending Reviews" canOverride="false"> + <filters> + <filter column="score" operator="isblank"/> + </filters> + <sorts> + <sort column="requestId/rowid" descending="true"/> + </sorts> +</customView> \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores/.qview.xml b/mcc/resources/queries/mcc/requestScores/.qview.xml index 7b28e864d..daa66e85a 100644 --- a/mcc/resources/queries/mcc/requestScores/.qview.xml +++ b/mcc/resources/queries/mcc/requestScores/.qview.xml @@ -1,4 +1,4 @@ -<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="All Reviews" canOverride="false"> +<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="All Requests" canOverride="false"> <columns> <column name="requestId/rowid"/> <column name="requestId/lastname"/> @@ -7,8 +7,9 @@ <column name="requestId/status"/> <column name="preliminaryScore"/> <column name="resourceAvailabilityScore"/> - <column name="researchAreaPriorityScore"/> + <column name="rabReviewStatus"/> <column name="proposalScore"/> + <column name="created"/> <column name="actions"/> </columns> diff --git a/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml b/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml deleted file mode 100644 index edd394758..000000000 --- a/mcc/resources/queries/mcc/requestScores/Detailed.qview.xml +++ /dev/null @@ -1,16 +0,0 @@ -<customView xmlns="http://labkey.org/data/xml/queryCustomView" canOverride="false"> - <columns> - <column name="rowid"/> - <column name="requestid/lastname"/> - <column name="requestid/firstname"/> - <column name="requestid/createdby/email"/> - <column name="requestid/institutionname"/> - <column name="requestid/iacucapproval"/> - <column name="requestid/applicationduedate"/> - <column name="requestid/status"/> - <column name="actions"/> - </columns> - <sorts> - <sort column="rowid" descending="true"/> - </sorts> -</customView> \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml b/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml new file mode 100644 index 000000000..9a0b82fa5 --- /dev/null +++ b/mcc/resources/queries/mcc/requestScores/Pending Requests.qview.xml @@ -0,0 +1,8 @@ +<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="Pending Requests" canOverride="false"> + <filters> + <filter column="requestId/status" operator="neqornull" value="Approved"/> + </filters> + <sorts> + <sort column="requestId/rowid" descending="true"/> + </sorts> +</customView> \ No newline at end of file diff --git a/mcc/resources/schemas/dbscripts/postgresql/mcc-20.010-20.011.sql b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.010-20.011.sql new file mode 100644 index 000000000..584ee01c4 --- /dev/null +++ b/mcc/resources/schemas/dbscripts/postgresql/mcc-20.010-20.011.sql @@ -0,0 +1,4 @@ +ALTER TABLE mcc.requestScores drop column researchAreaPriorityScore; + +ALTER TABLE mcc.animalrequests drop column otherjustification; +ALTER TABLE mcc.animalrequests drop column researcharea; diff --git a/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.010-20.011.sql b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.010-20.011.sql new file mode 100644 index 000000000..33a1c61ef --- /dev/null +++ b/mcc/resources/schemas/dbscripts/sqlserver/mcc-20.010-20.011.sql @@ -0,0 +1,4 @@ +ALTER TABLE mcc.requestScores drop column researchAreaPriorityScore; + +ALTER TABLE mcc.animalrequests drop column otherjustification; +ALTER TABLE mcc.animalrequests drop column researcharea; \ No newline at end of file diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 30c576db7..763b3af5d 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -214,8 +214,10 @@ <table tableName="animalrequests" tableDbType="TABLE"> <tableTitle>MCC Animal Requests</tableTitle> <importUrl>mcc/animalRequest.view</importUrl> - <insertUrl></insertUrl> + <insertUrl>mcc/animalRequest.view</insertUrl> <updateUrl>mcc/animalRequest.view?requestId=${objectid}</updateUrl> + <deleteUrl /> + <tableUrl /> <auditLogging>DETAILED</auditLogging> <pkColumnName>rowid</pkColumnName> <columns> @@ -309,14 +311,6 @@ <columnTitle>Detail on Breeding</columnTitle> <nullable>true</nullable> </column> - <column columnName="researcharea"> - <columnTitle>Research Area</columnTitle> - <nullable>true</nullable> - </column> - <column columnName="otherjustification"> - <columnTitle>Justification (If other picked on Research Area)</columnTitle> - <nullable>true</nullable> - </column> <column columnName="existingmarmosetcolony"> <columnTitle>Existing marmoset colony?</columnTitle> <nullable>true</nullable> @@ -407,6 +401,7 @@ <fkDbSchema>mcc</fkDbSchema> <fkTable>animalrequests</fkTable> <fkColumnName>objectid</fkColumnName> + <fkDisplayColumnName>rowId</fkDisplayColumnName> </fk> </column> <column columnName="lastname"> @@ -468,6 +463,7 @@ <fkDbSchema>mcc</fkDbSchema> <fkTable>animalrequests</fkTable> <fkColumnName>objectid</fkColumnName> + <fkDisplayColumnName>rowId</fkDisplayColumnName> </fk> </column> <column columnName="numberofanimals"> @@ -616,6 +612,7 @@ <fkDbSchema>mcc</fkDbSchema> <fkTable>animalrequests</fkTable> <fkColumnName>objectid</fkColumnName> + <fkDisplayColumnName>rowId</fkDisplayColumnName> </fk> </column> <column columnName="container"> @@ -674,11 +671,6 @@ <columnTitle>Resource Availability Score</columnTitle> <nullable>true</nullable> </column> - <!-- TODO: remove?--> - <column columnName="researchAreaPriorityScore"> - <columnTitle>Research Area Priority Score</columnTitle> - <nullable>true</nullable> - </column> <column columnName="proposalScore"> <columnTitle>Proposal Score</columnTitle> <nullable>true</nullable> @@ -694,6 +686,7 @@ <fkDbSchema>mcc</fkDbSchema> <fkTable>animalrequests</fkTable> <fkColumnName>objectid</fkColumnName> + <fkDisplayColumnName>rowId</fkDisplayColumnName> </fk> </column> <column columnName="container"> diff --git a/mcc/resources/views/mccMenu.html b/mcc/resources/views/mccMenu.html index a6a948dcd..cb360b8a3 100644 --- a/mcc/resources/views/mccMenu.html +++ b/mcc/resources/views/mccMenu.html @@ -48,7 +48,7 @@ }) menuItems.push({ - label: 'Request Admin', + label: 'Animal Request Administration', name: 'requestAdmin', url: LABKEY.ActionURL.buildURL('mcc', 'mccRequestAdmin', ctx['MCCRequestContainer']), visible: true diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index 941ed6b87..8e74d0cfd 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -18,6 +18,8 @@ '<a class="labkey-text-link" href="<%=contextPath%>/mcc/img/mccRequest.png">Outline of Request Workflow</a>' + '<br>' + '<a class="labkey-text-link" href="<%=contextPath%>/security/' + ctx.MCCRequestContainer + '/permissions.view?t=sitegroups">Manage RAB Members (admin permission needed)</a>' + + '<br>' + + '<a class="labkey-text-link" href="<%=contextPath%>/query/' + ctx.MCCRequestContainer + '/executeQuery.view?schemaName=mcc&queryName=animalRequests">View All Requests</a>' + '<p></p>' + '<div id="' + webpart.wrapperDivId + '-webpartAssignments"></div>' + '<p></p>' + @@ -30,10 +32,7 @@ title: 'All Pending RAB Reviews', schemaName: 'mcc', queryName: 'requestReviews', - //frame: 'none', - filterArray: [ - LABKEY.Filter.create('review', null, LABKEY.Filter.Types.ISBLANK) - ], + viewName: 'Pending Reviews', showRecordSelectors: false, showDetailsColumn: false, buttonBar: {position: 'top', includeStandardButtons: true, items: []} @@ -44,7 +43,7 @@ frame: 'left-nav', schemaName: 'mcc', queryName: 'requestScores', - //viewName: 'In Progress', + viewName: 'Pending Requests', showRecordSelectors: true, showDetailsColumn: true, buttonBar: {position: 'top', includeStandardButtons: true, items: []} diff --git a/mcc/resources/views/mccRequests.html b/mcc/resources/views/mccRequests.html index 84037736d..e7652b3b6 100644 --- a/mcc/resources/views/mccRequests.html +++ b/mcc/resources/views/mccRequests.html @@ -7,7 +7,7 @@ return; Ext4.get(webpart.wrapperDivId).update( - 'Investigators interested in requesting marmosets for their research can submit applications via the animal request portal. Investigators must already have user access to the password protected MCC site to submit these applications. The animal request review process (submission to approval) takes about 10 business days. (Please note that applications are not being accepted yet).' + + 'The MCC is now accepting animal requests! Investigators interested in requesting marmosets for their research can submit applications via the animal request portal. Please note, while you are encouraged to submit your requests now, the review process will not begin until June 2022, and the first animals will not be available until at least September 2022.' + '<p></p>' + '<a class="labkey-text-link" href="<%=contextPath%>/mcc' + ctx['MCCRequestContainer'] + '/animalRequest.view">Submit New Animal Request</a><br>' + '<a class="labkey-text-link" href="/become-a-user.html#request-animals">Click Here to View Documentation on the Request Process and Scoring Criteria</a>' + diff --git a/mcc/resources/views/rabRequestReview.html b/mcc/resources/views/rabRequestReview.html index b01a4c8d4..636ef9d76 100644 --- a/mcc/resources/views/rabRequestReview.html +++ b/mcc/resources/views/rabRequestReview.html @@ -20,9 +20,9 @@ title: 'Animal Request Review Assignments', schemaName: 'mcc', queryName: 'requestReviews', + viewName: 'Pending Reviews', filterArray: [ - LABKEY.Filter.create('reviewerId', LABKEY.Security.currentUser.id), - LABKEY.Filter.create('review', null, LABKEY.Filter.Types.ISBLANK) + LABKEY.Filter.create('reviewerId', LABKEY.Security.currentUser.id) ], showRecordSelectors: false, showDetailsColumn: false, diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx index 45da93d57..b1d5b894e 100644 --- a/mcc/src/client/AnimalRequest/animal-request.tsx +++ b/mcc/src/client/AnimalRequest/animal-request.tsx @@ -1,6 +1,11 @@ import React, { FormEvent, useState } from 'react'; import { ActionURL, getServerContext, Query } from '@labkey/api'; -import { AnimalRequestModel, queryRequestInformation } from '../components/RequestUtils'; +import { + AnimalCohort, + AnimalRequestModel, + CoInvestigatorModel, + queryRequestInformation +} from '../components/RequestUtils'; import Tooltip from './components/tooltip'; import Title from './components/title'; @@ -12,7 +17,6 @@ import YesNoRadio from './components/yes-no-radio'; import AnimalBreeding from './components/animal-breeding'; import IACUCProtocol from './components/iacuc-protocol'; import Funding from './components/funding'; -import ResearchArea from './research-area'; import AnimalCohorts from './components/animal-cohort'; import Button from './components/button'; import SavingOverlay from './saving-overlay'; @@ -30,7 +34,6 @@ import { methodsProposedPlaceholder, signingOfficialTooltip } from './components/values'; -import { v4 as uuidv4 } from 'uuid'; export function AnimalRequest() { const requestId = (new URLSearchParams(window.location.search)).get("requestId") @@ -40,6 +43,46 @@ export function AnimalRequest() { const [requestData, setRequestData] = useState<AnimalRequestModel>(null) const [stateRollbackOnFailure, setStateRollbackOnFailure] = useState(requestData?.request?.status) + const [ deletedCohortRecords, setDeletedCohortRecords ] = useState(new Set<number>()) + const [ deletedCoIRecords, setDeletedCoIRecords ] = useState(new Set<number>()) + + function onAddCohort() { + requestData.cohorts.push(new AnimalCohort()) + setRequestData({...requestData}) + } + + function onRemoveCohort(cohort: AnimalCohort) { + // NOTE: dont allow removing all cohorts + if (requestData.cohorts.length > 1) { + requestData.cohorts = [...requestData.cohorts.filter(item => item.uuid !== cohort.uuid)] + + if (cohort.rowid) { + deletedCohortRecords.add(cohort.rowid) + setDeletedCohortRecords(new Set(deletedCohortRecords)) + } + + setRequestData({...requestData}) + } + } + + function onAddInvestigator() { + requestData.coinvestigators.push(new CoInvestigatorModel()) + setRequestData({...requestData}) + } + + function onRemoveCoInvestigator(coInvestigator: CoInvestigatorModel) { + if (requestData.coinvestigators.length) { + requestData.coinvestigators = [...requestData.coinvestigators.filter(item => item.uuid !== coInvestigator.uuid)] + + if (coInvestigator.rowid) { + deletedCoIRecords.add(coInvestigator.rowid) + setDeletedCoIRecords(new Set(deletedCoIRecords)) + } + + setRequestData({...requestData}) + } + } + if (!requestData) { queryRequestInformation(requestId, handleFailure).then((model) => { setRequestData(model) @@ -110,76 +153,74 @@ export function AnimalRequest() { return "Save" } - function getCoinvestigatorCommands(data, objectId) { + function getCoinvestigatorCommands(data) { let commands = [] - let i = 0 - if (requestId && requestData.coinvestigators.length > 0) { - for (const coinvestigator of requestData.coinvestigators) { + if (requestData.coinvestigators.length) { + requestData.coinvestigators.forEach((rec, i) => { commands.push({ - command: "delete", + command: rec.rowid ? "update" : "insert", schemaName: "mcc", queryName: "coinvestigators", rows: [{ - "rowid": coinvestigator.rowid, + "rowid": rec.rowid, + "requestId": requestData.request.objectid, + "lastname": data.get("coinvestigators-" + i + "-lastName"), + "firstname": data.get("coinvestigators-" + i + "-firstName"), + "middleinitial": data.get("coinvestigators-" + i + "-middleInitial"), + "institutionname": data.get("coinvestigators-" + i + "-institution"), }] }) - } + }) } - while(data.get("coinvestigators-" + i + "-lastName") || data.get("coinvestigators-" + i + "-firstName") || - data.get("coinvestigators-" + i + "-middleInitial") || data.get("coinvestigators-" + i + "-institution")) { - commands.push({ - command: "insert", - schemaName: "mcc", - queryName: "coinvestigators", - rows: [{ - "requestId": objectId, - "lastname": data.get("coinvestigators-" + i + "-lastName"), - "firstname": data.get("coinvestigators-" + i + "-firstName"), - "middleinitial": data.get("coinvestigators-" + i + "-middleInitial"), - "institutionname": data.get("coinvestigators-" + i + "-institution"), - }] + if (deletedCoIRecords.size) { + deletedCoIRecords.forEach(rowId => { + commands.push({ + command: "delete", + schemaName: "mcc", + queryName: "coinvestigators", + rows: [{ + "rowid": rowId, + }] + }) }) - - i++ } return commands } - function getAnimalCohortCommands(data, objectId) { + function getAnimalCohortCommands(data) { let commands = [] - let i = 0 - if (requestId && requestData.cohorts.length > 0) { - for (const cohort of requestData.cohorts) { + if (requestData.cohorts.length) { + requestData.cohorts.forEach((rec, i) => { commands.push({ - command: "delete", + command: rec.rowid ? "update" : "insert", schemaName: "mcc", queryName: "requestcohorts", rows: [{ - "rowid": cohort.rowid, + "rowid": rec.rowid, + "requestId": requestData.request.objectid, + "numberofanimals": data.get("animal-cohorts-" + i + "-numberofanimals"), + "sex": data.get("animal-cohorts-" + i + "-sex"), + "othercharacteristics": data.get("animal-cohorts-" + i + "-othercharacteristics"), }] }) - } + }) } - while(data.get("animal-cohorts-" + i + "-numberofanimals") || data.get("animal-cohorts-" + i + "-sex") || - data.get("animal-cohorts-" + i + "-othercharacteristics")) { - commands.push({ - command: "insert", - schemaName: "mcc", - queryName: "requestcohorts", - rows: [{ - "requestId": objectId, - "numberofanimals": data.get("animal-cohorts-" + i + "-numberofanimals"), - "sex": data.get("animal-cohorts-" + i + "-sex"), - "othercharacteristics": data.get("animal-cohorts-" + i + "-othercharacteristics"), - }] + if (deletedCohortRecords.size) { + deletedCohortRecords.forEach(rowId => { + commands.push({ + command: "delete", + schemaName: "mcc", + queryName: "requestcohorts", + rows: [{ + "rowid": rowId, + }] + }) }) - - i++ } return commands @@ -206,21 +247,21 @@ export function AnimalRequest() { data.set(x.id, Array.from(x.selectedOptions, option => option.value).join(',')) }) + if (!requestData.request.objectid) { + console.error('Request being submitted without an objectId!') + } // NOTE: use a proper v4 UUID so this is compatible with the sqlserver ENTITYID datatype - const objectId = requestId || uuidv4() - let coinvestigatorCommands = getCoinvestigatorCommands(data, objectId) - let cohortCommands = getAnimalCohortCommands(data, objectId) - - let rowId = requestId ? {"rowid": requestData.request.rowid} : {} + let coinvestigatorCommands = getCoinvestigatorCommands(data) + let cohortCommands = getAnimalCohortCommands(data) Query.saveRows({ - commands: [ - { - command: requestId ? "update" : "insert", + commands: [{ + command: requestData.request.rowid ? "update" : "insert", schemaName: "mcc", queryName: "animalrequests", rows: [{ - "objectId": objectId, + "rowid": requestData.request.rowid, + "objectId": requestData.request.objectid, "lastname": data.get("investigator-last-name"), "firstname": data.get("investigator-first-name"), "middleinitial": data.get("investigator-middle-initial"), @@ -239,8 +280,6 @@ export function AnimalRequest() { "collaborations": data.get("collaborations"), "isbreedinganimals": data.get("animal-breeding-is-planning-to-breed-animals"), "breedingpurpose": data.get("animal-breeding-purpose"), - "researcharea": data.get("research-area"), - "otherjustification": data.get("research-area-other-specify"), "existingmarmosetcolony": data.get("existing-marmoset-colony"), "existingnhpfacilities": data.get("existing-nhp-facilities"), "animalwelfare": data.get("animal-welfare"), @@ -253,13 +292,106 @@ export function AnimalRequest() { "grantnumber" : data.get("funding-grant-number"), "applicationduedate": data.get("funding-application-due-date"), "status": requestData.request.status, - ...rowId }] }, ...coinvestigatorCommands, ...cohortCommands ], success: function(response) { + // set RowIDs: + if (response.result[0].queryName !== 'animalrequests') { + console.error('The first command was not animal requests! This is not expected.') + } + + const rowId = response.result[0].rows[0].rowid + if (!rowId) { + console.error('No rowId found for the animalrequest row after save. This is not expected.') + } + else { + requestData.request.rowid = rowId + } + + response.result.filter(x => x.command !== 'delete' && x.queryName === 'requestcohorts').forEach((x, idx) => { + if (requestData.cohorts.length < idx) { + console.error('There are more cohort saveRows commands than client-side records') + return + } + + if (x.rows.length != 1) { + console.error('Expected a single row per cohort saveRows command, found: ' + x.rows.length) + return + } + + if (requestData.cohorts[idx].rowid && requestData.cohorts[idx].rowid != x.rows[0].rowid) { + console.error('Cohort row has existing rowId but doesnt match the server: ' + requestData.cohorts[idx].rowid + ' / ' + x.rows[0].rowid) + return + } + + requestData.cohorts[idx].rowid = x.rows[0].rowid + }) + + response.result.filter(x => x.command !== 'delete' && x.queryName === 'coinvestigators').forEach((x, idx) => { + if (requestData.coinvestigators.length < idx) { + console.error('There are more coinvestigators saveRows commands than client-side records') + return + } + + if (x.rows.length != 1) { + console.error('Expected a single row per coinvestigators saveRows command, found: ' + x.rows.length) + return + } + + if (requestData.coinvestigators[idx].rowid && requestData.coinvestigators[idx].rowid != x.rows[0].rowid) { + console.error('Coinvestigators row has existing rowId but doesnt match the server: ' + requestData.coinvestigators[idx].rowid + ' / ' + x.rows[0].rowid) + return + } + + requestData.coinvestigators[idx].rowid = x.rows[0].rowid + }) + + response.result.filter(x => x.command === 'delete').forEach((x, idx) => { + if (x.rows.length != 1) { + console.error('Expected a single row per saveRows delete command, found: ' + x.rows.length) + return + } + + const rowId = x.rows[0].rowid + if (x.queryName === 'requestcohorts') { + deletedCohortRecords.delete(rowId) + setDeletedCohortRecords(new Set(deletedCohortRecords)) + } + else if (x.queryName === 'coinvestigators') { + deletedCoIRecords.delete(rowId) + setDeletedCoIRecords(new Set(deletedCoIRecords)) + } + }) + + if (deletedCoIRecords.size) { + console.log('there are still records in deletedCoIRecords: ' + deletedCoIRecords.size) + } + + if (deletedCohortRecords.size) { + console.log('there are still records in deletedCohortRecords: ' + deletedCohortRecords.size) + } + + setRequestData({...requestData}) + + if (!requestData.request.rowid) { + console.error("Missing request rowid after save") + } + + requestData.cohorts.forEach(x => { + if (!x.rowid) { + console.error("Missing cohort rowid after save") + } + }) + + requestData.coinvestigators.forEach(x => { + if (!x.rowid) { + console.error("Missing coinvestigator rowid after save") + } + }) + setDisplayOverlay(false) if (isSubmitting) { window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view') @@ -363,10 +495,11 @@ export function AnimalRequest() { <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-10"> <Title text="6. Co-Investigators"/> - <CoInvestigators isSubmitting={isSubmitting} defaultValue={requestData.coinvestigators} required={doEnforceRequiredFields()}/> + <CoInvestigators isSubmitting={isSubmitting} required={doEnforceRequiredFields()} coinvestigators={requestData.coinvestigators} onAddRecord={onAddInvestigator} onRemoveRecord={onRemoveCoInvestigator} /> </div> <Title text="7. Existing or proposed funding source (select all that apply)"/> + {/* TODO: Make into checkbox group*/} <Funding id="funding" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> <h3>Institutional Animal Facilities and Capabilities</h3> @@ -387,21 +520,15 @@ export function AnimalRequest() { <Title text="3. Do you plan to breed marmosets?"/> <div className="tw-w-full tw-px-3 tw-mb-4"> - <AnimalBreeding id="animal-breeding" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> + <AnimalBreeding id="animal-breeding" isSubmitting={isSubmitting} request={requestData.request} required={doEnforceRequiredFields()}/> </div> </div> <h3>Research Details</h3> <div className="tw-flex tw-flex-wrap tw-mx-2"> - <Title text="1. Research Area"/> - - <div className="tw-w-full tw-px-3 tw-mb-6"> - <ResearchArea id="research-area" isSubmitting={isSubmitting} defaultValue={requestData.request} required={doEnforceRequiredFields()}/> - </div> - <div className="tw-w-full tw-px-3 tw-mb-4"> - <Title text={"2. " + experimentalRationalePlaceholder}/> + <Title text={"1. " + experimentalRationalePlaceholder}/> <Tooltip id="research-use-statement-helper" text={experimentalRationalePlaceholder} /> @@ -411,12 +538,12 @@ export function AnimalRequest() { </ErrorMessageHandler> </div> - <Title text="3. Animal Cohorts"/> + <Title text="2. Animal Cohorts"/> <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-6"> - <AnimalCohorts isSubmitting={isSubmitting} defaultValue={requestData.cohorts} required={doEnforceRequiredFields()}/> + <AnimalCohorts isSubmitting={isSubmitting} cohorts={requestData.cohorts} required={doEnforceRequiredFields()} onAddCohort={onAddCohort} onRemoveCohort={onRemoveCohort}/> </div> - <Title text={"4. " + methodsProposedPlaceholder}/> + <Title text={"3. " + methodsProposedPlaceholder}/> <div className="tw-w-full tw-px-3 tw-mb-6"> <ErrorMessageHandler isSubmitting={isSubmitting}> <div className="tw-w-full tw-px-3 tw-mb-6"> @@ -425,7 +552,7 @@ export function AnimalRequest() { </ErrorMessageHandler> </div> - <Title text={"5. " + collaborationsPlaceholder}/> + <Title text={"4. " + collaborationsPlaceholder}/> <div className="tw-w-full tw-px-3 tw-mb-6"> <ErrorMessageHandler isSubmitting={isSubmitting}> <div className="tw-w-full tw-px-3 tw-mb-6"> @@ -434,7 +561,7 @@ export function AnimalRequest() { </ErrorMessageHandler> </div> - <Title text={"6. " + animalWellfarePlaceholder}/> + <Title text={"5. " + animalWellfarePlaceholder}/> <div className="tw-w-full tw-px-3 tw-mb-6"> <ErrorMessageHandler isSubmitting={isSubmitting}> <div className="tw-w-full tw-px-3 tw-mb-6"> @@ -452,7 +579,7 @@ export function AnimalRequest() { <ErrorMessageHandler isSubmitting={isSubmitting}> <div className="tw-flex tw-flex-wrap tw-mx-2 tw-mb-4"> - <Title text="7. Attending veterinarian"/> + <Title text="6. Attending veterinarian"/> <div className="tw-w-full md:tw-w-1/2 tw-px-3 tw-mb-6 md:tw-mb-0"> <Input id="vet-last-name" ariaLabel="Last Name" isSubmitting={isSubmitting} placeholder="Last Name" required={doEnforceRequiredFields()} defaultValue={requestData.request.vetlastname}/> @@ -469,7 +596,7 @@ export function AnimalRequest() { </ErrorMessageHandler> </div> - <IACUCProtocol id="iacuc" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} defaultValue={requestData.request}/> + <IACUCProtocol id="iacuc" isSubmitting={isSubmitting} required={doEnforceRequiredFields()} request={requestData.request}/> <div className="tw-flex tw-flex-wrap tw-mx-2"> <Title text="Request Status: "/>{requestData.request.status} diff --git a/mcc/src/client/AnimalRequest/components/animal-breeding.tsx b/mcc/src/client/AnimalRequest/components/animal-breeding.tsx index 05066f3be..0be59f075 100644 --- a/mcc/src/client/AnimalRequest/components/animal-breeding.tsx +++ b/mcc/src/client/AnimalRequest/components/animal-breeding.tsx @@ -5,10 +5,11 @@ import TextArea from './text-area' import ErrorMessageHandler from './error-message-handler' import { animalBreedingPlaceholder } from './values' +import { AnimalRequestProps } from '../../components/RequestUtils'; -export default function AnimalBreeding(props) { +export default function AnimalBreeding(props: {request: AnimalRequestProps, isSubmitting: boolean, required: boolean, id: string}) { - const [displayPurpose, setDisplayPurpose] = useState(props.defaultValue.isbreedinganimals === true ? true : false) + const [displayPurpose, setDisplayPurpose] = useState(props.request.isbreedinganimals === true) function setDisplayPurposeField(value) { if(value == "yes") { @@ -21,13 +22,13 @@ export default function AnimalBreeding(props) { return ( <ErrorMessageHandler isSubmitting={props.isSubmitting}> <div className="tw-mb-6"> - <YesNoRadio id={props.id + "-is-planning-to-breed-animals"} ariaLabel="Planning to breed animals" isSubmitting={props.isSubmitting} required={props.required} defaultValue={props.defaultValue.isbreedinganimals} + <YesNoRadio id={props.id + "-is-planning-to-breed-animals"} ariaLabel="Planning to breed animals" isSubmitting={props.isSubmitting} required={props.required} defaultValue={props.request.isbreedinganimals} onChange={(e) => setDisplayPurposeField(e.currentTarget.value)}/> </div> <div className="tw-mb-6"> <TextArea id={props.id + "-purpose"} ariaLabel="Breeding Program Purpose" isSubmitting={props.isSubmitting} placeholder={animalBreedingPlaceholder} - display={displayPurpose} required={displayPurpose && props.required} defaultValue={props.defaultValue.breedingpurpose}/> + display={displayPurpose} required={displayPurpose && props.required} defaultValue={props.request.breedingpurpose}/> </div> </ErrorMessageHandler> ) diff --git a/mcc/src/client/AnimalRequest/components/animal-cohort.tsx b/mcc/src/client/AnimalRequest/components/animal-cohort.tsx index 2f10c9f78..77aa95ca4 100644 --- a/mcc/src/client/AnimalRequest/components/animal-cohort.tsx +++ b/mcc/src/client/AnimalRequest/components/animal-cohort.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React from 'react'; import InputNumber from './input-number'; import Select from './select'; @@ -9,24 +9,10 @@ import ErrorMessageHandler from './error-message-handler'; import { animalSexes, otherCharacteristicsPlaceholder } from './values'; import { AnimalCohort } from '../../components/RequestUtils'; -export default function AnimalCohorts(props) { - const [cohorts, setCohorts] = useState<AnimalCohort[]>(props.defaultValue) - - function addCohort() { - cohorts.push(new AnimalCohort()) - setCohorts([...cohorts]) - } - - function removeCohort(cohort) { - // NOTE: dont allow removing all cohorts - if (cohorts.length > 1) { - setCohorts([...cohorts.filter(item => item.uuid !== cohort.uuid)]) - } - } - +export default function AnimalCohorts(props: { cohorts: AnimalCohort[], required: boolean, isSubmitting: boolean, onAddCohort: () => void, onRemoveCohort: (x: AnimalCohort) => void}) { return ( <> - {[...cohorts].map((cohort, index) => ( + {[...props.cohorts].map((cohort, index) => ( <ErrorMessageHandler isSubmitting={props.isSubmitting} keyInternal={cohort.uuid} key={cohort.uuid + "-errorHandler"}> <div className="tw-flex tw-flex-wrap tw-w-full tw-mx-2 tw-mb-10" key={cohort.uuid}> <div className="tw-flex tw-flex-wrap tw-w-full tw-mb-6"> @@ -36,7 +22,7 @@ export default function AnimalCohorts(props) { <div className="tw-flex tw-flex-wrap tw-w-full md:tw-w-1/2 md:tw-mb-0"> <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" - onClick={() => removeCohort(cohort)} value="Remove" style={{display: index > 0 ? null : "none"}}/> + onClick={() => props.onRemoveCohort(cohort)} value="Remove" style={{display: index > 0 ? null : "none"}}/> </div> </div> @@ -63,7 +49,7 @@ export default function AnimalCohorts(props) { ))} <div className="tw-w-full tw-px-3 tw-mb-10 md:tw-mb-0"> - <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={addCohort} value="Add Cohort" /> + <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={props.onAddCohort} value="Add Cohort" /> </div> </> ) diff --git a/mcc/src/client/AnimalRequest/components/co-investigators.tsx b/mcc/src/client/AnimalRequest/components/co-investigators.tsx index ca375ee80..2561d3f1d 100644 --- a/mcc/src/client/AnimalRequest/components/co-investigators.tsx +++ b/mcc/src/client/AnimalRequest/components/co-investigators.tsx @@ -1,27 +1,15 @@ -import React, { useState } from 'react'; +import React from 'react'; import Input from './input'; import Title from './title'; import ErrorMessageHandler from './error-message-handler'; import { CoInvestigatorModel } from '../../components/RequestUtils'; -export default function CoInvestigators(props) { - const [coInvestigators, setCoInvestigators] = useState<CoInvestigatorModel[]>(props.defaultValue || []) - - function addInvestigator() { - coInvestigators.push(new CoInvestigatorModel()) - setCoInvestigators([...coInvestigators]) - } - - function removeCoInvestigator(coInvestigator) { - if (coInvestigators.length) { - setCoInvestigators([...coInvestigators.filter(item => item.uuid !== coInvestigator.uuid)]) - } - } +export default function CoInvestigators(props: {coinvestigators: CoInvestigatorModel[], required: boolean, isSubmitting: boolean, onAddRecord: () => void, onRemoveRecord: (x: CoInvestigatorModel) => void}) { return ( <> - {[...coInvestigators].map((coInvestigator, index) => ( + {[...props.coinvestigators].map((coInvestigator, index) => ( <ErrorMessageHandler isSubmitting={props.isSubmitting} keyInternal={coInvestigator.uuid} key={coInvestigator.uuid + "-errorHandler"}> <div className="tw-flex tw-flex-wrap tw-w-full tw-mx-2 tw-mb-4" key={coInvestigator.uuid}> <div className="tw-flex tw-flex-wrap tw-w-full tw-mb-6"> @@ -30,7 +18,7 @@ export default function CoInvestigators(props) { </div> <div className="tw-flex tw-flex-wrap tw-w-full md:tw-w-1/2 md:tw-mb-0"> - <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" onClick={() => removeCoInvestigator(coInvestigator)} value="Remove" /> + <input type="button" className="tw-ml-auto tw-bg-red-500 hover:tw-bg-red-400 tw-text-white tw-font-bold tw-py-2 tw-px-4 tw-border-none tw-rounded" onClick={() => props.onRemoveRecord(coInvestigator)} value="Remove" /> </div> </div> @@ -54,7 +42,7 @@ export default function CoInvestigators(props) { ))} <div className="tw-w-full tw-px-3 tw-mb-6 md:tw-mb-0"> - <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={addInvestigator} value="Add Co-investigator" /> + <input type="button" className="tw-bg-blue-500 hover:tw-bg-blue-400 tw-text-white tw-font-bold tw-py-2 tw-mt-2 tw-px-4 tw-border-none tw-rounded" onClick={props.onAddRecord} value="Add Co-investigator" /> </div> </> ) diff --git a/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx b/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx index f9a1e4730..808641b44 100644 --- a/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx +++ b/mcc/src/client/AnimalRequest/components/iacuc-protocol.tsx @@ -6,13 +6,14 @@ import Title from './title' import ErrorMessageHandler from './error-message-handler' import { IACUCApprovalOptions } from './values' +import { AnimalRequestProps } from '../../components/RequestUtils'; -export default function IACUCProtocol(props) { +export default function IACUCProtocol(props: {request: AnimalRequestProps, isSubmitting: boolean, required: boolean, id: string}) { - const [displayProtocol, setDisplayProtocol] = useState(props.defaultValue.iacucapproval == "approved" ? true : false) + const [displayProtocol, setDisplayProtocol] = useState(props.request.iacucapproval === "approved") function setDisplayProtocolField(value) { - if(value == "approved") { + if (value == "approved") { setDisplayProtocol(true) } else { setDisplayProtocol(false) @@ -22,18 +23,18 @@ export default function IACUCProtocol(props) { return ( <ErrorMessageHandler isSubmitting={props.isSubmitting} rerender={displayProtocol}> <div className="tw-flex tw-flex-wrap tw-mx-2"> - <Title text="8. IACUC Approval"/> + <Title text="7. IACUC Approval"/> <div className="tw-w-full tw-px-3 md:tw-mb-0"> <div className="tw-w-full tw-mb-6"> <Select id={props.id + "-approval"} ariaLabel="IACUC Approval Status" isSubmitting={props.isSubmitting} options={IACUCApprovalOptions} required={props.required} - defaultValue={props.defaultValue.iacucapproval} onChange={(e) => setDisplayProtocolField(e.currentTarget.value)}/> + defaultValue={props.request.iacucapproval} onChange={(e) => setDisplayProtocolField(e.currentTarget.value)}/> </div> <div className="tw-mb-6"> <Input id={props.id + "-protocol"} ariaLabel="IACUC Protocol" isSubmitting={props.isSubmitting} placeholder={"IACUC Protocol Number"} - display={displayProtocol} required={displayProtocol && props.required} defaultValue={props.defaultValue.iacucprotocol}/> + display={displayProtocol} required={displayProtocol && props.required} defaultValue={props.request.iacucprotocol}/> </div> </div> </div> diff --git a/mcc/src/client/AnimalRequest/research-area.tsx b/mcc/src/client/AnimalRequest/research-area.tsx deleted file mode 100644 index 522f9e89a..000000000 --- a/mcc/src/client/AnimalRequest/research-area.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { useState } from 'react'; - -import Select from './components/select' -import Input from './components/input' -import Title from './components/title' -import ErrorMessageHandler from './components/error-message-handler' - -import { researchAreaOptions } from './components/values' - -export default function ResearchArea(props) { - - const [displayOther, setDisplayOther] = useState(props.defaultValue.researcharea == "other" ? true : false) - - function setDisplayOtherField(el) { - const valArray = Array.prototype.map.call(el.selectedOptions, function(x){ return x.value }) - if (valArray && valArray.indexOf("other") > -1) { - setDisplayOther(true) - } else { - setDisplayOther(false) - } - } - - return ( - <ErrorMessageHandler isSubmitting={props.isSubmitting} rerender={displayOther}> - <div className="tw-w-full tw-px-3 tw-mb-10"> - <div className="tw-w-full tw-mb-8"> - <Select id={props.id} options={researchAreaOptions} ariaLabel="Research Area" multiSelect={true} isSubmitting={props.isSubmitting} onChange={(e) => setDisplayOtherField(e.currentTarget)} defaultValue={props.defaultValue.researcharea} required={props.required}/> - </div> - - <div className="tw-w-full tw-mb-8"> - <Input id={props.id + "-other-specify"} ariaLabel="Other" isSubmitting={props.isSubmitting} placeholder="Please specify" display={displayOther} required={displayOther && props.required} defaultValue={props.defaultValue.otherjustification}/> - </div> - </div> - </ErrorMessageHandler> - ) -} diff --git a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx index 0c846df0c..66a2df7a9 100644 --- a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx @@ -12,7 +12,6 @@ export default function InternalReviewForm(props: {requestId: string, readOnly?: "rowid", "preliminaryScore", "resourceAvailabilityScore", - "researchAreaPriorityScore", "proposalScore", "comments", "requestid" @@ -66,9 +65,6 @@ export default function InternalReviewForm(props: {requestId: string, readOnly?: <TableRow> <TableCell><TextField key={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> </TableRow> - <TableRow> - <TableCell><TextField key={"researchAreaPriorityScore"} label={"Research Area Priority Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.researchAreaPriorityScore || ''} fullWidth={true} /></TableCell> - </TableRow> <TableRow> <TableCell><TextField key={"proposalScore"} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> </TableRow> diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx index 188147e2a..56c538c11 100644 --- a/mcc/src/client/RequestReview/components/RabReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -1,6 +1,17 @@ import { Filter, getServerContext, Query } from '@labkey/api'; import React, { FormEvent, useState } from 'react'; -import { Box, Button, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; +import { + Box, + Button, + MenuItem, + Select, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + TextField +} from '@material-ui/core'; export default function RabReviewForm(props: {requestId: string, readOnly?: boolean}) { const [ recordData, setRecordData ] = useState(null) @@ -38,7 +49,7 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool //TODO: this indicates the review was already entered. Do we want to allow updates? } - setRecordData({...resp.rows[0]}) + setRecordData({...resp.rows}) }, failure: function(response) { alert(response.exception) @@ -50,12 +61,23 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool } if (props.readOnly) { - return(<div>This needs to render a simple read-only table of the reviews</div>) + return( + <Table> + <TableHead> + <TableRow key={"header"}><TableCell>Reviewer</TableCell><TableCell>Score</TableCell><TableCell>Comments</TableCell></TableRow> + </TableHead> + <TableBody> + {recordData.map(row => { + return(<TableRow key={"review-" + row.reviewerid}><TableCell>{row.reviewerid}</TableCell><TableCell>{row.score}</TableCell><TableCell>{row.comments}</TableCell></TableRow>) + })} + </TableBody> + </Table> + ) } const handleChange = (e) => { - recordData[e.target.name] = e.target.value ? e.target.value.trim() : null - setRecordData({...recordData}) + recordData[0][e.target.name] = e.target.value ? e.target.value.trim() : null + setRecordData([...recordData]) console.log(e.target.name) console.log(e.target.value.trim()) @@ -67,22 +89,28 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool console.log(recordData) - // TODO: save this record and navigateBack to + // TODO: save this record and navigateBack to the prior page } return ( <> - <h2>Enter MCC Review</h2> + <h2>Enter Review</h2> <form noValidate autoComplete='off' onSubmit={onFormSubmit}> <Box style={{display: 'inline-block'}}> - <Table width={500}> + After reviewing the request, please fill out the section below and provide a 2-3 sentence justification for your choice. + <Table width={500}> <TableBody> <TableRow> - {/*TODO: this probably needs to be a select*/} - <TableCell><TextField key={"review"} label={"Review"} onChange={handleChange} variant={'outlined'} value={recordData.review || ''} disabled={true} fullWidth={true}/></TableCell> + <TableCell> + <Select id={"review"} aria-label="Review" onChange={handleChange} required={true} defaultValue={recordData[0].review} fullWidth={true} displayEmpty={true}> + <MenuItem value={"I recommend this proposal"}>I recommend this proposal</MenuItem> + <MenuItem value={"I recommend this proposal with conditions"}>I recommend this proposal with conditions</MenuItem> + <MenuItem value={"I do not recommend this proposal"}>I do not recommend this proposal</MenuItem> + </Select> + </TableCell> </TableRow> <TableRow> - <TableCell><TextField key={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"comments"} label={"Justification"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData[0].comments || ''} fullWidth={true} /></TableCell> </TableRow> </TableBody> </Table> diff --git a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx index 404216904..16fd01045 100644 --- a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx +++ b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx @@ -128,7 +128,7 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} Plans to Breed Marmosets: </Grid> <Grid item xs={10}> - {requestData.request.isbreedinganimals} + {requestData.request.isbreedinganimals ? 'Yes' : 'No'} </Grid> <Grid item xs={2} className={styles.fieldLabel}> Breeding Purpose: @@ -141,19 +141,6 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} <p /> <h4 style={{marginTop: 10}}>Research Details</h4> <Grid container spacing={1} style={{marginLeft: 10}}> - <Grid item xs={2} className={styles.fieldLabel}> - Research Area: - </Grid> - <Grid item xs={10}> - {translateRawToDisplayValue(requestData.request.researcharea, researchAreaOptions)} - </Grid> - <Grid item xs={2} className={styles.fieldLabel}> - Experimental Rationale: - </Grid> - <Grid item xs={10}> - {requestData.request.otherjustification} - </Grid> - <Grid item xs={2} className={styles.fieldLabel}> Animal Cohorts: </Grid> @@ -207,7 +194,8 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} IACUC Approval: </Grid> <Grid item xs={10}> - {translateRawToDisplayValue(requestData.request.iacucprotocol, IACUCApprovalOptions)} + {translateRawToDisplayValue(requestData.request.iacucapproval, IACUCApprovalOptions)} + {requestData.request.iacucprotocol ? ' (' + requestData.request.iacucprotocol + ')' : ''} </Grid> </Grid> <p /> diff --git a/mcc/src/client/components/RequestUtils.tsx b/mcc/src/client/components/RequestUtils.tsx index ed79c4101..7148db5b2 100644 --- a/mcc/src/client/components/RequestUtils.tsx +++ b/mcc/src/client/components/RequestUtils.tsx @@ -28,9 +28,8 @@ export class AnimalRequestProps { breedingpurpose: string; methodsproposed: string; collaborations: string; - researcharea: string; - otherjustification: string; iacucprotocol: string; + iacucapproval: string; existingmarmosetcolony: string; existingnhpfacilities: string; rowid: number; @@ -66,7 +65,9 @@ export async function queryRequestInformation(requestId, handleFailure) { if (!requestId) { requestData.dataLoaded = true + requestData.request.objectid = requestData.request.objectid || uuidv4() requestData.cohorts = [new AnimalCohort()] + return(requestData) } @@ -95,8 +96,6 @@ export async function queryRequestInformation(requestId, handleFailure) { "collaborations", "isbreedinganimals", "breedingpurpose", - "researcharea", - "otherjustification", "existingmarmosetcolony", "existingnhpfacilities", "animalwelfare", diff --git a/mcc/src/org/labkey/mcc/MccModule.java b/mcc/src/org/labkey/mcc/MccModule.java index 5c17604fe..40c4adb3a 100644 --- a/mcc/src/org/labkey/mcc/MccModule.java +++ b/mcc/src/org/labkey/mcc/MccModule.java @@ -50,7 +50,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 20.010; + return 20.011; } @Override diff --git a/mcc/src/org/labkey/mcc/MccUserSchema.java b/mcc/src/org/labkey/mcc/MccUserSchema.java index 309665611..c9a63fbee 100644 --- a/mcc/src/org/labkey/mcc/MccUserSchema.java +++ b/mcc/src/org/labkey/mcc/MccUserSchema.java @@ -4,9 +4,16 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; +import org.labkey.api.data.DataColumn; import org.labkey.api.data.DbSchema; +import org.labkey.api.data.JdbcType; +import org.labkey.api.data.MutableColumnInfo; +import org.labkey.api.data.SQLFragment; import org.labkey.api.data.TableInfo; +import org.labkey.api.data.WrappedColumnInfo; import org.labkey.api.ldk.table.CustomPermissionsTable; +import org.labkey.api.query.ExprColumn; +import org.labkey.api.query.FieldKey; import org.labkey.api.query.SimpleUserSchema; import org.labkey.api.security.User; import org.labkey.api.security.permissions.DeletePermission; @@ -34,9 +41,52 @@ protected TableInfo createWrappedTable(String name, @NotNull TableInfo schemaTab ret.addPermissionMapping(UpdatePermission.class, MccRequestAdminPermission.class); ret.addPermissionMapping(DeletePermission.class, MccRequestAdminPermission.class); - return ret.init(); + ret = ret.init(); + + if (MccSchema.TABLE_REQUEST_SCORE.equalsIgnoreCase(name)) + { + return addScoreColumns(ret); + } + + return ret; } return super.createWrappedTable(name, schemaTable, cf); } + + private CustomPermissionsTable<?> addScoreColumns(CustomPermissionsTable<?> ti) + { + if (ti.getColumn("rabReviewStatus") == null) + { + SQLFragment sql = new SQLFragment("(SELECT CONCAT(COALESCE(CAST(sum(CASE WHEN r.score IS NULL THEN 0 ELSE 1 END) as varchar), '0'), ' of ', cast(count(*) as varchar)) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + ExprColumn newCol = new ExprColumn(ti, "rabReviewStatus", sql, JdbcType.VARCHAR, ti.getColumn("requestId")); + + newCol.setLabel("RAB Review Status"); + newCol.setDisplayColumnFactory(colInfo -> { + return new DataColumn(colInfo) + { + @Override + public boolean isFilterable() + { + return false; + } + + @Override + public boolean isSortable() + { + return false; + } + }; + }); + + ti.addColumn(newCol); + + SQLFragment sql2 = new SQLFragment("(SELECT COALESCE(sum(CASE WHEN r.score IS NULL THEN 0 ELSE 1 END), 0) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + ExprColumn newCol2 = new ExprColumn(ti, "pendingRabReviews", sql2, JdbcType.INTEGER, ti.getColumn("requestId")); + newCol2.setLabel("Pending RAB Reviews"); + ti.addColumn(newCol2); + } + + return ti; + } } diff --git a/mcc/src/org/labkey/mcc/query/MccRequest.java b/mcc/src/org/labkey/mcc/query/MccRequest.java index 6b9ef28ce..c89f69fdb 100644 --- a/mcc/src/org/labkey/mcc/query/MccRequest.java +++ b/mcc/src/org/labkey/mcc/query/MccRequest.java @@ -33,7 +33,6 @@ public class MccRequest private String _collaborations; private Boolean _isbreedinganimals; private String _breedingpurpose; - private String _otherjustification; private Boolean _existingmarmosetcolony; private Boolean _existingnhpfacilities; private String _animalwelfare; @@ -267,16 +266,6 @@ public void setBreedingpurpose(String breedingpurpose) _breedingpurpose = breedingpurpose; } - public String getOtherjustification() - { - return _otherjustification; - } - - public void setOtherjustification(String otherjustification) - { - _otherjustification = otherjustification; - } - public Boolean getExistingmarmosetcolony() { return _existingmarmosetcolony; diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index 777f6fa4c..92fbb1811 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -146,6 +146,10 @@ public void setFieldValue(BaseWebDriverTest test) { test.waitAndClick(getLocator()); } + else if ("select".equals(inputType)) + { + test.selectOptionByText(getLocator(), String.valueOf(fieldValue)); + } else { test.setFormElement(getLocator(), String.valueOf(fieldValue)); @@ -192,7 +196,6 @@ else if ("radio".equals(inputType)) new FormElement("methods-proposed", "methodsproposed", "methods").inputType("textarea"), new FormElement("collaborations", "collaborations", "collaborations").inputType("textarea"), new FormElement("animal-breeding-is-planning-to-breed-animals", "isbreedinganimals", false).radio(), - new FormElement("research-area", "researcharea", "Rare disease research").select("rare-disease"), new FormElement("existing-marmoset-colony", "existingmarmosetcolony", "Existing marmoset colony").select("existing"), new FormElement("existing-nhp-facilities", "existingnhpfacilities", "Existing NHP facilities").select("existing"), new FormElement("animal-welfare", "animalwelfare", "welfare").inputType("textarea"), @@ -234,8 +237,24 @@ private void doRequestFormTest() throws Exception addCoinvestigator(0, true); addCoinvestigator(1, true); + int expectedRequests = getRequestRows().size(); + + waitAndClick(getButton("Save")); + waitForSaveToComplete(); + + List<Map<String, Object>> requestRows = getRequestRows(); + String requestId = (String)requestRows.get(0).get("objectid"); + Assert.assertEquals(expectedRequests + 1, requestRows.size()); + + Assert.assertEquals(2, getCoinvestigatorRecords(requestId).size()); + Assert.assertEquals(1, getCohortRecords(requestId).size()); + + // This is to ensure we update the record we have, rather than create a new one waitAndClick(getButton("Save")); waitForSaveToComplete(); + Assert.assertEquals(expectedRequests + 1, getRequestRows().size()); + Assert.assertEquals(2, getCoinvestigatorRecords(requestId).size()); + Assert.assertEquals(1, getCohortRecords(requestId).size()); // Verify record created: Map<String, Object> request = getLastModifiedRequestRow(); @@ -246,6 +265,26 @@ private void doRequestFormTest() throws Exception assertCohortValues((String)request.get("objectid"), 1); assertCoinvestigatorValues((String)request.get("objectid"), 2); + + // Remove Co-I, save: + Locator removeBtn = Locator.tagWithText("p", "Co-Investigator 2").parent("div").followingSibling("div").index(0).child("input"); + waitForElement(removeBtn); + click(removeBtn); + waitForElementToDisappear(removeBtn); + + waitAndClick(getButton("Save")); + waitForSaveToComplete(); + Assert.assertEquals(1, getCoinvestigatorRecords(requestId).size()); + Assert.assertEquals(1, getCohortRecords(requestId).size()); + + // Test IACUC toggle + selectOptionByText(getFormElementByName("iacucapproval").getLocator(), "Approved"); + waitForElement(Locator.tagWithId("input", "iacuc-protocol")); + setFormElement(Locator.tagWithId("input", "iacuc-protocol"), "IACUC 123456"); + waitAndClick(getButton("Save")); + waitForSaveToComplete(); + + Assert.assertEquals(getLastModifiedRequestRow().get("iacucprotocol"), "IACUC 123456"); } private FormElement[] getCoinvestigatorFields(int idx) @@ -327,16 +366,24 @@ private void assertCohortValues(String requestId, int expectedRecords) throws Ex } } - private Map<String, Object> getLastModifiedRequestRow() throws Exception + private List<Map<String, Object>> getRequestRows() throws Exception { SelectRowsCommand sr = new SelectRowsCommand("mcc", "animalrequests"); sr.addSort(new Sort("modified", Sort.Direction.DESCENDING)); List<String> cols = new ArrayList<>(Arrays.stream(FORM_DATA).map(FormElement::getDatabaseFieldName).collect(Collectors.toList())); cols.add("objectid"); + cols.add("iacucprotocol"); sr.setColumns(cols); SelectRowsResponse srr = sr.execute(createDefaultConnection(), getProjectName()); - return srr.getRows().get(0); + return srr.getRows(); + } + + private Map<String, Object> getLastModifiedRequestRow() throws Exception + { + List<Map<String, Object>> rr = getRequestRows(); + + return rr.isEmpty() ? null : rr.get(0); } private List<Map<String, Object>> getCohortRecords(String requestId) throws Exception From ba11ce2a05ba561dcaf34d08a28ebd5d0ba6d4fe Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 07:22:43 -0700 Subject: [PATCH 36/63] Add returnURL to mcc columns --- mcc/src/client/AnimalRequest/animal-request.tsx | 13 ++++++++++++- .../RequestReview/components/RabReviewForm.tsx | 12 ++++-------- .../RequestScoreActionsDisplayColumnFactory.java | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx index b1d5b894e..63b707ee7 100644 --- a/mcc/src/client/AnimalRequest/animal-request.tsx +++ b/mcc/src/client/AnimalRequest/animal-request.tsx @@ -394,7 +394,18 @@ export function AnimalRequest() { setDisplayOverlay(false) if (isSubmitting) { - window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view') + const returnURL = (new URLSearchParams(window.location.search)).get("requestId") + let dest = ActionURL.buildURL('mcc', 'mccRequests.view') + if (returnURL) { + try { + dest = new URL(returnURL).href + } + catch (e) { + + } + } + + window.location.href = dest } }, failure: handleFailure diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx index 56c538c11..a836f8318 100644 --- a/mcc/src/client/RequestReview/components/RabReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -41,14 +41,6 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool ], filterArray: filters, success: function (resp) { - if (!resp.rows.length) { - //TODO: error? - } - - if (resp.rows.review) { - //TODO: this indicates the review was already entered. Do we want to allow updates? - } - setRecordData({...resp.rows}) }, failure: function(response) { @@ -75,6 +67,10 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool ) } + if (!recordData?.length) { + return(<div style={{paddingTop: 20}}>You have not been assigned to review this request</div>) + } + const handleChange = (e) => { recordData[0][e.target.name] = e.target.value ? e.target.value.trim() : null setRecordData([...recordData]) diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 82b043300..0bc06cf0f 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -68,7 +68,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep if (st == MccManager.RequestStatus.Submitted) { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=primaryReview", requestContainer); - out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter MCC Internal Review</a>"); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter MCC Internal Review</a>"); } else if (st == MccManager.RequestStatus.FormCheck) { @@ -77,7 +77,7 @@ else if (st == MccManager.RequestStatus.FormCheck) else if (st == MccManager.RequestStatus.RabReview) { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); - out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Final Review</a>"); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); } else if (st == MccManager.RequestStatus.Approved) { From 0fea03b960c39fa11c8cbdf811ac44ccf585c90a Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 09:41:51 -0700 Subject: [PATCH 37/63] Handful of small MCC form improvements --- mcc/resources/schemas/mcc.xml | 5 ++--- mcc/src/client/RequestReview/request-review.tsx | 2 ++ mcc/src/org/labkey/mcc/MccUserSchema.java | 15 +++++++++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 763b3af5d..5580432e2 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -216,8 +216,7 @@ <importUrl>mcc/animalRequest.view</importUrl> <insertUrl>mcc/animalRequest.view</insertUrl> <updateUrl>mcc/animalRequest.view?requestId=${objectid}</updateUrl> - <deleteUrl /> - <tableUrl /> + <tableUrl>mcc/requestReview.view?requestId=${objectid}&mode=details</tableUrl> <auditLogging>DETAILED</auditLogging> <pkColumnName>rowid</pkColumnName> <columns> @@ -653,7 +652,7 @@ <insertUrl /> <importUrl /> <updateUrl /> - <tableUrl /> + <tableUrl>/mcc/requestReview.view?requestId=${requestId}&mode=details</tableUrl> <deleteUrl /> <tableTitle>Animal Request Reviews</tableTitle> <auditLogging>DETAILED</auditLogging> diff --git a/mcc/src/client/RequestReview/request-review.tsx b/mcc/src/client/RequestReview/request-review.tsx index fd7a19a8a..97eeadf81 100644 --- a/mcc/src/client/RequestReview/request-review.tsx +++ b/mcc/src/client/RequestReview/request-review.tsx @@ -48,6 +48,8 @@ export function RequestView() { let reviewForms = null switch (mode) { + case "details": + break case "primaryReview": reviewForms = [ <InternalReviewForm key={"internalReviewForm"} requestId={requestId}/> diff --git a/mcc/src/org/labkey/mcc/MccUserSchema.java b/mcc/src/org/labkey/mcc/MccUserSchema.java index c9a63fbee..e7ece31b2 100644 --- a/mcc/src/org/labkey/mcc/MccUserSchema.java +++ b/mcc/src/org/labkey/mcc/MccUserSchema.java @@ -7,13 +7,10 @@ import org.labkey.api.data.DataColumn; import org.labkey.api.data.DbSchema; import org.labkey.api.data.JdbcType; -import org.labkey.api.data.MutableColumnInfo; import org.labkey.api.data.SQLFragment; import org.labkey.api.data.TableInfo; -import org.labkey.api.data.WrappedColumnInfo; import org.labkey.api.ldk.table.CustomPermissionsTable; import org.labkey.api.query.ExprColumn; -import org.labkey.api.query.FieldKey; import org.labkey.api.query.SimpleUserSchema; import org.labkey.api.security.User; import org.labkey.api.security.permissions.DeletePermission; @@ -21,6 +18,7 @@ import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; import org.labkey.mcc.security.MccRequestAdminPermission; +import org.labkey.mcc.security.MccRequestorPermission; public class MccUserSchema extends SimpleUserSchema { @@ -33,7 +31,16 @@ public MccUserSchema(User user, Container container, DbSchema dbschema) @Nullable protected TableInfo createWrappedTable(String name, @NotNull TableInfo schemaTable, ContainerFilter cf) { - if (MccSchema.TABLE_REQUEST_REVIEWS.equalsIgnoreCase(name) || MccSchema.TABLE_REQUEST_SCORE.equalsIgnoreCase(name)) + if (MccSchema.TABLE_ANIMAL_REQUESTS.equalsIgnoreCase(name)) + { + CustomPermissionsTable<?> ret = new CustomPermissionsTable<>(this, schemaTable, cf); + ret.addPermissionMapping(InsertPermission.class, MccRequestorPermission.class); + ret.addPermissionMapping(UpdatePermission.class, MccRequestorPermission.class); + ret.addPermissionMapping(DeletePermission.class, MccRequestAdminPermission.class); + + return ret.init(); + } + else if (MccSchema.TABLE_REQUEST_REVIEWS.equalsIgnoreCase(name) || MccSchema.TABLE_REQUEST_SCORE.equalsIgnoreCase(name)) { CustomPermissionsTable<?> ret = new CustomPermissionsTable<>(this, schemaTable, cf); ret.addPermissionMapping(ReadPermission.class, MccRequestAdminPermission.class); From 12fc73c2e484c13d8cfebbd2435f6d3d42dd31fb Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 12:38:03 -0700 Subject: [PATCH 38/63] More minor MCC improvements --- mcc/resources/views/mccAdmin.html | 2 +- mcc/resources/views/mccRequestAdmin.html | 3 ++- mcc/src/org/labkey/mcc/MccController.java | 28 ++++++++++------------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/mcc/resources/views/mccAdmin.html b/mcc/resources/views/mccAdmin.html index 7412eecf4..25b91f8ba 100644 --- a/mcc/resources/views/mccAdmin.html +++ b/mcc/resources/views/mccAdmin.html @@ -21,7 +21,7 @@ }, {header: 'Configuration/Data Management', items: [ - {name: 'Ensure Site Settings and Groups', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/mcc-executeQuery.view?schemaName=mcc&queryName=userRequests?'} + {name: 'Ensure Site Settings and Groups', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/mcc-configureMcc.view'} ] } diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index 8e74d0cfd..0acb62857 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -54,7 +54,8 @@ //frame: 'none', schemaName: 'core', queryName: 'Members', - filterArray: [LABKEY.Filter.create('GroupId/Name', 'MCC RAB')], + columns: 'UserId,UserId/FirstName,UserId/LastName,UserId/Email', + filterArray: [LABKEY.Filter.create('GroupId/Name', 'MCC RAB Members')], showRecordSelectors: false, showDetailsColumn: false, buttonBar: {position: 'top', includeStandardButtons: true, items: []} diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index c7671dade..145311f1d 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -530,7 +530,7 @@ public void setComment(String comment) } @RequiresPermission(AdminPermission.class) - public class ConfigureMccAction extends ConfirmAction<Object> + public static class ConfigureMccAction extends ConfirmAction<Object> { @Override public ModelAndView getConfirmView(Object o, BindException errors) throws Exception @@ -546,7 +546,14 @@ public ModelAndView getConfirmView(Object o, BindException errors) throws Except @Override public boolean handlePost(Object o, BindException errors) throws Exception { - + for (String gn : Arrays.asList(MccManager.REQUEST_GROUP_NAME, MccManager.ANIMAL_GROUP_NAME, MccManager.REQUEST_REVIEW_GROUP_NAME)) + { + Group g1 = GroupManager.getGroup(ContainerManager.getRoot(), gn, GroupEnumType.SITE); + if (g1 == null) + { + SecurityManager.createGroup(ContainerManager.getRoot(), gn); + } + } return true; } @@ -557,32 +564,21 @@ public void validateCommand(Object o, Errors errors) Container mccContainer = MccManager.get().getMCCContainer(); if (mccContainer == null) { - + errors.reject(ERROR_MSG, "The MCC data container property has not been set"); } Container requestContainer = MccManager.get().getMCCRequestContainer(); if (requestContainer == null) { - - } - - for (String gn : Arrays.asList(MccManager.REQUEST_GROUP_NAME, MccManager.ANIMAL_GROUP_NAME, MccManager.REQUEST_REVIEW_GROUP_NAME)) - { - Group g1 = GroupManager.getGroup(ContainerManager.getRoot(), gn, GroupEnumType.SITE); - if (g1 == null) - { - g1 = SecurityManager.createGroup(ContainerManager.getRoot(), MccManager.REQUEST_GROUP_NAME); - } + errors.reject(ERROR_MSG, "The MCC request container property has not been set"); } - - //TODO } @NotNull @Override public URLHelper getSuccessURL(Object o) { - return PageFlowUtil.urlProvider(PipelineUrls.class).urlBegin(getContainer()); + return getContainer().getStartURL(getUser()); } } From b3f572060cc46197bfb13c4d44f909300fe190b7 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 12:54:57 -0700 Subject: [PATCH 39/63] More minor MCC improvements --- mcc/resources/views/requestLogin.html | 2 +- mcc/src/client/AnimalRequest/animal-request.tsx | 2 ++ mcc/src/client/components/RequestUtils.tsx | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mcc/resources/views/requestLogin.html b/mcc/resources/views/requestLogin.html index 6c3b1fb7f..90c7565ad 100644 --- a/mcc/resources/views/requestLogin.html +++ b/mcc/resources/views/requestLogin.html @@ -42,7 +42,7 @@ },{ xtype: 'textfield', labelWidth: 130, - fieldLabel: 'Title', + fieldLabel: 'Job Title', name: 'title', width: 500, allowBlank: false diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx index 63b707ee7..ab7696534 100644 --- a/mcc/src/client/AnimalRequest/animal-request.tsx +++ b/mcc/src/client/AnimalRequest/animal-request.tsx @@ -86,6 +86,7 @@ export function AnimalRequest() { if (!requestData) { queryRequestInformation(requestId, handleFailure).then((model) => { setRequestData(model) + setStateRollbackOnFailure(requestData.request.status) }) } @@ -375,6 +376,7 @@ export function AnimalRequest() { } setRequestData({...requestData}) + setStateRollbackOnFailure(requestData.request.status) if (!requestData.request.rowid) { console.error("Missing request rowid after save") diff --git a/mcc/src/client/components/RequestUtils.tsx b/mcc/src/client/components/RequestUtils.tsx index 7148db5b2..ef89e5abe 100644 --- a/mcc/src/client/components/RequestUtils.tsx +++ b/mcc/src/client/components/RequestUtils.tsx @@ -66,6 +66,7 @@ export async function queryRequestInformation(requestId, handleFailure) { if (!requestId) { requestData.dataLoaded = true requestData.request.objectid = requestData.request.objectid || uuidv4() + requestData.request.status = 'Draft' requestData.cohorts = [new AnimalCohort()] return(requestData) From d5fbdf39376b37f498be519e73cebf5ef1f28c5d Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 13:46:34 -0700 Subject: [PATCH 40/63] Non-admin users cannot write to requestscores, so use schema-layer for trigger script --- mcc/resources/queries/mcc/animalRequests.js | 13 ++++++- .../client/AnimalRequest/animal-request.tsx | 14 +++++++- .../org/labkey/mcc/query/TriggerHelper.java | 36 +++++++------------ 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index b126b5712..caa25b626 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -14,6 +14,8 @@ function beforeUpdate(row, oldRow, errors){ function beforeUpsert(row, oldRow, errors) { if (!row.status) { console.error('Request row being submitted without a status: ' + row.objectid) + console.error(row) + console.error(oldRow) } row.status = row.status || 'Draft' @@ -34,7 +36,16 @@ function afterUpdate(row, oldRow, errors){ function afterUpsert(row, oldRow, errors) { if (row.status && row.status !== 'Draft') { - triggerHelper.ensureReviewRecordsCreated(row.objectId, row.status, oldRow ? oldRow.status : null, calculatePreliminaryScore(row)); + try { + triggerHelper.ensureReviewRecordsCreated(row.objectId, row.status, oldRow ? oldRow.status : null, calculatePreliminaryScore(row)); + } + catch(e) { + console.error('Error in animalRequest.afterUpsert') + console.error(e) + console.error(row) + console.error(oldRow) + errors._form = 'Error saving record' + } } } diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx index ab7696534..309fa4d05 100644 --- a/mcc/src/client/AnimalRequest/animal-request.tsx +++ b/mcc/src/client/AnimalRequest/animal-request.tsx @@ -86,7 +86,7 @@ export function AnimalRequest() { if (!requestData) { queryRequestInformation(requestId, handleFailure).then((model) => { setRequestData(model) - setStateRollbackOnFailure(requestData.request.status) + setStateRollbackOnFailure(requestData?.request.status) }) } @@ -248,9 +248,14 @@ export function AnimalRequest() { data.set(x.id, Array.from(x.selectedOptions, option => option.value).join(',')) }) + if (!requestData.request.status) { + console.error('Request being submitted without a status!') + } + if (!requestData.request.objectid) { console.error('Request being submitted without an objectId!') } + // NOTE: use a proper v4 UUID so this is compatible with the sqlserver ENTITYID datatype let coinvestigatorCommands = getCoinvestigatorCommands(data) let cohortCommands = getAnimalCohortCommands(data) @@ -312,6 +317,13 @@ export function AnimalRequest() { requestData.request.rowid = rowId } + if (response.result[0].rows[0].rowid.status) { + requestData.request.status = response.result[0].rows[0].rowid.status + } + else { + console.error('Status was null for the animalrequest row after save. This is not expected.') + } + response.result.filter(x => x.command !== 'delete' && x.queryName === 'requestcohorts').forEach((x, idx) => { if (requestData.cohorts.length < idx) { console.error('There are more cohort saveRows commands than client-side records') diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index f069d5c6a..39220b323 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -12,11 +12,11 @@ import org.labkey.api.data.DbSequence; import org.labkey.api.data.DbSequenceManager; import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; import org.labkey.api.query.BatchValidationException; import org.labkey.api.query.DetailsURL; -import org.labkey.api.query.DuplicateKeyException; import org.labkey.api.query.FieldKey; import org.labkey.api.query.InvalidKeyException; import org.labkey.api.query.QueryService; @@ -35,7 +35,6 @@ import javax.mail.Address; import javax.mail.Message; import java.sql.SQLException; -import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @@ -96,7 +95,9 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable return; } - TableSelector ts = new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_REQUEST_SCORE), PageFlowUtil.set("rowid", "preliminaryScore"), new SimpleFilter(FieldKey.fromString("requestid"), objectId), null); + // NOTE: regular users (opposed to those with MccRequestAdminPermission) cannot read this table. Therefore do these operations using the schema layer, not QUS + TableInfo scoreTable = MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_REQUEST_SCORE); + TableSelector ts = new TableSelector(scoreTable, PageFlowUtil.set("rowid", "preliminaryScore"), new SimpleFilter(FieldKey.fromString("requestid"), objectId), null); if (!ts.exists()) { Map<String, Object> toInsert = new CaseInsensitiveHashMap<>(); @@ -109,16 +110,7 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable toInsert.put("modified", new Date()); toInsert.put("modifiedby", _user.getUserId()); - try - { - BatchValidationException bve = new BatchValidationException(); - TableInfo ti = QueryService.get().getUserSchema(_user, _container, MccSchema.NAME).getTable(MccSchema.TABLE_REQUEST_SCORE); - ti.getUpdateService().insertRows(_user, _container, Arrays.asList(toInsert), bve, null, null); - } - catch (QueryUpdateServiceException | BatchValidationException | DuplicateKeyException | SQLException e) - { - _log.error("Unable to create requestScore rows for request: " + objectId, e); - } + Table.insert(_user, scoreTable, toInsert); } else { @@ -132,16 +124,10 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable Map<String, Object> row = records.get(0); if (score != (Integer)row.get("preliminaryScore")) { - try - { - row.put("preliminaryScore", score); - TableInfo ti = QueryService.get().getUserSchema(_user, _container, MccSchema.NAME).getTable(MccSchema.TABLE_REQUEST_SCORE); - ti.getUpdateService().updateRows(_user, _container, Arrays.asList(row), Arrays.asList(Collections.singletonMap("rowid", row.get("rowid"))), null, null); - } - catch (QueryUpdateServiceException | BatchValidationException | InvalidKeyException | SQLException e) - { - _log.error("Unable to update score for: " + objectId, e); - } + row.put("preliminaryScore", score); + row.put("modified", new Date()); + row.put("modifiedby", _user.getUserId()); + Table.update(_user, scoreTable, row, row.get("rowid")); } } @@ -156,6 +142,10 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable { _log.error("Unknown MCC status: " + status); } + catch (Exception e) + { + _log.error("Error in ensureReviewRecordsCreated", e); + } } private void sendInitialNotification() { From 31af2d0a67b6c92f4152e83abde2ca1b2191a12f Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 13:47:43 -0700 Subject: [PATCH 41/63] Update field description --- mcc/src/client/AnimalRequest/components/values.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/client/AnimalRequest/components/values.ts b/mcc/src/client/AnimalRequest/components/values.ts index d33c5247c..0f187d560 100644 --- a/mcc/src/client/AnimalRequest/components/values.ts +++ b/mcc/src/client/AnimalRequest/components/values.ts @@ -5,7 +5,7 @@ export const researchUseStatementTooltip = "This will hold an explanation of the export const signingOfficialTooltip = "An SO has institutional authority to legally bind the institution in grant-administration matters by providing signature approval on grant application submissions. The SO monitors grant related activities within the extramural organization and may have a number of titles. The SO can also create additional accounts for personnel at their institution, including new signing official accounts." export const experimentalRationalePlaceholder = "Experimental rationale and justification for the selection of marmosets" -export const otherCharacteristicsPlaceholder = "Other characteristics (ie. Sex, age, disease state, genotype...)" +export const otherCharacteristicsPlaceholder = "Other characteristics (ie. age, disease state, genotype...)" export const methodsProposedPlaceholder = "Methods proposed and investigators' experience in the methods" export const animalBreedingPlaceholder = "Purpose of the animal breeding program" export const collaborationsPlaceholder = "Any collaborations, pilot studies, and/or publications" From eff7bb2609e81e01447274dc3e52cabfd79318f2 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 14:50:44 -0700 Subject: [PATCH 42/63] Add basic COVID candidate gene table --- mGAP/resources/views/phenotypes.html | 88 ++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/mGAP/resources/views/phenotypes.html b/mGAP/resources/views/phenotypes.html index ee3ecc037..fa3252551 100644 --- a/mGAP/resources/views/phenotypes.html +++ b/mGAP/resources/views/phenotypes.html @@ -81,6 +81,83 @@ var rowId = mGAP.Utils.getMGapReleaseId(); var url = LABKEY.ActionURL.buildURL('mgap', 'phenotypeList', null, {release: rowId}); $('#traitUrl').attr('href', url); + + + //COVID data: + var covidRows = [ + ['LZTFL1','SARS-CoV-2 Infection, COVID-19 severity','x','x','x','x','x','x','2:101823807..101843715'], + ['CXCR6','SARS-CoV-2 Infection, COVID-19 severity','x','x','x','x','x','x','2:101948255..101953190'], + ['CCR9','SARS-CoV-2 Infection, COVID-19 severity','x','x','x','x','x','x','2:101888276..101907994'], + ['CCR1','SARS-CoV-2 Infection, COVID-19 severity','x','x','x','x','x','x','2:102205536..102212086'], + ['CCR3','SARS-CoV-2 Infection, COVID-19 severity','x','x','x','x','x','x','2:102268893..102269960'], + ['RPL24','SARS-CoV-2 Infection','','','','','','x','2:174444785..174450351'], + ['NXPE3','SARS-CoV-2 Infection','','','','','','x','2:174323787..174365577'], + ['ZBTB1','SARS-CoV-2 Infection','','','','','','x','7:126570101..126598047'], + ['CEP97','SARS-CoV-2 Infection','','','','','','x','2:174379912..174413230'], + ['FOXP4','COVID-19 severity','','','','','','x','4:127783384..127837788'], + ['CCHCR1','COVID-19 severity','','x','','x','','','4:138774693..138790019'], + ['ABO','SARS-CoV-2 Infection','x','x','x','','x','x','15:7086376..7107347'], + ['OAS1','COVID-19 severity','x','','','x','','x','11:112632314..112654759'], + ['OAS2','COVID-19 severity','x','','','x','','x','11:112695363..112728626'], + ['OAS3','COVID-19 severity','x','','','x','','x','11:112661047..112689871'], + ['KANSL1','COVID-19 severity','','','','','','x','16:57818339..58014773'], + ['WNT3','COVID-19 severity','','','','','','x','16:57171387..57225633'], + ['TAC4','COVID-19 severity','','','','','','x','X:89,480,106..89,483,948'], + ['KAT7','COVID-19 severity','','','','','','x','16:46957860..47008121'], + ['DPP9','COVID-19 severity','x','x','','x','','x','19:4604356..4656762'], + ['TYK2','COVID-19 severity','','','','x','','x','19:10110204..10144759'], + ['ICAM5','COVID-19 severity','','','','x','','x','19:10044223..10051556'], + ['ICAM3','COVID-19 severity','','','','x','','x','19:10088945..10110262'], + ['ICAM4','COVID-19 severity','','','','x','','x','19:10041723..10043298'], + ['ICAM1','COVID-19 severity','','','','x','','x','19:10024950..10040084'], + ['PLEKHA4','SARS-CoV-2 Infection','','','','','','x','19:48819628..48850822'], + ['PPP1R15A','SARS-CoV-2 Infection','','','','','','x','19:48854619..48858778'], + ['TULP2','SARS-CoV-2 Infection','','','','','','x','19:48864508..48880575'], + ['NUCB1','SARS-CoV-2 Infection','','','','','','x','19:48881525..48906138'], + ['IFNAR2','COVID-19 severity','x','x','','x','','x','3:13289046..13325302'], + ['IL10RB','COVID-19 severity','x','x','','x','','x','3:13,254,913..13,288,351'], + ['TMPRSS2','COVID-19 severity','x','x','','x','','x','3:5139757..5184755'], + ['ACE2','SARS-CoV-2 Infection','','','','','','','X:15247646..15300547'] + ]; + + covidRows = covidRows.map(function(r){ + var publications = [] + if (r[2]) { + publications.push('<a href="https://www.nature.com/articles/s41588-022-01042-x">Roberts et al.</a>') + } + if (r[3]) { + publications.push('<a href="https://pubmed.ncbi.nlm.nih.gov/35241825/">Horowitz et al.</a>') + } + if (r[4]) { + publications.push('<a href="https://doi.org/10.1038%2Fs41588-021-00854-7">Shelton et al.</a>') + } + if (r[5]) { + publications.push('<a href="https://doi.org/10.1038%2Fs41586-020-03065-y">Pairo-Castineira et al.</a>') + } + if (r[6]) { + publications.push('<a href="https://doi.org/10.1056%2FNEJMoa2020283">Ellinghaus et al.</a>') + } + if (r[7]) { + publications.push('<a href="https://doi.org/10.1038/s41586-021-03767-x">COVID-19 HGI</a>') + } + + var url = LABKEY.ActionURL.buildURL('mgap', 'genomebrowser', null, {location: r[8]}) + return ['<a href="' + url + '">' + r[0] + '</a>', r[1], publications.join('<br>')] + }) + + var table = $('#covidPublicationsTable').DataTable({ + data: covidRows, + pageLength: 500, + + dom: '', + buttons: [], + order: [], + columns: [ + {title: 'Candidate Gene'}, + {title: 'Phenotype', sortable: false, width: 250}, + {title: 'Publications', sortable: false} + ] + }); }); })(jQuery); </script> @@ -110,4 +187,15 @@ <h4 style="text-decoration: underline">Published Macaque Models:</h4> <span><b>Table I. Published macaque disease models with and without reported genetic associations.</b></span> <table id="phenotypeTable" class="stripe hover"></table> </div> +</div> +<hr> +<h4 style="text-decoration: underline">COVID Genetic Associations:</h4> +<div class="colDiv"> + <div style="flex: 1;max-width: 40%;margin-right: 20px;"> + The development of COVID-19 vaccines and therapies required extensive testing of their safety and efficacy in nonhuman primates (NHPs) before these new treatments could be used in humans (<a href="https://www.nature.com/articles/s41684-021-00760-9">reviewed in this article</a>). A growing number of human genes have been implicated in COVID-19 disease severity and hospitalization. The table to the right list many of these genes (summarized in: <a href="https://www.covid19hg.org/">https://www.covid19hg.org/</a>), and provides links to mGAP variants in each gene. + </div> + <div style="width: 600px;"> + <span><b>Table II. Genes associated with COVID-19 severity and links to macaque variants. <a href = "https://www.nature.com/articles/s41588-021-00985-x">Based on Karlsen et al.</a></b></span> + <table id="covidPublicationsTable" class="stripe hover"></table> + </div> </div> \ No newline at end of file From 19d0684b2f0f3aefa57c1e822a6a7b99e598a458 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 14:54:31 -0700 Subject: [PATCH 43/63] Expand text description --- mGAP/resources/views/phenotypes.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mGAP/resources/views/phenotypes.html b/mGAP/resources/views/phenotypes.html index fa3252551..30a480d0e 100644 --- a/mGAP/resources/views/phenotypes.html +++ b/mGAP/resources/views/phenotypes.html @@ -195,7 +195,7 @@ <h4 style="text-decoration: underline">COVID Genetic Associations:</h4> The development of COVID-19 vaccines and therapies required extensive testing of their safety and efficacy in nonhuman primates (NHPs) before these new treatments could be used in humans (<a href="https://www.nature.com/articles/s41684-021-00760-9">reviewed in this article</a>). A growing number of human genes have been implicated in COVID-19 disease severity and hospitalization. The table to the right list many of these genes (summarized in: <a href="https://www.covid19hg.org/">https://www.covid19hg.org/</a>), and provides links to mGAP variants in each gene. </div> <div style="width: 600px;"> - <span><b>Table II. Genes associated with COVID-19 severity and links to macaque variants. <a href = "https://www.nature.com/articles/s41588-021-00985-x">Based on Karlsen et al.</a></b></span> + <span><b>Table II. Genes associated with COVID-19 severity and links to macaque variants. <a href = "https://www.nature.com/articles/s41588-021-00985-x">Based on Karlsen et al.</a> Click the gene name to load the genome browser, showing macaque variants in that gene.</b></span> <table id="covidPublicationsTable" class="stripe hover"></table> </div> </div> \ No newline at end of file From dc12263a7a0d28ae905039dc4cf3e6ba6d58fa02 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Fri, 29 Apr 2022 15:05:38 -0700 Subject: [PATCH 44/63] Improve formatting of text --- mGAP/resources/views/phenotypes.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mGAP/resources/views/phenotypes.html b/mGAP/resources/views/phenotypes.html index 30a480d0e..8a03b9ac1 100644 --- a/mGAP/resources/views/phenotypes.html +++ b/mGAP/resources/views/phenotypes.html @@ -195,7 +195,7 @@ <h4 style="text-decoration: underline">COVID Genetic Associations:</h4> The development of COVID-19 vaccines and therapies required extensive testing of their safety and efficacy in nonhuman primates (NHPs) before these new treatments could be used in humans (<a href="https://www.nature.com/articles/s41684-021-00760-9">reviewed in this article</a>). A growing number of human genes have been implicated in COVID-19 disease severity and hospitalization. The table to the right list many of these genes (summarized in: <a href="https://www.covid19hg.org/">https://www.covid19hg.org/</a>), and provides links to mGAP variants in each gene. </div> <div style="width: 600px;"> - <span><b>Table II. Genes associated with COVID-19 severity and links to macaque variants. <a href = "https://www.nature.com/articles/s41588-021-00985-x">Based on Karlsen et al.</a> Click the gene name to load the genome browser, showing macaque variants in that gene.</b></span> + <span><b>Table II. Genes associated with COVID-19 severity and links to macaque variants (<a href = "https://www.nature.com/articles/s41588-021-00985-x">Based on Karlsen et al.</a>). Click the gene name to load the genome browser, showing macaque variants in that gene.</b></span> <table id="covidPublicationsTable" class="stripe hover"></table> </div> </div> \ No newline at end of file From 86f1d464700c9ca2a67d762c9de9fa091bf53a03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 May 2022 16:05:32 +0000 Subject: [PATCH 45/63] Bump minimist from 1.2.5 to 1.2.6 in /mcc Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> --- mcc/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mcc/package-lock.json b/mcc/package-lock.json index e83642320..2b72459de 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -9981,9 +9981,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -21773,9 +21773,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", From ee1944147558f193f26afab6f2b36aa2a3627ed7 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Sun, 1 May 2022 20:45:33 -0700 Subject: [PATCH 46/63] Changes from npm audit --- mcc/package-lock.json | 2313 ++++++++++++++++++++++++----------------- 1 file changed, 1367 insertions(+), 946 deletions(-) diff --git a/mcc/package-lock.json b/mcc/package-lock.json index 567994462..4c1dd055b 100644 --- a/mcc/package-lock.json +++ b/mcc/package-lock.json @@ -2102,6 +2102,12 @@ "react": ">=16.x" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "node_modules/@icons/material": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", @@ -2789,9 +2795,9 @@ "license": "Apache-2.0" }, "node_modules/@labkey/build": { - "version": "5.0.0", - "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/build/-/@labkey/build-5.0.0.tgz", - "integrity": "sha1-b1nqEvp+G6My9Q0zBWzx4/dLAJc=", + "version": "5.0.1", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/build/-/@labkey/build-5.0.1.tgz", + "integrity": "sha1-6eEqx45lpOjriEge9CRZXSSH1Fs=", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2811,11 +2817,11 @@ "fork-ts-checker-webpack-plugin": "6.2.10", "html-webpack-plugin": "5.3.1", "mini-css-extract-plugin": "1.6.0", - "node-sass": "6.0.1", + "node-sass": "7.0.1", "react-hot-loader": "4.12.21", "resolve-url-loader": "3.1.2", "rimraf": "3.0.2", - "sass-loader": "11.1.1", + "sass-loader": "12.6.0", "style-loader": "2.0.0", "typescript": "4.3.2", "webpack": "5.65.0", @@ -3323,6 +3329,56 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", @@ -4026,6 +4082,20 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -4103,15 +4173,6 @@ "ajv": "^6.9.1" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4173,43 +4234,22 @@ } }, "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/argparse": { @@ -4289,9 +4329,9 @@ } }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" @@ -4884,6 +4924,47 @@ "node": ">= 0.8" } }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5121,58 +5202,35 @@ } }, "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/clone-deep": { @@ -5207,15 +5265,6 @@ "node": ">= 0.12.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -5235,6 +5284,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", @@ -5729,9 +5787,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6120,9 +6178,9 @@ } }, "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/emojis-list": { @@ -6142,6 +6200,29 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", @@ -6334,6 +6415,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7191,19 +7278,44 @@ } }, "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dev": true, "dependencies": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/gaze": { @@ -7379,9 +7491,9 @@ } }, "node_modules/globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", "dev": true, "dependencies": { "glob": "~7.1.1", @@ -7447,18 +7559,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -7693,6 +7793,12 @@ "entities": "^2.0.0" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7814,6 +7920,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", @@ -7921,6 +8036,12 @@ "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8098,15 +8219,12 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-generator-fn": { @@ -8135,6 +8253,12 @@ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -8620,15 +8744,6 @@ } } }, - "node_modules/jest-cli/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8660,17 +8775,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -8689,12 +8793,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8704,41 +8802,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8751,32 +8814,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-cli/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -8795,15 +8832,6 @@ "node": ">=10" } }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-config": { "version": "27.4.7", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", @@ -10558,9 +10586,9 @@ } }, "node_modules/klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true, "engines": { "node": ">= 8" @@ -10740,6 +10768,33 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -10830,15 +10885,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -11032,9 +11078,9 @@ } }, "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -11043,6 +11089,71 @@ "node": ">=8" } }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -11126,9 +11237,9 @@ "dev": true }, "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "dev": true }, "node_modules/nanoid": { @@ -11218,20 +11329,20 @@ } }, "node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", + "npmlog": "^6.0.0", "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", "which": "^2.0.2" }, "bin": { @@ -11241,10 +11352,66 @@ "node": ">= 10.12.0" } }, + "node_modules/node-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11256,6 +11423,18 @@ "node": ">=10" } }, + "node_modules/node-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11268,14 +11447,14 @@ "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" }, "node_modules/node-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", - "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", "dev": true, "hasInstallScript": true, "dependencies": { "async-foreach": "^0.1.3", - "chalk": "^1.1.1", + "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "gaze": "^1.0.0", "get-stdin": "^4.0.1", @@ -11283,10 +11462,10 @@ "lodash": "^4.17.15", "meow": "^9.0.0", "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^4.0.0", + "node-gyp": "^8.4.1", + "npmlog": "^5.0.0", "request": "^2.88.0", - "sass-graph": "2.2.5", + "sass-graph": "4.0.0", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -11298,37 +11477,73 @@ } }, "node_modules/node-sass/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/node-sass/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-sass/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/node-sass/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/node-sass/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/node-sass/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, "node_modules/nopt": { @@ -11362,9 +11577,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11403,15 +11618,15 @@ } }, "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dev": true, "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "node_modules/nth-check": { @@ -11426,15 +11641,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -12069,13 +12275,41 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { @@ -12161,9 +12395,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -13028,12 +13262,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -13308,31 +13536,34 @@ "dev": true }, "node_modules/sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", "dev": true, "dependencies": { "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" + "lodash": "^4.17.11", + "scss-tokenizer": "^0.3.0", + "yargs": "^17.2.1" }, "bin": { "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" } }, "node_modules/sass-loader": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.1.1.tgz", - "integrity": "sha512-fOCp/zLmj1V1WHDZbUbPgrZhA7HKXHEqkslzB+05U5K9SbSbcmH91C7QLW31AsXikxUMaxXRhhcqWZAxUMLDyA==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -13340,8 +13571,9 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "sass": "^1.3.0", + "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { @@ -13353,6 +13585,9 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true } } }, @@ -13396,25 +13631,22 @@ } }, "node_modules/scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", "dev": true, "dependencies": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "js-base64": "^2.4.3", + "source-map": "^0.7.1" } }, "node_modules/scss-tokenizer/node_modules/source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, "node_modules/select-hose": { @@ -13635,9 +13867,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sisteransi": { @@ -13655,6 +13887,16 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13666,6 +13908,34 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -13796,9 +14066,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -13820,6 +14090,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -13955,17 +14237,38 @@ } }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/string.prototype.trim": { @@ -14529,15 +14832,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -14705,6 +14999,24 @@ "node": ">=4" } }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -15434,19 +15746,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "dependencies": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wildcard": { @@ -15465,61 +15771,74 @@ } }, "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/wrappy": { @@ -15574,10 +15893,13 @@ "dev": true }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -15594,121 +15916,39 @@ } }, "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, "engines": { - "node": ">=6" + "node": ">=12" } } }, @@ -17220,6 +17460,12 @@ "prop-types": "^15.7.2" } }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@icons/material": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", @@ -17740,9 +17986,9 @@ "integrity": "sha1-+n1L8fL1dpJRP0sc0qyjxN2F6GA=" }, "@labkey/build": { - "version": "5.0.0", - "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/build/-/@labkey/build-5.0.0.tgz", - "integrity": "sha1-b1nqEvp+G6My9Q0zBWzx4/dLAJc=", + "version": "5.0.1", + "resolved": "https://artifactory.labkey.com:443/artifactory/api/npm/libs-client/@labkey/build/-/@labkey/build-5.0.1.tgz", + "integrity": "sha1-6eEqx45lpOjriEge9CRZXSSH1Fs=", "dev": true, "requires": { "@babel/core": "7.14.3", @@ -17761,11 +18007,11 @@ "fork-ts-checker-webpack-plugin": "6.2.10", "html-webpack-plugin": "5.3.1", "mini-css-extract-plugin": "1.6.0", - "node-sass": "6.0.1", + "node-sass": "7.0.1", "react-hot-loader": "4.12.21", "resolve-url-loader": "3.1.2", "rimraf": "3.0.2", - "sass-loader": "11.1.1", + "sass-loader": "12.6.0", "style-loader": "2.0.0", "typescript": "4.3.2", "webpack": "5.65.0", @@ -18133,12 +18379,51 @@ "fastq": "^1.6.0" } }, - "@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" - }, - "@sinonjs/commons": { + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + }, + "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", @@ -18791,6 +19076,17 @@ "debug": "4" } }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -18849,12 +19145,6 @@ "dev": true, "requires": {} }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -18895,45 +19185,19 @@ } }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "readable-stream": "^3.6.0" } }, "argparse": { @@ -18998,9 +19262,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -19482,6 +19746,40 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -19663,46 +19961,29 @@ "dev": true }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -19729,12 +20010,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -19754,6 +20029,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", @@ -20138,9 +20419,9 @@ "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -20447,9 +20728,9 @@ "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "emojis-list": { @@ -20463,6 +20744,28 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "enhanced-resolve": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", @@ -20614,6 +20917,12 @@ "object-is": "^1.1.2" } }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -21274,19 +21583,37 @@ "dev": true }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dev": true, "requires": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "gaze": { @@ -21414,9 +21741,9 @@ } }, "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", "dev": true, "requires": { "glob": "~7.1.1", @@ -21466,15 +21793,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -21657,6 +21975,12 @@ "entities": "^2.0.0" } }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -21752,6 +22076,15 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, "hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", @@ -21820,6 +22153,12 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -21943,13 +22282,10 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-generator-fn": { "version": "2.1.0", @@ -21971,6 +22307,12 @@ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -22319,12 +22661,6 @@ "yargs": "^16.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -22344,17 +22680,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -22370,44 +22695,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22417,23 +22710,6 @@ "has-flag": "^4.0.0" } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -22448,12 +22724,6 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -23805,9 +24075,9 @@ "dev": true }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true }, "leven": { @@ -23955,6 +24225,30 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -24020,12 +24314,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -24171,28 +24459,76 @@ } }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" } }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^3.0.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -24247,9 +24583,9 @@ "dev": true }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "dev": true }, "nanoid": { @@ -24319,31 +24655,84 @@ "dev": true }, "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", + "npmlog": "^6.0.0", "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", "which": "^2.0.2" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } } } }, @@ -24359,13 +24748,13 @@ "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" }, "node-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz", - "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", "dev": true, "requires": { "async-foreach": "^0.1.3", - "chalk": "^1.1.1", + "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "gaze": "^1.0.0", "get-stdin": "^4.0.1", @@ -24373,38 +24762,62 @@ "lodash": "^4.17.15", "meow": "^9.0.0", "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^4.0.0", + "node-gyp": "^8.4.1", + "npmlog": "^5.0.0", "request": "^2.88.0", - "sass-graph": "2.2.5", + "sass-graph": "4.0.0", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, "dependencies": { "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -24430,9 +24843,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24461,15 +24874,15 @@ } }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "nth-check": { @@ -24481,12 +24894,6 @@ "boolbase": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -24951,6 +25358,30 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -25032,9 +25463,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "query-string": { @@ -25709,12 +26140,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -25928,21 +26353,21 @@ "dev": true }, "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", "dev": true, "requires": { "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" + "lodash": "^4.17.11", + "scss-tokenizer": "^0.3.0", + "yargs": "^17.2.1" } }, "sass-loader": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.1.1.tgz", - "integrity": "sha512-fOCp/zLmj1V1WHDZbUbPgrZhA7HKXHEqkslzB+05U5K9SbSbcmH91C7QLW31AsXikxUMaxXRhhcqWZAxUMLDyA==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dev": true, "requires": { "klona": "^2.0.4", @@ -25979,23 +26404,20 @@ } }, "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", "dev": true, "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "js-base64": "^2.4.3", + "source-map": "^0.7.1" }, "dependencies": { "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -26196,9 +26618,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sisteransi": { @@ -26213,6 +26635,12 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -26224,6 +26652,27 @@ "websocket-driver": "^0.7.4" } }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -26344,9 +26793,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -26360,6 +26809,15 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, "stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -26468,14 +26926,31 @@ } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "string.prototype.trim": { @@ -26861,12 +27336,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true } } }, @@ -26994,6 +27463,24 @@ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -27533,19 +28020,13 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wildcard": { @@ -27561,46 +28042,53 @@ "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -27643,9 +28131,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { @@ -27660,100 +28148,33 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } } From b7e464b8f9b386c01edd309367bcbab747ccea53 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 3 May 2022 15:21:09 -0700 Subject: [PATCH 47/63] Limit U24_status field to include living animals --- mcc/resources/queries/mcc/aggregatedDemographics.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index 5bc571a12..fd1f8277e 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -15,7 +15,7 @@ SELECT d.objectid, d.calculated_status, CASE - WHEN (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true + WHEN d.calculated_status == 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, d.container @@ -41,7 +41,7 @@ SELECT d.objectid, d.calculated_status, CASE - WHEN (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true + WHEN d.calculated_status == 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, d.container From 3b1c2160916316405482b95be7c574287589dae1 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 4 May 2022 08:54:25 -0700 Subject: [PATCH 48/63] Error handling for folder deletes --- .../pipeline/ClusterMaintenanceTask.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java b/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java index a0e5331c4..b35cc6211 100644 --- a/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java +++ b/primeseq/src/org/labkey/primeseq/pipeline/ClusterMaintenanceTask.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,12 +19,14 @@ import org.labkey.api.data.TableSelector; import org.labkey.api.pipeline.PipeRoot; import org.labkey.api.pipeline.PipelineJob; +import org.labkey.api.pipeline.PipelineJobException; import org.labkey.api.pipeline.PipelineJobService; import org.labkey.api.pipeline.PipelineService; import org.labkey.api.pipeline.PipelineValidationException; import org.labkey.api.pipeline.RemoteExecutionEngine; import org.labkey.api.query.FieldKey; import org.labkey.api.security.UserManager; +import org.labkey.api.sequenceanalysis.run.SimpleScriptWrapper; import org.labkey.api.util.FileUtil; import org.labkey.api.util.Job; import org.labkey.api.util.JobRunner; @@ -37,6 +40,7 @@ import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; @@ -160,11 +164,18 @@ private void deleteDirectory(File child, Logger log) { try { - FileUtils.deleteDirectory(child); + if (SystemUtils.IS_OS_WINDOWS) + { + FileUtils.deleteDirectory(child); + } + else + { + new SimpleScriptWrapper(log).execute(Arrays.asList("rm", "-Rf", child.getPath())); + } } - catch (IOException e) + catch (IOException | PipelineJobException e) { - log.error(e); + log.error("Unable to delete folder: " + child.getPath(), e); } } From 236f2baa02ef34e4efab3d7c1bfb59d3c71fb7bc Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 4 May 2022 08:54:58 -0700 Subject: [PATCH 49/63] Minor improvements to MCC review form --- .../components/InternalReviewForm.tsx | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx index 66a2df7a9..305f23d70 100644 --- a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx @@ -1,9 +1,11 @@ import React, { FormEvent, useState } from 'react'; import { Filter, Query } from '@labkey/api'; -import { Box, Button, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; +import { Box, Button, Dialog, DialogTitle, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; export default function InternalReviewForm(props: {requestId: string, readOnly?: boolean}) { const [ recordData, setRecordData ] = useState(null) + const [ showReturnToInvestigator, setShowReturnToInvestigator ] = useState(false) + const [ showSendToRab, setShowSendToRab ] = useState(false) Query.selectRows({ schemaName: "mcc", @@ -23,6 +25,7 @@ export default function InternalReviewForm(props: {requestId: string, readOnly?: setRecordData(resp.rows[0] ? {...resp.rows[0]} : {}) }, failure: function(response) { + console.error(response) alert(response.exception) } }) @@ -36,12 +39,9 @@ export default function InternalReviewForm(props: {requestId: string, readOnly?: } const handleChange = (e) => { - recordData[e.target.name] = e.target.value ? e.target.value.trim() : null - setRecordData({...recordData}) + setRecordData({...recordData, [e.target.value]: e.target.value ? e.target.value.trim() : null}) - console.log(e.target.name) - console.log(e.target.value.trim()) - console.log(recordData) + console.log(recordData[e.target.name]) }; const onFormSubmit = (e: FormEvent) => { @@ -60,20 +60,29 @@ export default function InternalReviewForm(props: {requestId: string, readOnly?: <Table width={500}> <TableBody> <TableRow> - <TableCell><TextField key={"preliminaryScore"} label={"Preliminary Score"} onChange={handleChange} variant={'outlined'} value={recordData.preliminaryScore || ''} disabled={true} fullWidth={true}/></TableCell> + <TableCell><TextField key={"preliminaryScore"} name={"preliminaryScore"} label={"Preliminary Score"} onChange={handleChange} variant={'outlined'} value={recordData.preliminaryScore || ''} disabled={true} fullWidth={true}/></TableCell> </TableRow> <TableRow> - <TableCell><TextField key={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"resourceAvailabilityScore"} name={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> </TableRow> <TableRow> - <TableCell><TextField key={"proposalScore"} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"proposalScore"} name={"proposalScore"} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> </TableRow> <TableRow> - <TableCell><TextField key={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"comments"} name={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> </TableRow> </TableBody> </Table> <Button key={"saveReviewBtn"} variant={"contained"} style={{marginRight: 10}} type={'submit'}>Save Review</Button> + <Button key={"returnToPiBtn"} variant={"contained"} style={{marginRight: 10}} type={'button'} onClick={(e) => setShowReturnToInvestigator(true)}>Return to Investigator</Button> + <Button key={"rabAssignBtn"} variant={"contained"} style={{marginRight: 10}} type={'button'} onClick={(e) => setShowSendToRab(true)}>Assign to RAB Reviewers</Button> + <Dialog open={showReturnToInvestigator}> + <DialogTitle>Return To Investigator</DialogTitle> + + </Dialog> + <Dialog open={showSendToRab}> + <DialogTitle>Assign for RAB Review</DialogTitle> + </Dialog> </form> </Box> </> From be0e74d19a489e405ecce33b9fc718c719609a48 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 4 May 2022 09:48:13 -0700 Subject: [PATCH 50/63] Add columns to mGAP/MCC user request views --- .../queries/mGAP/userRequests/.qview.xml | 1 + .../mgap/query/UserRequestCustomizer.java | 1 - .../queries/mcc/userRequests/.qview.xml | 17 +++++++++++++++++ .../labkey/mcc/query/UserRequestCustomizer.java | 1 - 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 mcc/resources/queries/mcc/userRequests/.qview.xml diff --git a/mGAP/resources/queries/mGAP/userRequests/.qview.xml b/mGAP/resources/queries/mGAP/userRequests/.qview.xml index da6852317..5fff46319 100644 --- a/mGAP/resources/queries/mGAP/userRequests/.qview.xml +++ b/mGAP/resources/queries/mGAP/userRequests/.qview.xml @@ -9,6 +9,7 @@ <column name="userId"/> <column name="hasAccess"/> <column name="created"/> + <column name="userId/Active"/> </columns> <sorts> <sort column="created" descending="true"/> diff --git a/mGAP/src/org/labkey/mgap/query/UserRequestCustomizer.java b/mGAP/src/org/labkey/mgap/query/UserRequestCustomizer.java index 0db598bf7..8e951ac6e 100644 --- a/mGAP/src/org/labkey/mgap/query/UserRequestCustomizer.java +++ b/mGAP/src/org/labkey/mgap/query/UserRequestCustomizer.java @@ -37,7 +37,6 @@ public void addUserCol(AbstractTableInfo ti) ")) THEN " + ti.getSqlDialect().getBooleanTRUE() + " ELSE " + ti.getSqlDialect().getBooleanFALSE() + " END)"), JdbcType.BOOLEAN, ti.getColumn("userId")); col.setLabel("Has mGAP Access?"); col.setReadOnly(true); - col.setIsUnselectable(true); col.setUserEditable(false); ti.addColumn(col); } diff --git a/mcc/resources/queries/mcc/userRequests/.qview.xml b/mcc/resources/queries/mcc/userRequests/.qview.xml new file mode 100644 index 000000000..5fff46319 --- /dev/null +++ b/mcc/resources/queries/mcc/userRequests/.qview.xml @@ -0,0 +1,17 @@ +<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="All Requests"> + <columns> + <column name="email"/> + <column name="firstName"/> + <column name="lastName"/> + <column name="title"/> + <column name="institution"/> + <column name="reason"/> + <column name="userId"/> + <column name="hasAccess"/> + <column name="created"/> + <column name="userId/Active"/> + </columns> + <sorts> + <sort column="created" descending="true"/> + </sorts> +</customView> \ No newline at end of file diff --git a/mcc/src/org/labkey/mcc/query/UserRequestCustomizer.java b/mcc/src/org/labkey/mcc/query/UserRequestCustomizer.java index 187288b28..dadcf886c 100644 --- a/mcc/src/org/labkey/mcc/query/UserRequestCustomizer.java +++ b/mcc/src/org/labkey/mcc/query/UserRequestCustomizer.java @@ -38,7 +38,6 @@ public void addUserCol(AbstractTableInfo ti) ")) THEN " + ti.getSqlDialect().getBooleanTRUE() + " ELSE " + ti.getSqlDialect().getBooleanFALSE() + " END)"), JdbcType.BOOLEAN, ti.getColumn("userId")); col.setLabel("Has MCC Access?"); col.setReadOnly(true); - col.setIsUnselectable(true); col.setUserEditable(false); ti.addColumn(col); } From 269ab2995a639fa96e6bac67f28b5203280d0c21 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Sat, 7 May 2022 11:36:55 -0700 Subject: [PATCH 51/63] Misc improvements to MCC request forms (#65) * Misc improvements to MCC request forms --- .../queries/mcc/aggregatedDemographics.sql | 2 +- mcc/resources/queries/mcc/animalRequests.js | 32 ++- .../queries/mcc/requestReviews/.qview.xml | 7 +- .../requestReviews/Pending Reviews.qview.xml | 2 +- mcc/resources/schemas/mcc.xml | 1 - mcc/resources/web/mcc/img/mccRequest.png | Bin 77058 -> 274078 bytes .../components/FinalReviewForm.tsx | 191 +++++++++++++++ .../components/InternalReviewForm.tsx | 226 ++++++++++++------ .../components/RabReviewForm.tsx | 143 ++++++----- .../components/ReadOnlyRequest.tsx | 53 ++-- .../client/RequestReview/request-review.tsx | 18 +- mcc/src/org/labkey/mcc/MccManager.java | 8 + mcc/src/org/labkey/mcc/MccUserSchema.java | 8 +- ...uestReviewActionsDisplayColumnFactory.java | 2 +- ...questScoreActionsDisplayColumnFactory.java | 14 +- .../org/labkey/mcc/query/TriggerHelper.java | 11 + .../org/labkey/test/tests/mcc/MccTest.java | 94 ++++++++ 17 files changed, 645 insertions(+), 167 deletions(-) create mode 100644 mcc/src/client/RequestReview/components/FinalReviewForm.tsx diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index fd1f8277e..5cb1511c4 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -15,7 +15,7 @@ SELECT d.objectid, d.calculated_status, CASE - WHEN d.calculated_status == 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true + WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, d.container diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index caa25b626..179ba201b 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -12,6 +12,15 @@ function beforeUpdate(row, oldRow, errors){ } function beforeUpsert(row, oldRow, errors) { + if (!row.objectid && row.rowid) { + row.objectid = triggerHelper.resolveObjectId(row.rowid) + } + + if (!row.objectid) { + errors._form = 'Unable to resolve record with rowid: ' + row.rowid + return + } + if (!row.status) { console.error('Request row being submitted without a status: ' + row.objectid) console.error(row) @@ -21,7 +30,7 @@ function beforeUpsert(row, oldRow, errors) { row.status = row.status || 'Draft' if (!triggerHelper.hasPermission(row.status)) { - errors._form = 'Insufficient permissions to update this request'; + errors._form = 'Insufficient permissions to update request with status: ' + row.status; return; } } @@ -37,7 +46,7 @@ function afterUpdate(row, oldRow, errors){ function afterUpsert(row, oldRow, errors) { if (row.status && row.status !== 'Draft') { try { - triggerHelper.ensureReviewRecordsCreated(row.objectId, row.status, oldRow ? oldRow.status : null, calculatePreliminaryScore(row)); + triggerHelper.ensureReviewRecordsCreated(row.objectId, row.status, oldRow ? oldRow.status : null, calculatePreliminaryScore(row, oldRow)); } catch(e) { console.error('Error in animalRequest.afterUpsert') @@ -73,7 +82,24 @@ function beforeDelete(row, errors){ } } -function calculatePreliminaryScore(row) { +function calculatePreliminaryScore(row, oldRow) { + var fields = ['institutiontype', 'earlystageinvestigator', 'fundingsource', 'existingnhpfacilities', 'existingmarmosetcolony', 'isbreedinganimals']; + if (oldRow) { + fields.forEach(function(fieldName){ + if (row[fieldName] === undefined) { + row[fieldName] = oldRow[fieldName] + } + }, this); + } + + fields.forEach(function(fieldName){ + if (row[fieldName] === undefined || row[fieldName] === null || row[fieldName] === '') { + console.error('Missing field ' + fieldName + ' in calculatePreliminaryScore: [' + row[fieldName] + ']') + console.error(row) + console.error(oldRow) + } + }, this); + // NOTE: the initial score is two, such that the final range is 0-10 var score = 2; diff --git a/mcc/resources/queries/mcc/requestReviews/.qview.xml b/mcc/resources/queries/mcc/requestReviews/.qview.xml index e873756c1..07a248d0d 100644 --- a/mcc/resources/queries/mcc/requestReviews/.qview.xml +++ b/mcc/resources/queries/mcc/requestReviews/.qview.xml @@ -3,7 +3,12 @@ <column name="requestId/rowid"/> <column name="requestId/lastname"/> <column name="requestId/firstname"/> - <column name="requestId/status"/> + <column name="requestId/status"> + <properties> + <property name="columnTitle" value="Request Status"/> + </properties> + </column> + <column name="review"/> <column name="actions"/> </columns> <sorts> diff --git a/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml b/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml index 66ea1c787..011014440 100644 --- a/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml +++ b/mcc/resources/queries/mcc/requestReviews/Pending Reviews.qview.xml @@ -1,6 +1,6 @@ <customView xmlns="http://labkey.org/data/xml/queryCustomView" label="Pending Reviews" canOverride="false"> <filters> - <filter column="score" operator="isblank"/> + <filter column="review" operator="isblank"/> </filters> <sorts> <sort column="requestId/rowid" descending="true"/> diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 5580432e2..086139ea6 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -641,7 +641,6 @@ </column> <column columnName="actions" wrappedColumnName="rowid"> <columnTitle>Actions</columnTitle> - <displayWidth>200</displayWidth> <displayColumnFactory> <className>org.labkey.mcc.query.RequestReviewActionsDisplayColumnFactory</className> </displayColumnFactory> diff --git a/mcc/resources/web/mcc/img/mccRequest.png b/mcc/resources/web/mcc/img/mccRequest.png index 43ea4c4b075833f81a6d09cb34f0705da33bf891..adc667f002290fb1ee9f0d44a90844f73c3af498 100644 GIT binary patch literal 274078 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≫7 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�qp&fFVw9Rznzw(J%L*s30~_n3drYG;rjD* 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Ǩ`$TSXG9<&D@X& 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 literal 77058 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 diff --git a/mcc/src/client/RequestReview/components/FinalReviewForm.tsx b/mcc/src/client/RequestReview/components/FinalReviewForm.tsx new file mode 100644 index 000000000..76d1a48ae --- /dev/null +++ b/mcc/src/client/RequestReview/components/FinalReviewForm.tsx @@ -0,0 +1,191 @@ +import React, { FormEvent, useEffect, useState } from 'react'; +import { ActionURL, Filter, getServerContext, Query } from '@labkey/api'; +import { + Box, + Button, + makeStyles, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + TextField +} from '@material-ui/core'; +import { AnimalRequestModel } from '../../components/RequestUtils'; +import SavingOverlay from '../../AnimalRequest/saving-overlay'; + +export default function FinalReviewForm(props: {requestData: AnimalRequestModel}) { + const { requestData } = props + const [ recordData, setRecordData ] = useState(null) + const [ reviewData, setReviewData ] = useState(null) + const [ displayOverlay, setDisplayOverlay ] = useState(false) + const [ hasSubmitted, setHasSubmitted ] = useState(false) + const [ pendingStatus, setPendingStatus ] = useState<string>(null) + + const styles = makeStyles({ + tableHead: { + fontWeight: "bold", + padding: 5, + paddingTop: 0 + }, + tableCell: { + border: 1, + borderColor: "black", + borderStyle: "solid", + padding: 5 + } + })() + + useEffect(() => { + Query.selectRows({ + schemaName: "mcc", + queryName: "requestScores", + columns: [ + "rowid", + "preliminaryScore", + "resourceAvailabilityScore", + "proposalScore", + "comments", + "requestid" + ], + filterArray: [ + Filter.create('requestId', requestData.request.objectid) + ], + success: function (resp) { + setRecordData(resp.rows[0] ? {...resp.rows[0]} : {}) + }, + failure: function (response) { + console.error(response) + alert(response.exception) + } + }) + + Query.selectRows({ + schemaName: "mcc", + queryName: "requestReviews", + columns: [ + "rowid", + "reviewerid", + "reviewerid/displayName", + "reviewerid/email", + "review", + "score", + "comments", + "requestid" + ], + filterArray: [ + Filter.create('requestId', requestData.request.objectid) + ], + success: function (resp) { + setReviewData([...resp.rows]) + }, + failure: function (response) { + alert(response.exception) + } + }) + }, [requestData]) + + if (!recordData || !reviewData) { + return(<div>Loading...</div>) + } + + const handleChange = (e) => { + setRecordData({...recordData, [e.target.name]: e.target.value ? e.target.value.trim() : null}) + }; + + const updateRequestStatus = (status: string) => { + setDisplayOverlay(true) + Query.updateRows({ + schemaName: "mcc", + queryName: "animalRequests", + rows: [{ + rowid: requestData.request.rowid, + objectid: requestData.request.objectid, + status: status + }], + success: function (resp) { + requestData.request.status = status + setDisplayOverlay(false) + window.location.href = ActionURL.buildURL("mcc", "mccRequestAdmin") + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } + + const onFormSubmit = (e: React.SyntheticEvent<HTMLFormElement>) => { + setHasSubmitted(true) + e.preventDefault() + if (!e.currentTarget.reportValidity()) { + return + } + + setDisplayOverlay(true) + Query.updateRows({ + schemaName: "mcc", + queryName: "requestScores", + rows: [recordData], + success: function (resp) { + updateRequestStatus(pendingStatus) + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } + + return( + <> + <h2>RAB Reviews</h2> + <Table style={{display: "inline-block", padding: 5}}> + <TableHead> + <TableRow key={"header"}> + <TableCell className={styles.tableHead}>Reviewer</TableCell> + <TableCell className={styles.tableHead}>Review</TableCell> + <TableCell className={styles.tableHead}>Comments</TableCell> + </TableRow> + </TableHead> + <TableBody> + {reviewData.map((row, idx) => { + return( + <TableRow key={"review-" + row.reviewerid} style = { idx % 2 ? { background : "#fdffe0" }:{ background : "white" }}> + <TableCell className={styles.tableCell}>{row['reviewerid/displayName']}</TableCell> + <TableCell className={styles.tableCell}>{row.review}</TableCell> + <TableCell className={styles.tableCell}>{row.comments}</TableCell> + </TableRow> + ) + })} + </TableBody> + </Table> + <h2>Enter MCC Review</h2> + <Box key={"mccReviewBox"} style={{display: 'inline-block'}}> + <form key={"internalReviewForm"} noValidate autoComplete='off' onSubmit={onFormSubmit}> + <Table width={500}> + <TableBody> + <TableRow> + <TableCell><TextField key={"preliminaryScore"} name={"preliminaryScore"} label={"Preliminary Score"} onChange={handleChange} variant={'outlined'} value={recordData.preliminaryScore || ''} disabled={true} fullWidth={true}/></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"resourceAvailabilityScore"} name={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"proposalScore"} name={"proposalScore"} required={true} error={hasSubmitted && !recordData.proposalScore} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> + </TableRow> + <TableRow> + <TableCell><TextField key={"comments"} name={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + </TableRow> + </TableBody> + </Table> + <Button key={"approveBtn"} variant={"contained"} style={{marginRight: 10}} type={'submit'} onClick={() => setPendingStatus("Approved")}>Approve Request</Button> + <Button key={"rejectBtn"} variant={"contained"} style={{marginRight: 10}} type={'submit'} onClick={() => setPendingStatus("Rejected")}>Reject Request</Button> + </form> + </Box> + <SavingOverlay display={displayOverlay} /> + </> + ) +} \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx index 305f23d70..2ac5b486a 100644 --- a/mcc/src/client/RequestReview/components/InternalReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/InternalReviewForm.tsx @@ -1,90 +1,182 @@ -import React, { FormEvent, useState } from 'react'; -import { Filter, Query } from '@labkey/api'; -import { Box, Button, Dialog, DialogTitle, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; +import React, { useEffect, useState } from 'react'; +import { ActionURL, Filter, Query } from '@labkey/api'; +import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from '@material-ui/core'; +import { AnimalRequestModel } from '../../components/RequestUtils'; +import SavingOverlay from '../../AnimalRequest/saving-overlay'; -export default function InternalReviewForm(props: {requestId: string, readOnly?: boolean}) { +export default function InternalReviewForm(props: {requestData: AnimalRequestModel}) { + const { requestData } = props const [ recordData, setRecordData ] = useState(null) + const [ rabMembers, setRabMembers ] = useState(null) + const [ existingAssignments, setExistingAssignments ] = useState(null) + const [ displayOverlay, setDisplayOverlay ] = useState(false) + const [ showReturnToInvestigator, setShowReturnToInvestigator ] = useState(false) const [ showSendToRab, setShowSendToRab ] = useState(false) - Query.selectRows({ - schemaName: "mcc", - queryName: "requestScores", - columns: [ - "rowid", - "preliminaryScore", - "resourceAvailabilityScore", - "proposalScore", - "comments", - "requestid" - ], - filterArray: [ - Filter.create('requestId', props.requestId) - ], - success: function (resp) { - setRecordData(resp.rows[0] ? {...resp.rows[0]} : {}) - }, - failure: function(response) { - console.error(response) - alert(response.exception) - } - }) + useEffect(() => { + Query.selectRows({ + schemaName: "mcc", + queryName: "requestScores", + columns: [ + "rowid", + "preliminaryScore", + "resourceAvailabilityScore", + "proposalScore", + "comments", + "requestid", + "requestid/createdby/email" + + ], + filterArray: [ + Filter.create('requestId', requestData.request.objectid) + ], + success: function (resp) { + setRecordData(resp.rows[0] ? {...resp.rows[0]} : {}) + }, + failure: function (response) { + console.error(response) + alert(response.exception) + } + }) - if (!recordData) { + Query.selectRows({ + schemaName: 'core', + queryName: 'Members', + columns: 'UserId,UserId/DisplayName', + filterArray: [ + Filter.create('GroupId/Name', 'MCC RAB Members') + ], + success: function (resp) { + setRabMembers(resp.rows) + }, + failure: function (response) { + console.error(response) + alert(response.exception) + } + }) + + Query.selectRows({ + schemaName: "mcc", + queryName: "requestReviews", + columns: 'reviewerId', + filterArray: [ + Filter.create('requestId', requestData.request.objectid) + ], + success: function (resp) { + setExistingAssignments(resp.rows?.map(r => r.reviewerId)) + }, + failure: function (response) { + console.error(response) + alert(response.exception) + } + }) + }, [requestData]) + + if (!recordData || !rabMembers || !existingAssignments || !requestData) { return(<div>Loading...</div>) } - if (props.readOnly) { - return(<div>This needs to render a simple read-only table of the fields so RAB reviewers have this information</div>) + const onReturnToInvestigatorSubmit = (e) => { + updateRequestStatus('Draft') + setShowReturnToInvestigator(false) } - const handleChange = (e) => { - setRecordData({...recordData, [e.target.value]: e.target.value ? e.target.value.trim() : null}) - - console.log(recordData[e.target.name]) - }; + const updateRequestStatus = (status: string) => { + setDisplayOverlay(true) + Query.updateRows({ + schemaName: "mcc", + queryName: "animalRequests", + rows: [{ + rowid: requestData.request.rowid, + objectid: requestData.request.objectid, + status: status + }], + success: function (resp) { + requestData.request.status = status + setDisplayOverlay(false) + window.location.href = ActionURL.buildURL("mcc", "mccRequestAdmin") + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } - const onFormSubmit = (e: FormEvent) => { - e.preventDefault() + const onRabReviewSubmit = (e) => { + setDisplayOverlay(true) + const toInsert = rabMembers.filter(r => !existingAssignments.includes(r.UserId)).map(r => { + return { + reviewerId: r.UserId, + requestId: requestData.request.objectid + } + }) - console.log(recordData) + if (!toInsert.length) { + updateRequestStatus('RAB Review') + } + else { + Query.insertRows({ + schemaName: "mcc", + queryName: "requestReviews", + rows: toInsert, + success: function (resp) { + updateRequestStatus('RAB Review') + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } - // TODO: save this record and also update the original request record with new status + setShowSendToRab(false) } + const emailHref = recordData['requestid/createdby/email'] ? ("mailto:" + recordData['requestid/createdby/email'] + "?subject=MCC Request: " + recordData.rowid) : null + return ( <> - <h2>Enter MCC Review</h2> + <h2>MCC Internal Review</h2> + <Typography style={{paddingBottom: 20}}>After reviewing the request above for completeness and accuracy, please either return to the investigator or assign for RAB Review</Typography> <Box key={"mccReviewBox"} style={{display: 'inline-block'}}> - <form key={"internalReviewForm"} noValidate autoComplete='off' onSubmit={onFormSubmit}> - <Table width={500}> - <TableBody> - <TableRow> - <TableCell><TextField key={"preliminaryScore"} name={"preliminaryScore"} label={"Preliminary Score"} onChange={handleChange} variant={'outlined'} value={recordData.preliminaryScore || ''} disabled={true} fullWidth={true}/></TableCell> - </TableRow> - <TableRow> - <TableCell><TextField key={"resourceAvailabilityScore"} name={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> - </TableRow> - <TableRow> - <TableCell><TextField key={"proposalScore"} name={"proposalScore"} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> - </TableRow> - <TableRow> - <TableCell><TextField key={"comments"} name={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> - </TableRow> - </TableBody> - </Table> - <Button key={"saveReviewBtn"} variant={"contained"} style={{marginRight: 10}} type={'submit'}>Save Review</Button> - <Button key={"returnToPiBtn"} variant={"contained"} style={{marginRight: 10}} type={'button'} onClick={(e) => setShowReturnToInvestigator(true)}>Return to Investigator</Button> - <Button key={"rabAssignBtn"} variant={"contained"} style={{marginRight: 10}} type={'button'} onClick={(e) => setShowSendToRab(true)}>Assign to RAB Reviewers</Button> - <Dialog open={showReturnToInvestigator}> - <DialogTitle>Return To Investigator</DialogTitle> - - </Dialog> - <Dialog open={showSendToRab}> - <DialogTitle>Assign for RAB Review</DialogTitle> - </Dialog> - </form> + <Button href={emailHref} variant={"contained"} style={{marginRight: 10}} disabled={!emailHref}>Contact Investigator</Button> + <Button key={"returnToPiBtn"} variant={"contained"} style={{marginRight: 10}} onClick={(e) => setShowReturnToInvestigator(true)}>Return to Investigator</Button> + <Button key={"rabAssignBtn"} variant={"contained"} style={{marginRight: 10}} onClick={(e) => setShowSendToRab(true)}>Assign to RAB Reviewers</Button> </Box> + <Dialog open={showReturnToInvestigator}> + <DialogTitle>Return To Investigator</DialogTitle> + <DialogContent> + Hitting submit will change the status of this request back to draft. Please use the button below to contact the investigator with questions or concerns. + </DialogContent> + <DialogActions> + <Box mr="5px"> + <Button onClick={onReturnToInvestigatorSubmit} disabled={false}>Submit</Button> + <Button onClick={(e) => setShowReturnToInvestigator(false)}>Close</Button> + </Box> + </DialogActions> + </Dialog> + <Dialog open={showSendToRab}> + <DialogTitle>Assign for RAB Review</DialogTitle> + <DialogContent> + This will assign this review to review by the RAB, which includes: + { + rabMembers.map(r => { + return(<Typography key={'rab-' + r.UserId} style={{paddingTop: 20}}>{r['UserId/DisplayName'] + (existingAssignments.includes(r.UserId) ? ' (already assigned)' : '')}</Typography>) + }) + } + </DialogContent> + <DialogActions> + <Box mr="5px"> + <Button onClick={onRabReviewSubmit} disabled={false}>Submit</Button> + <Button onClick={(e) => setShowSendToRab(false)}>Close</Button> + </Box> + </DialogActions> + </Dialog> + <SavingOverlay display={displayOverlay} /> </> ) } \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx index a836f8318..4feaaf621 100644 --- a/mcc/src/client/RequestReview/components/RabReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -1,8 +1,9 @@ -import { Filter, getServerContext, Query } from '@labkey/api'; -import React, { FormEvent, useState } from 'react'; +import { ActionURL, Filter, getServerContext, Query } from '@labkey/api'; +import React, { useEffect, useState } from 'react'; import { Box, Button, + makeStyles, MenuItem, Select, Table, @@ -12,61 +13,48 @@ import { TableRow, TextField } from '@material-ui/core'; +import SavingOverlay from '../../AnimalRequest/saving-overlay'; -export default function RabReviewForm(props: {requestId: string, readOnly?: boolean}) { +export default function RabReviewForm(props: {requestId: string}) { const [ recordData, setRecordData ] = useState(null) + const [displayOverlay, setDisplayOverlay] = useState(false) + const [hasSubmitted, setHasSubmitted] = useState(false) - const filters = [ - Filter.create('requestId', props.requestId) - ] + useEffect(() => { + Query.selectRows({ + schemaName: "mcc", + queryName: "requestReviews", + columns: [ + "rowid", + "reviewerid", + "reviewerid/displayName", + "reviewerid/email", + "review", + "score", + "comments", + "requestid" + ], + filterArray: [ + Filter.create('requestId', props.requestId), + Filter.create('reviewerid', getServerContext().user.userId) + ], + success: function (resp) { + if (resp.rows.length > 1) { + console.error("More than one MCC review record returned for the user: " + getServerContext().user.userId + ". this should never happen") + } - // NOTE: consider re-naming this param. When readOnly=false, this form is used for the current user to enter their review. - // When readOnly=true, this is used to summarize the reviews from all reviewers. - if (!props.readOnly) { - filters.push(Filter.create('reviewerid', getServerContext().user.userId)) - } - - Query.selectRows({ - schemaName: "mcc", - queryName: "requestReviews", - columns: [ - "rowid", - "reviewerid", - "reviewerid/displayName", - "reviewerid/email", - "review", - "score", - "comments", - "requestid" - ], - filterArray: filters, - success: function (resp) { - setRecordData({...resp.rows}) - }, - failure: function(response) { - alert(response.exception) - } - }) + setRecordData([...resp.rows]) + }, + failure: function (response) { + alert(response.exception) + } + }) + }, [props.requestId]) if (!recordData) { return(<div>Loading...</div>) } - if (props.readOnly) { - return( - <Table> - <TableHead> - <TableRow key={"header"}><TableCell>Reviewer</TableCell><TableCell>Score</TableCell><TableCell>Comments</TableCell></TableRow> - </TableHead> - <TableBody> - {recordData.map(row => { - return(<TableRow key={"review-" + row.reviewerid}><TableCell>{row.reviewerid}</TableCell><TableCell>{row.score}</TableCell><TableCell>{row.comments}</TableCell></TableRow>) - })} - </TableBody> - </Table> - ) - } - if (!recordData?.length) { return(<div style={{paddingTop: 20}}>You have not been assigned to review this request</div>) } @@ -74,23 +62,60 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool const handleChange = (e) => { recordData[0][e.target.name] = e.target.value ? e.target.value.trim() : null setRecordData([...recordData]) - - console.log(e.target.name) - console.log(e.target.value.trim()) - console.log(recordData) }; - const onFormSubmit = (e: FormEvent) => { + const onFormSubmit = (e: React.SyntheticEvent<HTMLFormElement>) => { + setHasSubmitted(true) e.preventDefault() + if (!e.currentTarget.reportValidity()) { + return + } - console.log(recordData) + setDisplayOverlay(true) + const row = recordData[0] + if (row.rowid) { + Query.updateRows({ + schemaName: "mcc", + queryName: "requestReviews", + rows: [{ + rowid: row.rowid, + review: row.review, + comments: row.comments + }], + success: function (resp) { + window.location.href = ActionURL.buildURL('mcc', 'rabRequestReview') + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } + else { + Query.insertRows({ + schemaName: "mcc", + queryName: "requestReviews", + rows: [{ + review: row.review, + comments: row.comments + }], + success: function (resp) { + window.location.href = ActionURL.buildURL('mcc', 'rabRequestReview') + }, + failure: function (response) { + setDisplayOverlay(false) + console.error(response) + alert(response.exception) + } + }) + } - // TODO: save this record and navigateBack to the prior page } return ( <> - <h2>Enter Review</h2> + <h2>Enter RAB Review</h2> <form noValidate autoComplete='off' onSubmit={onFormSubmit}> <Box style={{display: 'inline-block'}}> After reviewing the request, please fill out the section below and provide a 2-3 sentence justification for your choice. @@ -98,7 +123,8 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool <TableBody> <TableRow> <TableCell> - <Select id={"review"} aria-label="Review" onChange={handleChange} required={true} defaultValue={recordData[0].review} fullWidth={true} displayEmpty={true}> + <Select id={"review"} variant={"outlined"} name={"review"} aria-label="Review" label={"Review"} error={hasSubmitted && !recordData[0].review} onChange={handleChange} required={true} value={recordData[0].review ?? ''} fullWidth={true} displayEmpty={true} placeholder={"Enter review..."}> + <MenuItem value={""}>Not Decided</MenuItem> <MenuItem value={"I recommend this proposal"}>I recommend this proposal</MenuItem> <MenuItem value={"I recommend this proposal with conditions"}>I recommend this proposal with conditions</MenuItem> <MenuItem value={"I do not recommend this proposal"}>I do not recommend this proposal</MenuItem> @@ -106,7 +132,7 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool </TableCell> </TableRow> <TableRow> - <TableCell><TextField key={"comments"} label={"Justification"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData[0].comments || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"comments"} name={"comments"} label={"Justification"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData[0].comments || ''} fullWidth={true} /></TableCell> </TableRow> </TableBody> </Table> @@ -114,6 +140,7 @@ export default function RabReviewForm(props: {requestId: string, readOnly?: bool <Button variant={"contained"} style={{marginRight: 10}} type={'submit'}>Submit Review</Button> </Box> </form> + <SavingOverlay display={displayOverlay} /> </> ) } \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx index 16fd01045..e5d9e3a19 100644 --- a/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx +++ b/mcc/src/client/RequestReview/components/ReadOnlyRequest.tsx @@ -7,7 +7,18 @@ import { institutionTypeOptions, researchAreaOptions } from '../../AnimalRequest/components/values'; -import { Box, Button, Grid, makeStyles, Table, TableBody, TableCell, TableHead, TableRow } from '@material-ui/core'; +import { + Box, + Button, + Grid, + makeStyles, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography +} from '@material-ui/core'; import { ActionURL } from '@labkey/api'; function formatPIName(request: AnimalRequestProps) { @@ -46,7 +57,15 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} fontWeight: "bold" }, tableHead: { - fontWeight: "bold" + fontWeight: "bold", + padding: 5, + paddingTop: 0 + }, + tableCell: { + border: 1, + borderColor: "black", + borderStyle: "solid", + padding: 5 } })() @@ -101,16 +120,16 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} <div>Co-Investigators: </div> </Grid> <Grid item xs={10}> - {requestData.coinvestigators.length ? requestData.coinvestigators.map(coi => { + {requestData.coinvestigators.length ? requestData.coinvestigators.map((coi, idx) => { return([ - formatName(coi.lastname, coi.firstname, coi.middleinitial) + ': ' +coi.institutionname + <Typography key={'coi-' + idx}>{formatName(coi.lastname, coi.firstname, coi.middleinitial) + ': ' +coi.institutionname}</Typography> ]) - }).join('<br>') : 'N/A'} + }) : 'N/A'} </Grid> </Grid> <p /> - <h4 style={{marginTop: 10}}>Institutional Animal Facilities and Capabilities</h4> + <h4 style={{marginTop: 20}}>Institutional Animal Facilities and Capabilities</h4> <Grid container spacing={1} style={{marginLeft: 10}}> <Grid item xs={2} className={styles.fieldLabel}> Has Existing NHP Facilities: @@ -139,25 +158,25 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} </Grid> <p /> - <h4 style={{marginTop: 10}}>Research Details</h4> + <h4 style={{marginTop: 20}}>Research Details</h4> <Grid container spacing={1} style={{marginLeft: 10}}> <Grid item xs={2} className={styles.fieldLabel}> Animal Cohorts: </Grid> <Grid item xs={10}> {requestData.cohorts.length ? ( - <Table style={{display: "inline-block"}} cellPadding={1} cellSpacing={1} > + <Table style={{display: "inline-block", padding: 5}}> <TableHead><TableRow key={"cohorts-header"}> <TableCell className={styles.tableHead}>Number of Animals</TableCell><TableCell className={styles.tableHead}>Sex</TableCell><TableCell className={styles.tableHead}>Other Characteristics</TableCell> </TableRow> </TableHead> - <TableBody> - {requestData.cohorts.map(cohort => { + <TableBody style={{border: 1, borderColor: 'black'}}> + {requestData.cohorts.map((cohort, idx) => { return( - <TableRow key={cohort.rowid}> - <TableCell>{cohort.numberofanimals}</TableCell> - <TableCell>{cohort.sex}</TableCell> - <TableCell>{cohort.othercharacteristics}</TableCell> + <TableRow key={cohort.rowid} style = { idx % 2 ? { background : "#fdffe0" }:{ background : "white" }}> + <TableCell className={styles.tableCell}>{cohort.numberofanimals}</TableCell> + <TableCell className={styles.tableCell}>{cohort.sex}</TableCell> + <TableCell className={styles.tableCell}>{cohort.othercharacteristics}</TableCell> </TableRow> ) })} @@ -197,6 +216,12 @@ export default function ReadOnlyRequest(props: {requestData: AnimalRequestModel} {translateRawToDisplayValue(requestData.request.iacucapproval, IACUCApprovalOptions)} {requestData.request.iacucprotocol ? ' (' + requestData.request.iacucprotocol + ')' : ''} </Grid> + <Grid item xs={2} className={styles.fieldLabel}> + Status: + </Grid> + <Grid item xs={10}> + {requestData.request.status} + </Grid> </Grid> <p /> <Button variant={"contained"} style={{marginLeft: 10}} href={ActionURL.buildURL('mcc', 'animalRequest', null, {requestId: requestData.request.objectid})}>Edit Request</Button> diff --git a/mcc/src/client/RequestReview/request-review.tsx b/mcc/src/client/RequestReview/request-review.tsx index 97eeadf81..29f8147e3 100644 --- a/mcc/src/client/RequestReview/request-review.tsx +++ b/mcc/src/client/RequestReview/request-review.tsx @@ -8,6 +8,8 @@ import InternalReviewForm from './components/InternalReviewForm'; import { ThemeProvider } from '@material-ui/styles'; import { createTheme } from '@material-ui/core/styles'; import '../labkeyOverrides.css'; +import FinalReviewForm from './components/FinalReviewForm'; +import { ErrorBoundary } from '@labkey/components'; export function RequestView() { const mode = (new URLSearchParams(window.location.search)).get("mode") @@ -52,13 +54,12 @@ export function RequestView() { break case "primaryReview": reviewForms = [ - <InternalReviewForm key={"internalReviewForm"} requestId={requestId}/> + <InternalReviewForm key={"internalReviewForm"} requestData={requestData}/> ] break case "rabReview": reviewForms = ( <> - <InternalReviewForm key={"internalReviewForm"} requestId={requestId} readOnly={true}/> <RabReviewForm key={"rabReviewForm"} requestId={requestId}/> </> ) @@ -66,8 +67,7 @@ export function RequestView() { case "finalReview": reviewForms = ( <> - <RabReviewForm key={"rabReviewForm"} requestId={requestId} readOnly={true}/> - <InternalReviewForm key={"internalReviewForm"} requestId={requestId}/> + <FinalReviewForm key={"finalReviewForm"} requestData={requestData}/> </> ) break @@ -85,10 +85,12 @@ export function RequestView() { return( <> - <ThemeProvider theme={theme}> - <ReadOnlyRequest requestData={requestData} /> - {reviewForms} - </ThemeProvider> + <ErrorBoundary> + <ThemeProvider theme={theme}> + <ReadOnlyRequest requestData={requestData} /> + {reviewForms} + </ThemeProvider> + </ErrorBoundary> </> ) } \ No newline at end of file diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index f951fdacd..68473ffeb 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -84,6 +84,14 @@ public static RequestStatus resolveStatus(String val) } catch (IllegalArgumentException e) { + for (RequestStatus s : RequestStatus.values()) + { + if (s.label.equals(val)) + { + return s; + } + } + return valueOf(val.substring(0, 1).toUpperCase() + val.substring(1).toLowerCase()); } } diff --git a/mcc/src/org/labkey/mcc/MccUserSchema.java b/mcc/src/org/labkey/mcc/MccUserSchema.java index e7ece31b2..449adccad 100644 --- a/mcc/src/org/labkey/mcc/MccUserSchema.java +++ b/mcc/src/org/labkey/mcc/MccUserSchema.java @@ -11,6 +11,7 @@ import org.labkey.api.data.TableInfo; import org.labkey.api.ldk.table.CustomPermissionsTable; import org.labkey.api.query.ExprColumn; +import org.labkey.api.query.FieldKey; import org.labkey.api.query.SimpleUserSchema; import org.labkey.api.security.User; import org.labkey.api.security.permissions.DeletePermission; @@ -20,6 +21,8 @@ import org.labkey.mcc.security.MccRequestAdminPermission; import org.labkey.mcc.security.MccRequestorPermission; +import java.util.Arrays; + public class MccUserSchema extends SimpleUserSchema { public MccUserSchema(User user, Container container, DbSchema dbschema) @@ -65,8 +68,9 @@ private CustomPermissionsTable<?> addScoreColumns(CustomPermissionsTable<?> ti) { if (ti.getColumn("rabReviewStatus") == null) { - SQLFragment sql = new SQLFragment("(SELECT CONCAT(COALESCE(CAST(sum(CASE WHEN r.score IS NULL THEN 0 ELSE 1 END) as varchar), '0'), ' of ', cast(count(*) as varchar)) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + SQLFragment sql = new SQLFragment("(SELECT CONCAT(COALESCE(CAST(sum(CASE WHEN r.review IS NULL THEN 0 ELSE 1 END) as varchar), '0'), ' of ', cast(count(*) as varchar), ' completed') as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); ExprColumn newCol = new ExprColumn(ti, "rabReviewStatus", sql, JdbcType.VARCHAR, ti.getColumn("requestId")); + newCol.setSortFieldKeys(Arrays.asList(FieldKey.fromString("pendingRabReviews"))); newCol.setLabel("RAB Review Status"); newCol.setDisplayColumnFactory(colInfo -> { @@ -88,7 +92,7 @@ public boolean isSortable() ti.addColumn(newCol); - SQLFragment sql2 = new SQLFragment("(SELECT COALESCE(sum(CASE WHEN r.score IS NULL THEN 0 ELSE 1 END), 0) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); + SQLFragment sql2 = new SQLFragment("(SELECT COALESCE(sum(CASE WHEN r.review IS NULL THEN 1 ELSE 0 END), -1) as expr FROM mcc.requestReviews r WHERE r.requestId = " + ExprColumn.STR_TABLE_ALIAS + ".requestId)"); ExprColumn newCol2 = new ExprColumn(ti, "pendingRabReviews", sql2, JdbcType.INTEGER, ti.getColumn("requestId")); newCol2.setLabel("Pending RAB Reviews"); ti.addColumn(newCol2); diff --git a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java index a2f492843..bce06d22a 100644 --- a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java @@ -42,7 +42,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep Container requestContainer = MccManager.get().getMCCRequestContainer(); DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=rabReview", requestContainer); - out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Review</a>"); + out.write("<a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Review</a>"); } @Override diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 0bc06cf0f..6220868db 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -57,7 +57,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep { String requestId = ctx.get(getBoundKey("requestId"), String.class); - MccManager.RequestStatus st = MccManager.RequestStatus.valueOf(status); + MccManager.RequestStatus st = MccManager.RequestStatus.resolveStatus(status); Container requestContainer = MccManager.get().getMCCRequestContainer(); if (requestContainer == null) { @@ -74,14 +74,14 @@ else if (st == MccManager.RequestStatus.FormCheck) { out.write("<br><a class=\"labkey-text-link\" href=\"javascript:void(0)\">Submit For RAB Review</a>"); } - else if (st == MccManager.RequestStatus.RabReview) + else if (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString("pendingRabReviews"), Integer.class) == 0) { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); } else if (st == MccManager.RequestStatus.Approved) { - out.write("<br><a class=\"labkey-text-link\" href=\"javascript:alert('This is not enabled yet')\">Update Animal Status</a>"); + out.write("<br><a class=\"labkey-text-link\" href=\"javascript:alert('This is not enabled yet')\">Update Animal Availability</a>"); } } catch (IllegalArgumentException e) @@ -99,15 +99,9 @@ public void addQueryFieldKeys(Set<FieldKey> keys) keys.add(getBoundKey("rowid")); keys.add(getBoundKey("createdby")); keys.add(getBoundKey("requestId")); + keys.add(getBoundKey("pendingRabReviews")); keys.add(getBoundKey("requestId/status")); } - - @Override - public @NotNull Set<ClientDependency> getClientDependencies() - { - //TODO - return super.getClientDependencies(); - } }; } } diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 39220b323..9e75caa88 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -87,6 +87,12 @@ public boolean isAliasInUse(String alias) public void ensureReviewRecordsCreated(String objectId, String status, @Nullable String previousStatus, int score) { + if (objectId == null) + { + _log.error("No objectId provided, cannot update animalRequest record"); + return; + } + try { MccManager.RequestStatus st = MccManager.RequestStatus.resolveStatus(status); @@ -211,4 +217,9 @@ public boolean hasPermission(String status) return false; } } + + public String resolveObjectId(int rowid) + { + return new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS), PageFlowUtil.set("objectid"), new SimpleFilter(FieldKey.fromString("rowid"), rowid), null).getObject(String.class); + } } diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index 92fbb1811..ff9b02102 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -33,7 +33,9 @@ import org.labkey.test.WebTestHelper; import org.labkey.test.categories.External; import org.labkey.test.categories.LabModule; +import org.labkey.test.util.ApiPermissionsHelper; import org.labkey.test.util.DataRegionTable; +import org.labkey.test.util.PermissionsHelper; import java.util.ArrayList; import java.util.Arrays; @@ -285,6 +287,85 @@ private void doRequestFormTest() throws Exception waitForSaveToComplete(); Assert.assertEquals(getLastModifiedRequestRow().get("iacucprotocol"), "IACUC 123456"); + waitAndClickAndWait(getButton("Submit")); + + DataRegionTable dr = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); + Assert.assertEquals("Submitted", dr.getDataAsText(0, "status")); + + beginAt("/mcc/" + getProjectName() + "/mccRequestAdmin.view"); + + // Ensure groups set up correctly: + String dataRegionName = getDataRegionName("webpartRAB"); + dr = new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); + Assert.assertEquals(dr.getDataRowCount(), 1); + + waitAndClickAndWait(Locator.tagWithText("a", "Enter MCC Internal Review")); + + waitAndClick(getButton("Return to Investigator")); + waitForElement(Locator.tagWithText("h2", "Return To Investigator").notHidden()); + waitAndClickAndWait(getButton("Submit")); + + dr = new DataRegionTable.DataRegionFinder(getDriver()).withName(getDataRegionName("webpartPending")).waitFor(); + dr.clickRowDetails(0); + + // Reset status to Submitted: + waitAndClickAndWait(Locator.tagWithText("span", "Edit Request")); + waitAndClickAndWait(getButton("Submit")); + + beginAt("/mcc/" + getProjectName() + "/mccRequestAdmin.view"); + dataRegionName = getDataRegionName("webpartPending"); + new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); + waitAndClickAndWait(Locator.tagWithText("a", "Enter MCC Internal Review")); + + waitAndClick(Locator.tagWithText("span", "Assign to RAB Reviewers")); + waitForElement(Locator.tagWithText("h2", "Assign for RAB Review").notHidden()); + waitForElement(Locator.tagWithText("p", getCurrentUserName())); + waitAndClickAndWait(Locator.tagWithText("span", "Submit")); + + goBack(); + + // Repeat to ensure the assignment is picked up + waitAndClick(Locator.tagWithText("span", "Assign to RAB Reviewers")); + waitForElement(Locator.tagWithText("h2", "Assign for RAB Review").notHidden()); + waitForElement(Locator.tagWithText("p", getCurrentUserName() + " (already assigned)")); + waitAndClickAndWait(Locator.tagWithText("span", "Submit")); + + beginAt("/mcc/" + getProjectName() + "/rabRequestReview.view"); + waitAndClickAndWait(Locator.tagWithText("a", "Enter Review")); + waitForElement(Locator.tagWithText("td", "cohort-othercharacteristics")); + + waitAndClick(Locator.tagWithText("span", "Submit Review")); + waitForElement(Locator.tagWithClass("div", "Mui-error")); + + waitAndClick(Locator.tagWithText("div", "Not Decided")); + waitAndClick(Locator.tagWithText("li", "I recommend this proposal")); + waitAndClickAndWait(Locator.tagWithText("span", "Submit Review")); + dr = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); + Assert.assertEquals(dr.getDataRowCount(), 0); + + beginAt("/mcc/" + getProjectName() + "/mccRequestAdmin.view"); + dataRegionName = getDataRegionName("webpartPending"); + new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); + waitAndClickAndWait(Locator.tagWithText("a", "Enter Final Review")); + + waitAndClick(Locator.tagWithText("span", "Approve Request")); + waitForElement(Locator.tagWithClass("div", "Mui-error")); + + setFormElement(Locator.tagWithAttribute("input", "name", "proposalScore"), "999"); + waitAndClickAndWait(Locator.tagWithText("span", "Approve Request")); + dataRegionName = getDataRegionName("webpartPending"); + dr = new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); + Assert.assertEquals(dr.getDataRowCount(), 0); + } + + private String getDataRegionName(String divName) + { + Locator.XPathLocator l = Locator.tagWithAttributeContaining("div", "id", divName); + waitForElement(l); + l = l.append(Locator.tag("form")); + waitForElement(l); + + return getAttribute(l, "lk-region-form"); } private FormElement[] getCoinvestigatorFields(int idx) @@ -559,6 +640,19 @@ private void doSetup() throws Exception new ModulePropertyValue("MCC", "/", "MCCContactUsers", getCurrentUserName()), new ModulePropertyValue("MCC", "/", "MCCRequestNotificationUsers", getCurrentUserName()) )); + + beginAt("/mcc/" + getProjectName() + "/configureMcc.view"); + clickButton("OK"); + + ApiPermissionsHelper helper = new ApiPermissionsHelper(this); + if (!helper.isUserInGroup(getCurrentUser(), "MCC RAB Members", "/", PermissionsHelper.PrincipalType.USER)) + { + helper.addUserToSiteGroup(getCurrentUser(), "MCC RAB Members"); + } + else + { + log("Member already in group. This is not expected for fresh installations or TeamCity"); + } } private void testInvalidId() From 597c344ff9412f0db18f37cda9163facce7eb4fc Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Sun, 8 May 2022 11:27:47 -0700 Subject: [PATCH 52/63] Ensure consistent slash in MCC properties --- mcc/resources/queries/mcc/aggregatedDemographics.sql | 2 +- mcc/resources/views/mccAdmin.html | 6 +++--- mcc/resources/web/mcc/Utils.js | 12 +++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql index 5cb1511c4..49d451ca4 100644 --- a/mcc/resources/queries/mcc/aggregatedDemographics.sql +++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql @@ -41,7 +41,7 @@ SELECT d.objectid, d.calculated_status, CASE - WHEN d.calculated_status == 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true + WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true ELSE false END as u24_status, d.container diff --git a/mcc/resources/views/mccAdmin.html b/mcc/resources/views/mccAdmin.html index 25b91f8ba..b79e1946c 100644 --- a/mcc/resources/views/mccAdmin.html +++ b/mcc/resources/views/mccAdmin.html @@ -15,13 +15,13 @@ sections: [ {header: 'User/Request Management', items: [ - {name: 'View Pending User Requests', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests&viewName=Pending Requests'}, - {name: 'View All Users', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests'} + {name: 'View Pending User Requests', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests&viewName=Pending Requests'}, + {name: 'View All Users', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests'} ] }, {header: 'Configuration/Data Management', items: [ - {name: 'Ensure Site Settings and Groups', url: '<%=contextPath%>/' + ctx['MCCContainer'] + '/mcc-configureMcc.view'} + {name: 'Ensure Site Settings and Groups', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/mcc-configureMcc.view'} ] } diff --git a/mcc/resources/web/mcc/Utils.js b/mcc/resources/web/mcc/Utils.js index 3a8ef6ec3..35c447317 100644 --- a/mcc/resources/web/mcc/Utils.js +++ b/mcc/resources/web/mcc/Utils.js @@ -12,8 +12,18 @@ MCC.Utils = new function() { var requiredProps = requiredProps || ['MCCContainer', 'MCCRequestContainer']; var missingProps = []; for (var i=0;i<requiredProps.length;i++){ - if(!ctx[requiredProps[i]]) + if (!ctx[requiredProps[i]]) { missingProps.push(requiredProps[i]); + } + else { + if (!ctx[requiredProps[i]].startsWith('/')) { + ctx[requiredProps[i]] = '/' + ctx[requiredProps[i]]; + } + + if (ctx[requiredProps[i]].endsWith('/')) { + ctx[requiredProps[i]] = ctx[requiredProps[i]].substr(0, -1); + } + } } if (missingProps.length > 0){ From 2618297b025f59e566a2b598ec269ec35337c363 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Mon, 9 May 2022 13:01:31 -0700 Subject: [PATCH 53/63] Add returnURL to MCC display column URLs and show correct RowId --- ...equestReviewActionsDisplayColumnFactory.java | 2 +- ...RequestScoreActionsDisplayColumnFactory.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java index bce06d22a..c71371e24 100644 --- a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java @@ -42,7 +42,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep Container requestContainer = MccManager.get().getMCCRequestContainer(); DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=rabReview", requestContainer); - out.write("<a class=\"labkey-text-link\" href=\"" + url.getActionURL() + "\">Enter Review</a>"); + out.write("<a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Review</a>"); } @Override diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 6220868db..22651d65d 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -32,24 +32,24 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) @Override public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException { - int rowId = ctx.get(getBoundKey("rowid"), Integer.class); + int requestRowId = ctx.get(getBoundKey("requestId", "rowid"), Integer.class); if (MccManager.get().isRequestAdmin(ctx.getViewContext().getUser())) { - int userId = ctx.get(getBoundKey("createdby"), Integer.class); + int userId = ctx.get(getBoundKey("requestId", "createdby"), Integer.class); User u = UserManager.getUser(userId); if (u == null) { - _log.error("Unknown user: " + userId + " for MCC request " + rowId, new Exception()); + _log.error("Unknown user: " + userId + " for MCC request " + requestRowId, new Exception()); return; } - out.write("<a class=\"labkey-text-link\" href=\"mailto:" + u.getEmail() + "?subject=MCC Request #" + rowId + "\">Contact Investigator</a>"); + out.write("<a class=\"labkey-text-link\" href=\"mailto:" + u.getEmail() + "?subject=MCC Request #" + requestRowId + "\">Contact Investigator</a>"); } String status = ctx.get(getBoundKey("requestId", "status"), String.class); if (status == null) { - _log.error("MCC Request lacks status: " + rowId, new Exception()); + _log.error("MCC Request lacks status: " + requestRowId, new Exception()); } else { @@ -86,7 +86,7 @@ else if (st == MccManager.RequestStatus.Approved) } catch (IllegalArgumentException e) { - _log.error("Unknown MCC Request status: " + rowId, new Exception()); + _log.error("Unknown MCC Request status: " + requestRowId, new Exception()); } } } @@ -97,10 +97,11 @@ public void addQueryFieldKeys(Set<FieldKey> keys) super.addQueryFieldKeys(keys); keys.add(getBoundKey("rowid")); - keys.add(getBoundKey("createdby")); + keys.add(getBoundKey("requestId", "createdby")); keys.add(getBoundKey("requestId")); keys.add(getBoundKey("pendingRabReviews")); - keys.add(getBoundKey("requestId/status")); + keys.add(getBoundKey("requestId", "status")); + keys.add(getBoundKey("requestId" , "rowid")); } }; } From dd5785ec6173adf0cb0dc5b948906151a9dfd689 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 11:20:56 -0700 Subject: [PATCH 54/63] Bugfix to MCC request form --- .../queries/mcc/requestReviews/.qview.xml | 1 + mcc/resources/schemas/mcc.xml | 3 +-- .../RequestReview/components/RabReviewForm.tsx | 18 +++--------------- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/mcc/resources/queries/mcc/requestReviews/.qview.xml b/mcc/resources/queries/mcc/requestReviews/.qview.xml index 07a248d0d..55fa5feb2 100644 --- a/mcc/resources/queries/mcc/requestReviews/.qview.xml +++ b/mcc/resources/queries/mcc/requestReviews/.qview.xml @@ -8,6 +8,7 @@ <property name="columnTitle" value="Request Status"/> </properties> </column> + <column name="reviewerId"/> <column name="review"/> <column name="actions"/> </columns> diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 086139ea6..21f7725e9 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -579,9 +579,8 @@ <nullable>false</nullable> </column> <column columnName="reviewerId"> - <columnTitle>Reviewer</columnTitle> + <columnTitle>Assigned Reviewer</columnTitle> <nullable>false</nullable> - <fk> <fkDbSchema>core</fkDbSchema> <fkTable>users</fkTable> diff --git a/mcc/src/client/RequestReview/components/RabReviewForm.tsx b/mcc/src/client/RequestReview/components/RabReviewForm.tsx index 4feaaf621..9bf1f47a5 100644 --- a/mcc/src/client/RequestReview/components/RabReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/RabReviewForm.tsx @@ -1,18 +1,6 @@ import { ActionURL, Filter, getServerContext, Query } from '@labkey/api'; import React, { useEffect, useState } from 'react'; -import { - Box, - Button, - makeStyles, - MenuItem, - Select, - Table, - TableBody, - TableCell, - TableHead, - TableRow, - TextField -} from '@material-ui/core'; +import { Box, Button, MenuItem, Select, Table, TableBody, TableCell, TableRow, TextField } from '@material-ui/core'; import SavingOverlay from '../../AnimalRequest/saving-overlay'; export default function RabReviewForm(props: {requestId: string}) { @@ -36,11 +24,11 @@ export default function RabReviewForm(props: {requestId: string}) { ], filterArray: [ Filter.create('requestId', props.requestId), - Filter.create('reviewerid', getServerContext().user.userId) + Filter.create('reviewerId', getServerContext().user.id) ], success: function (resp) { if (resp.rows.length > 1) { - console.error("More than one MCC review record returned for the user: " + getServerContext().user.userId + ". this should never happen") + console.error("More than one MCC review record returned for the user: " + getServerContext().user.id + ". this should never happen") } setRecordData([...resp.rows]) From 0a7caf76865cc41baa87ea7c43ca6f0bbee282f0 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 13:54:36 -0700 Subject: [PATCH 55/63] Add option to notify MCC reviewers --- .../queries/mcc/myRequests.query.xml | 2 + mcc/resources/queries/mcc/requestScores.js | 25 ++++++++ .../queries/mcc/requestScores/.qview.xml | 2 +- mcc/resources/schemas/mcc.xml | 19 ++++++ mcc/resources/views/mccRequestAdmin.html | 8 +-- .../web/mcc/window/ReviewerNotifyWindow.js | 63 +++++++++++++++++++ .../components/FinalReviewForm.tsx | 8 +-- mcc/src/org/labkey/mcc/MccManager.java | 6 ++ mcc/src/org/labkey/mcc/MccModule.java | 3 + ...uestReviewActionsDisplayColumnFactory.java | 5 +- ...questScoreActionsDisplayColumnFactory.java | 4 +- .../mcc/query/ReviewerNotifyButton.java | 18 ++++++ .../org/labkey/mcc/query/TriggerHelper.java | 20 +++++- 13 files changed, 170 insertions(+), 13 deletions(-) create mode 100644 mcc/resources/queries/mcc/requestScores.js create mode 100644 mcc/resources/web/mcc/window/ReviewerNotifyWindow.js create mode 100644 mcc/src/org/labkey/mcc/query/ReviewerNotifyButton.java diff --git a/mcc/resources/queries/mcc/myRequests.query.xml b/mcc/resources/queries/mcc/myRequests.query.xml index e5bdacb69..37a91ba90 100644 --- a/mcc/resources/queries/mcc/myRequests.query.xml +++ b/mcc/resources/queries/mcc/myRequests.query.xml @@ -3,6 +3,8 @@ <tables xmlns="http://labkey.org/data/xml"> <table tableName="myRequests" tableDbType="TABLE"> <javaCustomizer class="org.labkey.mcc.query.MccEhrCustomizer" /> + <insertUrl>/mcc/animalRequest.view</insertUrl> + <importUrl/> <updateUrl>/mcc/animalRequest.view?requestId=${objectid}</updateUrl> <titleColumn>rowid</titleColumn> <columns> diff --git a/mcc/resources/queries/mcc/requestScores.js b/mcc/resources/queries/mcc/requestScores.js new file mode 100644 index 000000000..2c6e7d6be --- /dev/null +++ b/mcc/resources/queries/mcc/requestScores.js @@ -0,0 +1,25 @@ +var console = require("console"); +var LABKEY = require("labkey"); + +var triggerHelper = new org.labkey.mcc.query.TriggerHelper(LABKEY.Security.currentUser.id, LABKEY.Security.currentContainer.id); + +function afterInsert(row, errors){ + afterUpsert(row, null, errors); +} + +function afterUpdate(row, oldRow, errors){ + afterUpsert(row, oldRow, errors); +} + +function afterUpsert(row, oldRow, errors) { + if (row.review) { + var requestId = row.requestId || oldRow.requestId + if (!requestId) { + console.error('No requestId for requestScore update') + console.error(row) + return + } + + triggerHelper.possiblySetRabComplete(requestId); + } +} \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores/.qview.xml b/mcc/resources/queries/mcc/requestScores/.qview.xml index daa66e85a..947e4dd6b 100644 --- a/mcc/resources/queries/mcc/requestScores/.qview.xml +++ b/mcc/resources/queries/mcc/requestScores/.qview.xml @@ -8,7 +8,7 @@ <column name="preliminaryScore"/> <column name="resourceAvailabilityScore"/> <column name="rabReviewStatus"/> - <column name="proposalScore"/> +<!-- <column name="proposalScore"/>--> <column name="created"/> <column name="actions"/> diff --git a/mcc/resources/schemas/mcc.xml b/mcc/resources/schemas/mcc.xml index 21f7725e9..9c0527cd2 100644 --- a/mcc/resources/schemas/mcc.xml +++ b/mcc/resources/schemas/mcc.xml @@ -565,6 +565,7 @@ </columns> </table> <table tableName="requestReviews" tableDbType="TABLE"> + <javaCustomizer class="org.labkey.ldk.query.DefaultTableCustomizer" /> <tableTitle>Request Reviews</tableTitle> <auditLogging>DETAILED</auditLogging> <insertUrl /> @@ -645,6 +646,15 @@ </displayColumnFactory> </column> </columns> + <buttonBarOptions includeStandardButtons="true"> + <includeScript>ldk.context</includeScript> + <item hidden="true"> + <originalText>Charts</originalText> + </item> + <item hidden="true"> + <originalText>Print</originalText> + </item> + </buttonBarOptions> </table> <table tableName="requestScores" tableDbType="TABLE"> <insertUrl /> @@ -719,5 +729,14 @@ </displayColumnFactory> </column> </columns> + <buttonBarOptions includeStandardButtons="true"> + <includeScript>ldk.context</includeScript> + <item hidden="true"> + <originalText>Charts</originalText> + </item> + <item hidden="true"> + <originalText>Print</originalText> + </item> + </buttonBarOptions> </table> </tables> diff --git a/mcc/resources/views/mccRequestAdmin.html b/mcc/resources/views/mccRequestAdmin.html index 0acb62857..f5f659231 100644 --- a/mcc/resources/views/mccRequestAdmin.html +++ b/mcc/resources/views/mccRequestAdmin.html @@ -34,8 +34,7 @@ queryName: 'requestReviews', viewName: 'Pending Reviews', showRecordSelectors: false, - showDetailsColumn: false, - buttonBar: {position: 'top', includeStandardButtons: true, items: []} + showDetailsColumn: false }).render(webpart.wrapperDivId + '-webpartAssignments'); LDK.Utils.getBasicQWP({ @@ -43,10 +42,9 @@ frame: 'left-nav', schemaName: 'mcc', queryName: 'requestScores', - viewName: 'Pending Requests', + //viewName: 'Pending Requests', showRecordSelectors: true, - showDetailsColumn: true, - buttonBar: {position: 'top', includeStandardButtons: true, items: []} + showDetailsColumn: true }).render(webpart.wrapperDivId + '-webpartPending'); LDK.Utils.getBasicQWP({ diff --git a/mcc/resources/web/mcc/window/ReviewerNotifyWindow.js b/mcc/resources/web/mcc/window/ReviewerNotifyWindow.js new file mode 100644 index 000000000..52505da8d --- /dev/null +++ b/mcc/resources/web/mcc/window/ReviewerNotifyWindow.js @@ -0,0 +1,63 @@ +Ext4.define('MCC.window.ReviewerNotifyWindow', { + extend: 'Ext.window.Window', + + statics: { + buttonHandler: function (dataRegionName) { + var dataRegion = LABKEY.DataRegions[dataRegionName]; + var checked = dataRegion.getChecked(); + if (!checked || !checked.length) { + Ext4.Msg.alert('Error', 'No records selected'); + return; + } + + Ext4.create('MCC.window.ReviewerNotifyWindow', { + dataRegionName: dataRegionName, + rowIds: checked + }).show(); + } + }, + + initComponent: function(){ + Ext4.apply(this, { + bodyStyle: 'padding: 5px;', + width: 500, + modal: true, + title: 'Send Reviewer Notifications', + items: [{ + html: 'This will send a notification email to the reviewers assigned to the ' + this.rowIds.length + ' selected records.', + border: false, + style: 'padding-bottom: 10px;' + }], + buttons: [{ + text: 'Submit', + handler: this.onSubmit, + scope: this + },{ + text: 'Cancel', + handler: function(btn){ + btn.up('window').close(); + } + }] + }); + + this.callParent(arguments); + }, + + onSubmit: function(btn){ + Ext4.Msg.wait('Loading...'); + + LABKEY.Ajax.request({ + url: LABKEY.ActionURL.buildURL('mcc', 'notifyReviewers'), + scope: this, + failure: LDK.Utils.getErrorCallback(), + success: LABKEY.Utils.getCallbackWrapper(function (results) { + Ext4.Msg.hide(); + Ext4.Msg.alert('Success', 'Notification Emails Sent'); + btn.up('window').close(); + }, this), + jsonData: { + rowIds: this.rowIds + } + }); + } +}); \ No newline at end of file diff --git a/mcc/src/client/RequestReview/components/FinalReviewForm.tsx b/mcc/src/client/RequestReview/components/FinalReviewForm.tsx index 76d1a48ae..a6349c861 100644 --- a/mcc/src/client/RequestReview/components/FinalReviewForm.tsx +++ b/mcc/src/client/RequestReview/components/FinalReviewForm.tsx @@ -173,11 +173,11 @@ export default function FinalReviewForm(props: {requestData: AnimalRequestModel} <TableRow> <TableCell><TextField key={"resourceAvailabilityScore"} name={"resourceAvailabilityScore"} label={"Resource Availability Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.resourceAvailabilityScore || ''} fullWidth={true} /></TableCell> </TableRow> + {/*<TableRow>*/} + {/* <TableCell><TextField key={"proposalScore"} name={"proposalScore"} required={true} error={hasSubmitted && !recordData.proposalScore} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell>*/} + {/*</TableRow>*/} <TableRow> - <TableCell><TextField key={"proposalScore"} name={"proposalScore"} required={true} error={hasSubmitted && !recordData.proposalScore} label={"Final Proposal Score"} onChange={handleChange} variant={'outlined'} defaultValue={recordData.proposalScore || ''} fullWidth={true} /></TableCell> - </TableRow> - <TableRow> - <TableCell><TextField key={"comments"} name={"comments"} label={"Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> + <TableCell><TextField key={"comments"} name={"comments"} label={"NIH Comments"} minRows={4} multiline={true} onChange={handleChange} variant={'outlined'} defaultValue={recordData.comments || ''} fullWidth={true} /></TableCell> </TableRow> </TableBody> </Table> diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index 68473ffeb..36e04e1e0 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -49,6 +49,7 @@ public enum RequestStatus Submitted(2, "Submitted", MccRequestorPermission.class), FormCheck(3, "Internal Review", MccRequestAdminPermission.class), RabReview(4, "RAB Review", MccRequestAdminPermission.class), + PendingDecision(4, "Pending Decision", MccRequestAdminPermission.class), FinalReview(5, "Final Review", MccRequestAdminPermission.class), Approved(6, "Approved", MccRequestAdminPermission.class), Rejected(7, "Rejected", MccRequestAdminPermission.class), @@ -71,6 +72,11 @@ public boolean canEdit(User u, Container c) return c.hasPermission(u, this.editPermission); } + public String getLabel() + { + return label; + } + public static RequestStatus resolveStatus(String val) { if (val == null) diff --git a/mcc/src/org/labkey/mcc/MccModule.java b/mcc/src/org/labkey/mcc/MccModule.java index 40c4adb3a..f495887cb 100644 --- a/mcc/src/org/labkey/mcc/MccModule.java +++ b/mcc/src/org/labkey/mcc/MccModule.java @@ -21,6 +21,7 @@ import org.json.JSONObject; import org.labkey.api.ehr.EHRService; import org.labkey.api.ldk.ExtendedSimpleModule; +import org.labkey.api.ldk.LDKService; import org.labkey.api.module.Module; import org.labkey.api.module.ModuleContext; import org.labkey.api.query.DefaultSchema; @@ -29,6 +30,7 @@ import org.labkey.api.view.WebPartFactory; import org.labkey.api.writer.ContainerUser; import org.labkey.mcc.query.MccEhrCustomizer; +import org.labkey.mcc.query.ReviewerNotifyButton; import org.labkey.mcc.security.MccDataAdminRole; import org.labkey.mcc.security.MccRequestAdminPermission; import org.labkey.mcc.security.MccRequesterRole; @@ -89,6 +91,7 @@ public JSONObject getPageContextJson(ContainerUser context) protected void doStartupAfterSpringConfig(ModuleContext moduleContext) { registerEHRResources(); + LDKService.get().registerQueryButton(new ReviewerNotifyButton(), MccSchema.NAME, MccSchema.TABLE_REQUEST_REVIEWS); } @Override diff --git a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java index c71371e24..2b6c45a6f 100644 --- a/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestReviewActionsDisplayColumnFactory.java @@ -38,8 +38,11 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep return; } - String requestId = ctx.get(getBoundKey("requestId"), String.class); + if (!ctx.getViewContext().getUser().equals(u)) { + return; + } + String requestId = ctx.get(getBoundKey("requestId"), String.class); Container requestContainer = MccManager.get().getMCCRequestContainer(); DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=rabReview", requestContainer); out.write("<a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Review</a>"); diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 22651d65d..2278d45dc 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -74,7 +74,9 @@ else if (st == MccManager.RequestStatus.FormCheck) { out.write("<br><a class=\"labkey-text-link\" href=\"javascript:void(0)\">Submit For RAB Review</a>"); } - else if (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString("pendingRabReviews"), Integer.class) == 0) + else if (st == MccManager.RequestStatus.PendingDecision || + (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString("pendingRabReviews"), Integer.class) == 0) + ) { DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); diff --git a/mcc/src/org/labkey/mcc/query/ReviewerNotifyButton.java b/mcc/src/org/labkey/mcc/query/ReviewerNotifyButton.java new file mode 100644 index 000000000..7d114ba32 --- /dev/null +++ b/mcc/src/org/labkey/mcc/query/ReviewerNotifyButton.java @@ -0,0 +1,18 @@ +package org.labkey.mcc.query; + +import org.labkey.api.ldk.table.SimpleButtonConfigFactory; +import org.labkey.api.module.ModuleLoader; +import org.labkey.api.view.template.ClientDependency; +import org.labkey.mcc.MccModule; +import org.labkey.mcc.security.MccRequestAdminPermission; + +import java.util.Arrays; + +public class ReviewerNotifyButton extends SimpleButtonConfigFactory +{ + public ReviewerNotifyButton() + { + super(ModuleLoader.getInstance().getModule(MccModule.class), "Notify Reviewers", "MCC.window.ReviewerNotifyWindow.buttonHandler(dataRegionName);", Arrays.asList(ClientDependency.supplierFromPath("mcc/window/ReviewerNotifyWindow.js"))); + setPermission(MccRequestAdminPermission.class); + } +} diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 9e75caa88..84e1381a6 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -35,8 +35,11 @@ import javax.mail.Address; import javax.mail.Message; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -121,7 +124,7 @@ public void ensureReviewRecordsCreated(String objectId, String status, @Nullable else { // Ensure score is accurate in the case the underlying data changed: - List<Map> records = ts.getArrayList(Map.class); + List<Map<String, Object>> records = new ArrayList<>(ts.getMapCollection()); if (records.size() != 1) { _log.error("More than one requestScore record found for requestId: " + objectId); @@ -222,4 +225,19 @@ public String resolveObjectId(int rowid) { return new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS), PageFlowUtil.set("objectid"), new SimpleFilter(FieldKey.fromString("rowid"), rowid), null).getObject(String.class); } + + public void possiblySetRabComplete(String requestId) + { + TableInfo ti = MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_REQUEST_REVIEWS); + Set<String> reviews = new HashSet<>(new TableSelector(ti, PageFlowUtil.set("review"), new SimpleFilter(FieldKey.fromString("requestId"), requestId), null).getArrayList(String.class)); + if (!reviews.isEmpty() && !reviews.contains(null)) { + TableInfo requestTable = MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS); + int rowId = new TableSelector(requestTable, PageFlowUtil.set("rowid"), new SimpleFilter(FieldKey.fromString("requestId"), requestId), null).getObject(Integer.class); + Map<String, Object> map = new HashMap<>(); + map.put("rowid", rowId); + map.put("status", MccManager.RequestStatus.PendingDecision.getLabel()); + + Table.update(_user, ti, map, rowId); + } + } } From b7ea83ece52506955f9e231e655b48280c137615 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 13:54:57 -0700 Subject: [PATCH 56/63] Add file missed with last commit --- mcc/src/org/labkey/mcc/MccController.java | 76 ++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index 4669f8eac..206851272 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -24,6 +24,7 @@ import org.labkey.api.action.ConfirmAction; import org.labkey.api.action.MutatingApiAction; import org.labkey.api.action.SpringActionController; +import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.CoreSchema; @@ -60,6 +61,7 @@ import org.labkey.api.util.URLHelper; import org.labkey.api.view.HtmlView; import org.labkey.mcc.etl.ZimsImportTask; +import org.labkey.mcc.security.MccRequestAdminPermission; import org.labkey.security.xml.GroupEnumType; import org.springframework.validation.BindException; import org.springframework.validation.Errors; @@ -75,6 +77,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; public class MccController extends SpringActionController { @@ -654,7 +657,76 @@ public URLHelper getSuccessURL(Object o) } } - //TODO: - // assign to reviewers + @RequiresPermission(MccRequestAdminPermission.class) + public class NotifyReviewersAction extends MutatingApiAction<NotifyReviewersForm> + { + @Override + public Object execute(NotifyReviewersForm form, BindException errors) throws Exception + { + if (form.getRowIds() == null || form.getRowIds().length == 0) + { + errors.reject(ERROR_MSG, "No rowIds provided"); + return null; + } + + List<Integer> rowIds = Arrays.stream(form.getRowIds()).collect(Collectors.toList()); + List<Integer> userIds = new TableSelector(MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_REQUEST_REVIEWS), PageFlowUtil.set("reviewerId"), new SimpleFilter(FieldKey.fromString("rowid"), rowIds, CompareType.IN), null).getArrayList(Integer.class); + if (userIds.size() != form.getRowIds().length) + { + errors.reject(ERROR_MSG, "Not all users in this request were found"); + return null; + } + + Set<Address> emails = new HashSet<>(); + for (int userId : userIds) + { + User u = UserManager.getUser(userId); + if (u == null) + { + _log.error("Unknown user: " + userId); + errors.reject(ERROR_MSG, "Unknown user: " + userId); + return null; + } + + ValidEmail validEmail = new ValidEmail(u.getEmail()); + emails.add(validEmail.getAddress()); + } + + try + { + MailHelper.MultipartMessage mail = MailHelper.createMultipartMessage(); + mail.setFrom("mcc-do-not-reply@ohsu.edu"); + mail.setSubject("MCC Animal Request Reviews"); + Container rc = MccManager.get().getMCCRequestContainer(); + DetailsURL url = DetailsURL.fromString("/mcc/rabRequestReview.view", rc); + mail.setEncodedHtmlContent("You have been assigned one or more MCC Animal Requests to review. <a href=\"" + url.getActionURL() + "\">Please click here to view and complete these assignments</a>"); + mail.addRecipients(Message.RecipientType.BCC, emails.toArray(new Address[0])); + mail.addRecipients(Message.RecipientType.TO, "mcc-do-not-reply@ohsu.edu"); + + MailHelper.send(mail, getUser(), getContainer()); + } + catch (Exception e) + { + _log.error("Unable to send MCC email", e); + } + + return new ApiSimpleResponse("success", true); + } + } + + public static class NotifyReviewersForm + { + Integer[] rowIds; + + public Integer[] getRowIds() + { + return rowIds; + } + + public void setRowIds(Integer[] rowIds) + { + this.rowIds = rowIds; + } + } } From 19bf2f566384477f8a262fe28838a06b97e18ed6 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 16:40:16 -0700 Subject: [PATCH 57/63] Test fix --- mcc/test/src/org/labkey/test/tests/mcc/MccTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index ff9b02102..7ce121987 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -347,12 +347,8 @@ private void doRequestFormTest() throws Exception dataRegionName = getDataRegionName("webpartPending"); new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); waitAndClickAndWait(Locator.tagWithText("a", "Enter Final Review")); - waitAndClick(Locator.tagWithText("span", "Approve Request")); - waitForElement(Locator.tagWithClass("div", "Mui-error")); - setFormElement(Locator.tagWithAttribute("input", "name", "proposalScore"), "999"); - waitAndClickAndWait(Locator.tagWithText("span", "Approve Request")); dataRegionName = getDataRegionName("webpartPending"); dr = new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); Assert.assertEquals(dr.getDataRowCount(), 0); From f5e01672287c93063d08b7b05cb8293c7a0518df Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 16:49:40 -0700 Subject: [PATCH 58/63] Correct MCC email URL --- mcc/src/org/labkey/mcc/MccController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index 206851272..cadbc6c33 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -700,7 +700,7 @@ public Object execute(NotifyReviewersForm form, BindException errors) throws Exc Container rc = MccManager.get().getMCCRequestContainer(); DetailsURL url = DetailsURL.fromString("/mcc/rabRequestReview.view", rc); - mail.setEncodedHtmlContent("You have been assigned one or more MCC Animal Requests to review. <a href=\"" + url.getActionURL() + "\">Please click here to view and complete these assignments</a>"); + mail.setEncodedHtmlContent("You have been assigned one or more MCC Animal Requests to review. <a href=\"" + AppProps.getInstance().getBaseServerUrl() + url.getActionURL() + "\">Please click here to view and complete these assignments</a>"); mail.addRecipients(Message.RecipientType.BCC, emails.toArray(new Address[0])); mail.addRecipients(Message.RecipientType.TO, "mcc-do-not-reply@ohsu.edu"); From 93dc0d9f4de865fef333292fe8e3665ec64d2776 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Tue, 10 May 2022 17:59:09 -0700 Subject: [PATCH 59/63] MCC test fix now that grid shows approved requests --- mcc/test/src/org/labkey/test/tests/mcc/MccTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index 7ce121987..3ed2ecafe 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -351,7 +351,7 @@ private void doRequestFormTest() throws Exception dataRegionName = getDataRegionName("webpartPending"); dr = new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); - Assert.assertEquals(dr.getDataRowCount(), 0); + Assert.assertEquals(dr.getDataRowCount(), 1); } private String getDataRegionName(String divName) From 77888b4ffc7b14cc327749ecb7360b9c7999524c Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 11 May 2022 10:21:13 -0700 Subject: [PATCH 60/63] Ensure MCC objectid/requestId is uppercase so JS is consistent --- mcc/resources/queries/mcc/animalRequests.js | 3 +++ mcc/resources/queries/mcc/requestReviews.js | 28 +++++++++++++++++++-- mcc/resources/queries/mcc/requestScores.js | 21 ++++++---------- mcc/src/client/components/RequestUtils.tsx | 10 ++++---- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index 179ba201b..c322ccf6d 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -20,6 +20,9 @@ function beforeUpsert(row, oldRow, errors) { errors._form = 'Unable to resolve record with rowid: ' + row.rowid return } + else { + row.objectid = row.objectid.toUpperCase(); + } if (!row.status) { console.error('Request row being submitted without a status: ' + row.objectid) diff --git a/mcc/resources/queries/mcc/requestReviews.js b/mcc/resources/queries/mcc/requestReviews.js index 8c0b81b5a..8dcbdb027 100644 --- a/mcc/resources/queries/mcc/requestReviews.js +++ b/mcc/resources/queries/mcc/requestReviews.js @@ -12,7 +12,31 @@ function beforeUpdate(row, oldRow, errors){ } function beforeUpsert(row, oldRow, errors) { - row.status = row.status || 'draft' + if (row.requestId) { + row.requestId = row.requestId.toUpperCase(); + } +} + +function afterInsert(row, errors){ + afterUpsert(row, null, errors); +} + +function afterUpdate(row, oldRow, errors){ + afterUpsert(row, oldRow, errors); +} + +function afterUpsert(row, oldRow, errors) { + if (row.review) { + var requestId = row.requestId || oldRow.requestId + if (!requestId) { + console.error('No requestId for requestScore update') + console.error(row) + return + } - //TODO: check permissions + // Only perform this test the first time the review is added + if (!oldRow || !oldRow.review) { + triggerHelper.possiblySetRabComplete(requestId); + } + } } \ No newline at end of file diff --git a/mcc/resources/queries/mcc/requestScores.js b/mcc/resources/queries/mcc/requestScores.js index 2c6e7d6be..af4906f3f 100644 --- a/mcc/resources/queries/mcc/requestScores.js +++ b/mcc/resources/queries/mcc/requestScores.js @@ -3,23 +3,16 @@ var LABKEY = require("labkey"); var triggerHelper = new org.labkey.mcc.query.TriggerHelper(LABKEY.Security.currentUser.id, LABKEY.Security.currentContainer.id); -function afterInsert(row, errors){ - afterUpsert(row, null, errors); +function beforeInsert(row, errors){ + beforeUpsert(row, null, errors); } -function afterUpdate(row, oldRow, errors){ - afterUpsert(row, oldRow, errors); +function beforeUpdate(row, oldRow, errors){ + beforeUpsert(row, oldRow, errors); } -function afterUpsert(row, oldRow, errors) { - if (row.review) { - var requestId = row.requestId || oldRow.requestId - if (!requestId) { - console.error('No requestId for requestScore update') - console.error(row) - return - } - - triggerHelper.possiblySetRabComplete(requestId); +function beforeUpsert(row, oldRow, errors) { + if (row.requestId) { + row.requestId = row.requestId.toUpperCase(); } } \ No newline at end of file diff --git a/mcc/src/client/components/RequestUtils.tsx b/mcc/src/client/components/RequestUtils.tsx index ef89e5abe..ece52cde9 100644 --- a/mcc/src/client/components/RequestUtils.tsx +++ b/mcc/src/client/components/RequestUtils.tsx @@ -48,7 +48,7 @@ export class CoInvestigatorModel { firstname: string; middleinitial: string; institutionname: string; - uuid: string = uuidv4(); + uuid: string = uuidv4().toUpperCase(); } export class AnimalCohort { @@ -57,7 +57,7 @@ export class AnimalCohort { numberofanimals: number; sex: string; othercharacteristics: string; - uuid: string = uuidv4(); + uuid: string = uuidv4().toUpperCase(); } export async function queryRequestInformation(requestId, handleFailure) { @@ -65,7 +65,7 @@ export async function queryRequestInformation(requestId, handleFailure) { if (!requestId) { requestData.dataLoaded = true - requestData.request.objectid = requestData.request.objectid || uuidv4() + requestData.request.objectid = requestData.request.objectid || uuidv4().toUpperCase() requestData.request.status = 'Draft' requestData.cohorts = [new AnimalCohort()] @@ -137,7 +137,7 @@ export async function queryRequestInformation(requestId, handleFailure) { success: function (resp) { if (resp.rows.length) { // NOTE: this property is purely for client-side UI and not persisted in the DB, so create a value - resp.rows.map(c => c.uuid = uuidv4()) + resp.rows.map(c => c.uuid = uuidv4().toUpperCase()) } resolve(resp.rows) @@ -167,7 +167,7 @@ export async function queryRequestInformation(requestId, handleFailure) { requestData.cohorts = resp.rows // NOTE: this property is purely for client-side UI and not persisted in the DB, so create a value - requestData.cohorts.map(c => c.uuid = uuidv4()) + requestData.cohorts.map(c => c.uuid = uuidv4().toUpperCase()) } resolve(requestData.cohorts) From 54a15f42de96cd0074c984c03a464ff0d96303d2 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 11 May 2022 10:42:04 -0700 Subject: [PATCH 61/63] Fault tolerance for simple updates after the original submission where the incoming json lacks status --- mcc/resources/queries/mcc/animalRequests.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mcc/resources/queries/mcc/animalRequests.js b/mcc/resources/queries/mcc/animalRequests.js index c322ccf6d..d67674ccf 100644 --- a/mcc/resources/queries/mcc/animalRequests.js +++ b/mcc/resources/queries/mcc/animalRequests.js @@ -24,6 +24,10 @@ function beforeUpsert(row, oldRow, errors) { row.objectid = row.objectid.toUpperCase(); } + if (!row.status && oldRow) { + row.status = oldRow.status; + } + if (!row.status) { console.error('Request row being submitted without a status: ' + row.objectid) console.error(row) From 8f0c63b34e7b9654e1cbfe3ca62456253c6ac02e Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Wed, 11 May 2022 15:47:36 -0700 Subject: [PATCH 62/63] Extend MCC Test (#66) * Extend MCC Test --- mcc/src/org/labkey/mcc/query/TriggerHelper.java | 6 ++++-- mcc/test/src/org/labkey/test/tests/mcc/MccTest.java | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java index 84e1381a6..a40fb3d11 100644 --- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java +++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java @@ -232,12 +232,14 @@ public void possiblySetRabComplete(String requestId) Set<String> reviews = new HashSet<>(new TableSelector(ti, PageFlowUtil.set("review"), new SimpleFilter(FieldKey.fromString("requestId"), requestId), null).getArrayList(String.class)); if (!reviews.isEmpty() && !reviews.contains(null)) { TableInfo requestTable = MccSchema.getInstance().getSchema().getTable(MccSchema.TABLE_ANIMAL_REQUESTS); - int rowId = new TableSelector(requestTable, PageFlowUtil.set("rowid"), new SimpleFilter(FieldKey.fromString("requestId"), requestId), null).getObject(Integer.class); + int rowId = new TableSelector(requestTable, PageFlowUtil.set("rowid"), new SimpleFilter(FieldKey.fromString("objectid"), requestId), null).getObject(Integer.class); Map<String, Object> map = new HashMap<>(); map.put("rowid", rowId); map.put("status", MccManager.RequestStatus.PendingDecision.getLabel()); + map.put("modifiedby", _user.getUserId()); + map.put("modified", new Date()); - Table.update(_user, ti, map, rowId); + Table.update(_user, requestTable, map, rowId); } } } diff --git a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java index 3ed2ecafe..fc83863eb 100644 --- a/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java +++ b/mcc/test/src/org/labkey/test/tests/mcc/MccTest.java @@ -343,7 +343,12 @@ private void doRequestFormTest() throws Exception dr = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); Assert.assertEquals(dr.getDataRowCount(), 0); + beginAt("/mcc/" + getProjectName() + "/mccRequestAdmin.view"); + + // NOTE: since the last review was entered, this should update the status of the request + Assert.assertEquals("Pending Decision", getLastModifiedRequestRow().get("status")); + dataRegionName = getDataRegionName("webpartPending"); new DataRegionTable.DataRegionFinder(getDriver()).withName(dataRegionName).waitFor(); waitAndClickAndWait(Locator.tagWithText("a", "Enter Final Review")); @@ -449,6 +454,7 @@ private List<Map<String, Object>> getRequestRows() throws Exception sr.addSort(new Sort("modified", Sort.Direction.DESCENDING)); List<String> cols = new ArrayList<>(Arrays.stream(FORM_DATA).map(FormElement::getDatabaseFieldName).collect(Collectors.toList())); cols.add("objectid"); + cols.add("status"); cols.add("iacucprotocol"); sr.setColumns(cols); From 8cf8f48e6b90c38b6e3f2c5cbc74b1560e5ea7c0 Mon Sep 17 00:00:00 2001 From: bbimber <bbimber@gmail.com> Date: Thu, 12 May 2022 13:06:29 -0700 Subject: [PATCH 63/63] Introduce new more granular MCC permissions (#67) --- .../requestScores/Pending Decision.qview.xml | 8 ++ mcc/resources/views/mccAdmin.html | 69 +++++++--- mcc/resources/views/mccAdmin.view.xml | 6 +- mcc/resources/views/mccMenu.html | 122 +++++++++++++----- mcc/resources/views/nihReview.html | 29 +++++ mcc/resources/views/nihReview.view.xml | 11 ++ mcc/resources/views/rabRequestReview.html | 2 +- mcc/resources/web/mcc/Utils.js | 12 ++ mcc/src/org/labkey/mcc/MccController.java | 58 ++++++++- mcc/src/org/labkey/mcc/MccManager.java | 6 +- mcc/src/org/labkey/mcc/MccModule.java | 13 +- ...questScoreActionsDisplayColumnFactory.java | 21 ++- ...ssion.java => MccDataAdminPermission.java} | 4 +- .../labkey/mcc/security/MccDataAdminRole.java | 4 +- .../security/MccFinalReviewPermission.java | 11 ++ .../mcc/security/MccFinalReviewerRole.java | 21 +++ .../mcc/security/MccRabReviewPermission.java | 11 ++ .../mcc/security/MccRabReviewerRole.java | 21 +++ .../security/MccRequestAdminPermission.java | 3 - 19 files changed, 358 insertions(+), 74 deletions(-) create mode 100644 mcc/resources/queries/mcc/requestScores/Pending Decision.qview.xml create mode 100644 mcc/resources/views/nihReview.html create mode 100644 mcc/resources/views/nihReview.view.xml rename mcc/src/org/labkey/mcc/security/{MccDataPermission.java => MccDataAdminPermission.java} (68%) create mode 100644 mcc/src/org/labkey/mcc/security/MccFinalReviewPermission.java create mode 100644 mcc/src/org/labkey/mcc/security/MccFinalReviewerRole.java create mode 100644 mcc/src/org/labkey/mcc/security/MccRabReviewPermission.java create mode 100644 mcc/src/org/labkey/mcc/security/MccRabReviewerRole.java diff --git a/mcc/resources/queries/mcc/requestScores/Pending Decision.qview.xml b/mcc/resources/queries/mcc/requestScores/Pending Decision.qview.xml new file mode 100644 index 000000000..2732aa402 --- /dev/null +++ b/mcc/resources/queries/mcc/requestScores/Pending Decision.qview.xml @@ -0,0 +1,8 @@ +<customView xmlns="http://labkey.org/data/xml/queryCustomView" label="Pending Decision" canOverride="false"> + <filters> + <filter column="requestId/status" operator="eq" value="Pending Decision"/> + </filters> + <sorts> + <sort column="requestId/rowid" descending="true"/> + </sorts> +</customView> \ No newline at end of file diff --git a/mcc/resources/views/mccAdmin.html b/mcc/resources/views/mccAdmin.html index b79e1946c..f2a8f3472 100644 --- a/mcc/resources/views/mccAdmin.html +++ b/mcc/resources/views/mccAdmin.html @@ -1,37 +1,64 @@ <script type="text/javascript"> Ext4.onReady(function (){ - //TODO - if (LABKEY.Security.currentUser.isAdmin){ - var webpart = <%=webpartContext%>; + var webpart = <%=webpartContext%>; - var ctx = MCC.Utils.getMCCContext(webpart.wrapperDivId); - if(!ctx) - return; + var ctx = MCC.Utils.getMCCContext(webpart.wrapperDivId); + if(!ctx) + return; - Ext4.create('LDK.panel.NavPanel', { - renderTo: webpart.wrapperDivId, - width: 350, + Ext4.create('Ext.panel.Panel', { + renderTo: webpart.wrapperDivId, + border: false, + items: [{ + xtype: 'panel', + border: false, + defaults: { + border: false + }, + items: [{ + html: 'This page contains information related to the setup and administration of the MCC site.' + + '<p></p>' + + 'Below is a summary of the key user groups. Users can be added/removed from these groups to control permissions. <a href="' + LABKEY.ActionURL.buildURL('security', 'permissions.view', ctx.MCCRequestContainer, {t: 'sitegroups'}) + '">Admins can manage users by clicking here</a>.' + + '<p></p>' + + '<ul>' + + '<li>MCC Animal Data Access: Any user needing animal-level data access should be in this group.</li>' + + '<li>MCC Animal Requestors: Any user who will request MCC animals should be in this group.</li>' + + '<li>MCC RAB Members: This group is responsible for RAB reviews.</li>' + + '<li>MCC Final Reviewers: This group is authorized to enter the final approve/reject decision on requests.</li>' + + '<li>MCC Admins: This group should be very limited, including the MCC project manager(s) and other administrators.</li>' + + '</ul>' + }] + },{ + xtype: 'ldk-navpanel', + style: 'padding-top: 20px;', + border: false, sections: [ - {header: 'User/Request Management', + { + header: 'User/Request Management', items: [ - {name: 'View Pending User Requests', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests&viewName=Pending Requests'}, - {name: 'View All Users', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests'} + { + name: 'View Pending User Requests', + url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests&viewName=Pending Requests' + }, + { + name: 'View All Users', + url: '<%=contextPath%>' + ctx['MCCContainer'] + '/query-executeQuery.view?schemaName=mcc&queryName=userRequests' + } ] }, - {header: 'Configuration/Data Management', + { + header: 'Configuration/Data Management', items: [ - {name: 'Ensure Site Settings and Groups', url: '<%=contextPath%>' + ctx['MCCContainer'] + '/mcc-configureMcc.view'} + { + name: 'Ensure Site Settings and Groups', + url: '<%=contextPath%>' + ctx['MCCContainer'] + '/mcc-configureMcc.view' + } ] } - - ] - }); - } - else { - - } + }] + }); }); </script> \ No newline at end of file diff --git a/mcc/resources/views/mccAdmin.view.xml b/mcc/resources/views/mccAdmin.view.xml index bfd74bf17..d3a353e12 100644 --- a/mcc/resources/views/mccAdmin.view.xml +++ b/mcc/resources/views/mccAdmin.view.xml @@ -1,7 +1,7 @@ <view xmlns="http://labkey.org/data/xml/view" title="MCC Site Admin"> - <permissions> - <permission name="admin"/> - </permissions> + <permissionClasses> + <permissionClass name="org.labkey.mcc.security.MccDataAdminPermission"/> + </permissionClasses> <dependencies> <dependency path="mcc.context" /> </dependencies> diff --git a/mcc/resources/views/mccMenu.html b/mcc/resources/views/mccMenu.html index cb360b8a3..8627dd31e 100644 --- a/mcc/resources/views/mccMenu.html +++ b/mcc/resources/views/mccMenu.html @@ -17,16 +17,11 @@ if(!ctx) return; - var menuItems = [{ + var menuItemsData = [{ label: 'Site Home', name: 'siteHome', url: LABKEY.ActionURL.buildURL('project', 'begin', 'home'), visible: true - }, { - label: 'Animal Requests', - name: 'requests', - url: LABKEY.ActionURL.buildURL('mcc', 'mccRequests', ctx['MCCRequestContainer']), - visible: true }, { label: 'Animal Data', name: 'animalData', @@ -40,14 +35,41 @@ }]; if (MCC.Utils.isRequestAdmin()) { - menuItems.push({ + menuItemsData.push({ + label: 'MCC Site Admin', + name: 'siteAdmin', + url: LABKEY.ActionURL.buildURL('mcc', 'mccAdmin', ctx['MCCContainer']), + visible: true + }) + } + + var menuItemsRequest = [{ + label: 'Submit/Manage Requests', + name: 'requests', + url: LABKEY.ActionURL.buildURL('mcc', 'mccRequests', ctx['MCCRequestContainer']), + visible: true + }] + + if (MCC.Utils.hasRabPermission()) { + menuItemsRequest.push({ label: 'RAB Reviewer Dashboard', name: 'reviewerDashboard', url: LABKEY.ActionURL.buildURL('mcc', 'rabRequestReview', ctx['MCCRequestContainer']), visible: true }) + } + + if (MCC.Utils.hasFinalDecisionPermission()) { + menuItemsRequest.push({ + label: 'NIH Review Dashboard', + name: 'nihReview', + url: LABKEY.ActionURL.buildURL('mcc', 'nihReview', ctx['MCCRequestContainer']), + visible: true + }) + } - menuItems.push({ + if (MCC.Utils.isRequestAdmin()) { + menuItemsRequest.push({ label: 'Animal Request Administration', name: 'requestAdmin', url: LABKEY.ActionURL.buildURL('mcc', 'mccRequestAdmin', ctx['MCCRequestContainer']), @@ -55,37 +77,69 @@ }) } - var panel = Ext4.create('Ext.view.View', { - renderTo: div.id, - cls: 'labkey-iconpanel', - width: 300, - itemId: 'menuPanel', - style: { - padding: '10px' - }, - defaults: { - overItemCls: 'x4-item-over', - trackOver: true - }, - tpl: [ + var getTemplate = function(title) { + return [ + '<span style="font-weight: bold;height: auto;padding-bottom: 5px;">' + title + '</span>', '<tpl for=".">', '<tpl if="visible">', - '<div style="width: 300px;font-weight: bold;height: auto;" class="thumb-wrap thumb-wrap-side">', - '<a href="{url}">', - '<span style="text-align: left;font-weight: bold" class="thumb-label-side">{label:htmlEncode}</span>', - '</a>', - '</div>', + '<div style="width: 300px;font-weight: bold;height: auto;" class="thumb-wrap thumb-wrap-side">', + '<a href="{url}">', + '<span style="text-align: left;font-weight: bold" class="thumb-label-side">{label:htmlEncode}</span>', + '</a>', + '</div>', '</tpl>', '</tpl>', '<div class="x-clear"></div>' - ], - store: { - type: 'store', - fields: ['label', 'name', 'url', 'visible'], - data: menuItems - }, - border: true, - minHeight: 50 + ] + } + + Ext4.create('Ext.panel.Panel', { + renderTo: div.id, + cls: 'labkey-iconpanel', + style: 'padding: 10px;', + border: false, + width: 300, + itemId: 'menuPanel', + minHeight: 50, + items: [{ + xtype: 'panel', + border: false, + style: 'padding-bottom: 10px;', + items: [{ + xtype: 'dataview', + style: 'padding-left: 5px;', + overItemCls: 'x4-item-over', + trackOver: true, + itemSelector: 'div.thumb-wrap', + cls: 'labkey-iconpanel', + tpl: getTemplate('General Items:'), + border: false, + store: { + type: 'store', + fields: ['label', 'name', 'url', 'visible'], + data: menuItemsData + } + }] + },{ + xtype: 'panel', + border: false, + hidden: !menuItemsRequest.length, + items: [{ + xtype: 'dataview', + style: 'padding-left: 5px;', + overItemCls: 'x4-item-over', + trackOver: true, + itemSelector: 'div.thumb-wrap', + cls: 'labkey-iconpanel', + tpl: getTemplate('Animal Requests:'), + border: false, + store: { + type: 'store', + fields: ['label', 'name', 'url', 'visible'], + data: menuItemsRequest + } + }] + }] }); }); diff --git a/mcc/resources/views/nihReview.html b/mcc/resources/views/nihReview.html new file mode 100644 index 000000000..007019081 --- /dev/null +++ b/mcc/resources/views/nihReview.html @@ -0,0 +1,29 @@ +<script type="text/javascript"> + + Ext4.onReady(function(){ + var webpart = <%=webpartContext%>; + var ctx = MCC.Utils.getMCCContext(webpart.wrapperDivId); + if(!ctx) + return; + + Ext4.get(webpart.wrapperDivId).update( + 'Below are all MCC requests awaiting the final decision. By default this shows only pending requests; however, you can the left-hand \'Views\' button to toggle between this and all requests.' + + '<p></p>' + + '<a class="labkey-text-link" href="/become-a-user.html#request-animals">Click Here to View Documentation on the Request Process and Scoring Criteria</a>' + + '<br>' + + '<a class="labkey-text-link" href="<%=contextPath%>/mcc/img/mccRequest.png">Outline of Request Workflow</a>' + + '<p></p>' + + '<div id="' + webpart.wrapperDivId + '-webpartAssignments"></div>' + ); + + LDK.Utils.getBasicQWP({ + title: 'All Pending MCC Requests', + frame: 'left-nav', + schemaName: 'mcc', + queryName: 'requestScores', + viewName: 'Pending Decision', + showRecordSelectors: true, + showDetailsColumn: true + }).render(webpart.wrapperDivId + '-webpartAssignments'); + }); +</script> \ No newline at end of file diff --git a/mcc/resources/views/nihReview.view.xml b/mcc/resources/views/nihReview.view.xml new file mode 100644 index 000000000..02b85efcb --- /dev/null +++ b/mcc/resources/views/nihReview.view.xml @@ -0,0 +1,11 @@ +<view xmlns="http://labkey.org/data/xml/view" title="MCC NIH Review Dashboard"> + <permissionClasses> + <permissionClass name="org.labkey.mcc.security.MccFinalReviewPermission"/> + </permissionClasses> + <dependencies> + <dependency path="ldk.context" /> + <dependency path="mcc.context" /> + <dependency path="/ehr/stylesheet.css" /> + <dependency path="/mcc/utils.js" /> + </dependencies> +</view> \ No newline at end of file diff --git a/mcc/resources/views/rabRequestReview.html b/mcc/resources/views/rabRequestReview.html index 636ef9d76..459fbe186 100644 --- a/mcc/resources/views/rabRequestReview.html +++ b/mcc/resources/views/rabRequestReview.html @@ -7,7 +7,7 @@ return; Ext4.get(webpart.wrapperDivId).update( - 'Below are all pending and historic animal requests to MCC. You can use the edit link to view/update any request. You can also use the left-hand \'Views\' button to toggle between submitted requests, all requests, etc.' + + 'Below are all the MCC animal requests assigned to you for review. By default this shows only incomplete reviews; however, you can the left-hand \'Views\' button to toggle between pending assignments and assignment you previously completed.' + '<p></p>' + '<a class="labkey-text-link" href="/become-a-user.html#request-animals">Click Here to View Documentation on the Request Process and Scoring Criteria</a>' + '<br>' + diff --git a/mcc/resources/web/mcc/Utils.js b/mcc/resources/web/mcc/Utils.js index 35c447317..95636656b 100644 --- a/mcc/resources/web/mcc/Utils.js +++ b/mcc/resources/web/mcc/Utils.js @@ -39,6 +39,18 @@ MCC.Utils = new function() { var ctx = LABKEY.getModuleContext('mcc'); return !!ctx.hasRequestAdminPermission; + }, + + hasRabPermission: function(){ + var ctx = LABKEY.getModuleContext('mcc'); + + return !!ctx.hasRabPermission; + }, + + hasFinalDecisionPermission: function(){ + var ctx = LABKEY.getModuleContext('mcc'); + + return !!ctx.hasFinalDecisionPermission; } } }; \ No newline at end of file diff --git a/mcc/src/org/labkey/mcc/MccController.java b/mcc/src/org/labkey/mcc/MccController.java index cadbc6c33..b04bf782d 100644 --- a/mcc/src/org/labkey/mcc/MccController.java +++ b/mcc/src/org/labkey/mcc/MccController.java @@ -43,13 +43,16 @@ import org.labkey.api.security.Group; import org.labkey.api.security.GroupManager; import org.labkey.api.security.IgnoresTermsOfUse; +import org.labkey.api.security.MutableSecurityPolicy; import org.labkey.api.security.RequiresNoPermission; import org.labkey.api.security.RequiresPermission; import org.labkey.api.security.SecurityManager; +import org.labkey.api.security.SecurityPolicyManager; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; import org.labkey.api.security.ValidEmail; import org.labkey.api.security.permissions.AdminPermission; +import org.labkey.api.security.roles.RoleManager; import org.labkey.api.settings.AppProps; import org.labkey.api.settings.LookAndFeelProperties; import org.labkey.api.util.ConfigurationException; @@ -61,7 +64,11 @@ import org.labkey.api.util.URLHelper; import org.labkey.api.view.HtmlView; import org.labkey.mcc.etl.ZimsImportTask; +import org.labkey.mcc.security.MccDataAdminRole; +import org.labkey.mcc.security.MccFinalReviewerRole; +import org.labkey.mcc.security.MccRabReviewerRole; import org.labkey.mcc.security.MccRequestAdminPermission; +import org.labkey.mcc.security.MccRequesterRole; import org.labkey.security.xml.GroupEnumType; import org.springframework.validation.BindException; import org.springframework.validation.Errors; @@ -549,7 +556,7 @@ public ModelAndView getConfirmView(Object o, BindException errors) throws Except @Override public boolean handlePost(Object o, BindException errors) throws Exception { - for (String gn : Arrays.asList(MccManager.REQUEST_GROUP_NAME, MccManager.ANIMAL_GROUP_NAME, MccManager.REQUEST_REVIEW_GROUP_NAME)) + for (String gn : Arrays.asList(MccManager.REQUEST_GROUP_NAME, MccManager.ANIMAL_GROUP_NAME, MccManager.REQUEST_REVIEW_GROUP_NAME, MccManager.FINAL_REVIEW_GROUP_NAME, MccManager.ADMIN_GROUP_NAME)) { Group g1 = GroupManager.getGroup(ContainerManager.getRoot(), gn, GroupEnumType.SITE); if (g1 == null) @@ -558,6 +565,55 @@ public boolean handlePost(Object o, BindException errors) throws Exception } } + // Ensure groups have target roles: + Container requestContainer = MccManager.get().getMCCRequestContainer(); + if (requestContainer != null) + { + Group requestGroup = GroupManager.getGroup(ContainerManager.getRoot(), MccManager.REQUEST_GROUP_NAME, GroupEnumType.SITE); + if (!requestContainer.getPolicy().getAssignedRoles(requestGroup).contains(RoleManager.getRole(MccRequesterRole.class))) + { + MutableSecurityPolicy policy = new MutableSecurityPolicy(requestContainer.getPolicy()); + policy.addRoleAssignment(requestGroup, RoleManager.getRole(MccRequesterRole.class)); + SecurityPolicyManager.savePolicy(policy); + } + + Group reviewGroup = GroupManager.getGroup(ContainerManager.getRoot(), MccManager.REQUEST_REVIEW_GROUP_NAME, GroupEnumType.SITE); + if (!requestContainer.getPolicy().getAssignedRoles(reviewGroup).contains(RoleManager.getRole(MccRabReviewerRole.class))) + { + MutableSecurityPolicy policy = new MutableSecurityPolicy(requestContainer.getPolicy()); + policy.addRoleAssignment(reviewGroup, RoleManager.getRole(MccRabReviewerRole.class)); + SecurityPolicyManager.savePolicy(policy); + } + + Group finalGroup = GroupManager.getGroup(ContainerManager.getRoot(), MccManager.FINAL_REVIEW_GROUP_NAME, GroupEnumType.SITE); + if (!requestContainer.getPolicy().getAssignedRoles(finalGroup).contains(RoleManager.getRole(MccFinalReviewerRole.class))) + { + MutableSecurityPolicy policy = new MutableSecurityPolicy(requestContainer.getPolicy()); + policy.addRoleAssignment(finalGroup, RoleManager.getRole(MccFinalReviewerRole.class)); + SecurityPolicyManager.savePolicy(policy); + } + + Group adminGroup = GroupManager.getGroup(ContainerManager.getRoot(), MccManager.ADMIN_GROUP_NAME, GroupEnumType.SITE); + if (!requestContainer.getPolicy().getAssignedRoles(adminGroup).contains(RoleManager.getRole(MccDataAdminRole.class))) + { + MutableSecurityPolicy policy = new MutableSecurityPolicy(requestContainer.getPolicy()); + policy.addRoleAssignment(adminGroup, RoleManager.getRole(MccDataAdminRole.class)); + SecurityPolicyManager.savePolicy(policy); + } + } + + Container dataContainer = MccManager.get().getMCCContainer(); + if (dataContainer != null) + { + Group adminGroup = GroupManager.getGroup(ContainerManager.getRoot(), MccManager.ADMIN_GROUP_NAME, GroupEnumType.SITE); + if (!dataContainer.getPolicy().getAssignedRoles(adminGroup).contains(RoleManager.getRole(MccDataAdminRole.class))) + { + MutableSecurityPolicy policy = new MutableSecurityPolicy(dataContainer.getPolicy()); + policy.addRoleAssignment(adminGroup, RoleManager.getRole(MccDataAdminRole.class)); + SecurityPolicyManager.savePolicy(policy); + } + } + return true; } diff --git a/mcc/src/org/labkey/mcc/MccManager.java b/mcc/src/org/labkey/mcc/MccManager.java index 36e04e1e0..bb93b0f9a 100644 --- a/mcc/src/org/labkey/mcc/MccManager.java +++ b/mcc/src/org/labkey/mcc/MccManager.java @@ -31,6 +31,7 @@ import org.labkey.api.security.UserPrincipal; import org.labkey.api.security.ValidEmail; import org.labkey.api.security.permissions.Permission; +import org.labkey.mcc.security.MccFinalReviewPermission; import org.labkey.mcc.security.MccRequestAdminPermission; import org.labkey.mcc.security.MccRequestorPermission; @@ -49,8 +50,7 @@ public enum RequestStatus Submitted(2, "Submitted", MccRequestorPermission.class), FormCheck(3, "Internal Review", MccRequestAdminPermission.class), RabReview(4, "RAB Review", MccRequestAdminPermission.class), - PendingDecision(4, "Pending Decision", MccRequestAdminPermission.class), - FinalReview(5, "Final Review", MccRequestAdminPermission.class), + PendingDecision(5, "Pending Decision", MccFinalReviewPermission.class), Approved(6, "Approved", MccRequestAdminPermission.class), Rejected(7, "Rejected", MccRequestAdminPermission.class), Processing(8, "Processing", MccRequestAdminPermission.class), @@ -113,6 +113,8 @@ public static RequestStatus resolveStatus(String val) public static final String ANIMAL_GROUP_NAME = "MCC Animal Data Access"; public static final String REQUEST_GROUP_NAME = "MCC Animal Requestors"; public static final String REQUEST_REVIEW_GROUP_NAME = "MCC RAB Members"; + public static final String FINAL_REVIEW_GROUP_NAME = "MCC Final Reviewers"; + public static final String ADMIN_GROUP_NAME = "MCC Admins"; private static final MccManager _instance = new MccManager(); diff --git a/mcc/src/org/labkey/mcc/MccModule.java b/mcc/src/org/labkey/mcc/MccModule.java index f495887cb..74756b054 100644 --- a/mcc/src/org/labkey/mcc/MccModule.java +++ b/mcc/src/org/labkey/mcc/MccModule.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import org.labkey.api.data.Container; import org.labkey.api.ehr.EHRService; import org.labkey.api.ldk.ExtendedSimpleModule; import org.labkey.api.ldk.LDKService; @@ -32,6 +33,10 @@ import org.labkey.mcc.query.MccEhrCustomizer; import org.labkey.mcc.query.ReviewerNotifyButton; import org.labkey.mcc.security.MccDataAdminRole; +import org.labkey.mcc.security.MccFinalReviewPermission; +import org.labkey.mcc.security.MccFinalReviewerRole; +import org.labkey.mcc.security.MccRabReviewPermission; +import org.labkey.mcc.security.MccRabReviewerRole; import org.labkey.mcc.security.MccRequestAdminPermission; import org.labkey.mcc.security.MccRequesterRole; @@ -75,6 +80,8 @@ protected void init() RoleManager.registerRole(new MccRequesterRole()); RoleManager.registerRole(new MccDataAdminRole()); + RoleManager.registerRole(new MccRabReviewerRole()); + RoleManager.registerRole(new MccFinalReviewerRole()); } @NotNull @@ -82,7 +89,11 @@ protected void init() public JSONObject getPageContextJson(ContainerUser context) { JSONObject ret = super.getPageContextJson(context); - ret.put("hasRequestAdminPermission", context.getContainer().hasPermission(context.getUser(), MccRequestAdminPermission.class)); + + Container requestContainer = MccManager.get().getMCCRequestContainer(); + ret.put("hasRequestAdminPermission", requestContainer != null && requestContainer.hasPermission(context.getUser(), MccRequestAdminPermission.class)); + ret.put("hasRabPermission", requestContainer != null && requestContainer.hasPermission(context.getUser(), MccRabReviewPermission.class)); + ret.put("hasFinalDecisionPermission", requestContainer != null && requestContainer.hasPermission(context.getUser(), MccFinalReviewPermission.class)); return ret; } diff --git a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java index 2278d45dc..5e9688bb3 100644 --- a/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java +++ b/mcc/src/org/labkey/mcc/query/RequestScoreActionsDisplayColumnFactory.java @@ -15,6 +15,8 @@ import org.labkey.api.security.UserManager; import org.labkey.api.view.template.ClientDependency; import org.labkey.mcc.MccManager; +import org.labkey.mcc.security.MccFinalReviewPermission; +import org.labkey.mcc.security.MccRequestAdminPermission; import java.io.IOException; import java.io.Writer; @@ -67,19 +69,28 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep if (st == MccManager.RequestStatus.Submitted) { - DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=primaryReview", requestContainer); - out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter MCC Internal Review</a>"); + if (requestContainer.hasPermission(ctx.getViewContext().getUser(), MccRequestAdminPermission.class)) + { + DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=primaryReview", requestContainer); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter MCC Internal Review</a>"); + } } else if (st == MccManager.RequestStatus.FormCheck) { - out.write("<br><a class=\"labkey-text-link\" href=\"javascript:void(0)\">Submit For RAB Review</a>"); + if (requestContainer.hasPermission(ctx.getViewContext().getUser(), MccRequestAdminPermission.class)) + { + out.write("<br><a class=\"labkey-text-link\" href=\"javascript:void(0)\">Submit For RAB Review</a>"); + } } else if (st == MccManager.RequestStatus.PendingDecision || (st == MccManager.RequestStatus.RabReview && ctx.get(FieldKey.fromString("pendingRabReviews"), Integer.class) == 0) ) { - DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); - out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); + if (requestContainer.hasPermission(ctx.getViewContext().getUser(), MccFinalReviewPermission.class)) + { + DetailsURL url = DetailsURL.fromString("/mcc/requestReview.view?requestId=" + requestId + "&mode=finalReview", requestContainer); + out.write("<br><a class=\"labkey-text-link\" href=\"" + url.getActionURL().addReturnURL(ctx.getViewContext().getActionURL()) + "\">Enter Final Review</a>"); + } } else if (st == MccManager.RequestStatus.Approved) { diff --git a/mcc/src/org/labkey/mcc/security/MccDataPermission.java b/mcc/src/org/labkey/mcc/security/MccDataAdminPermission.java similarity index 68% rename from mcc/src/org/labkey/mcc/security/MccDataPermission.java rename to mcc/src/org/labkey/mcc/security/MccDataAdminPermission.java index caa833ba4..69e421aed 100644 --- a/mcc/src/org/labkey/mcc/security/MccDataPermission.java +++ b/mcc/src/org/labkey/mcc/security/MccDataAdminPermission.java @@ -2,9 +2,9 @@ import org.labkey.api.security.permissions.AbstractPermission; -public class MccDataPermission extends AbstractPermission +public class MccDataAdminPermission extends AbstractPermission { - public MccDataPermission() + public MccDataAdminPermission() { super("MccDataAdmin", "This permission allows the user to administer animal data in the MCC"); } diff --git a/mcc/src/org/labkey/mcc/security/MccDataAdminRole.java b/mcc/src/org/labkey/mcc/security/MccDataAdminRole.java index 8d992ca22..c3f68a4e3 100644 --- a/mcc/src/org/labkey/mcc/security/MccDataAdminRole.java +++ b/mcc/src/org/labkey/mcc/security/MccDataAdminRole.java @@ -1,14 +1,16 @@ package org.labkey.mcc.security; import org.jetbrains.annotations.NotNull; +import org.labkey.api.security.permissions.InsertPermission; import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.security.permissions.UpdatePermission; import org.labkey.api.security.roles.AbstractRole; public class MccDataAdminRole extends AbstractRole { public MccDataAdminRole() { - super("MccDataAdmin", "These users can administer data and animal requests", ReadPermission.class, MccRequestorPermission.class, MccDataPermission.class, MccRequestAdminPermission.class); + super("MccDataAdmin", "These users can administer data and animal requests", ReadPermission.class, InsertPermission.class, UpdatePermission.class, MccRequestorPermission.class, MccDataAdminPermission.class, MccRequestAdminPermission.class); } @Override diff --git a/mcc/src/org/labkey/mcc/security/MccFinalReviewPermission.java b/mcc/src/org/labkey/mcc/security/MccFinalReviewPermission.java new file mode 100644 index 000000000..52f5f7243 --- /dev/null +++ b/mcc/src/org/labkey/mcc/security/MccFinalReviewPermission.java @@ -0,0 +1,11 @@ +package org.labkey.mcc.security; + +import org.labkey.api.security.permissions.AbstractPermission; + +public class MccFinalReviewPermission extends AbstractPermission +{ + public MccFinalReviewPermission() + { + super("MccFinalReview", "This permission is required to enter the final decision on animal requests in the MCC"); + } +} diff --git a/mcc/src/org/labkey/mcc/security/MccFinalReviewerRole.java b/mcc/src/org/labkey/mcc/security/MccFinalReviewerRole.java new file mode 100644 index 000000000..99048ea92 --- /dev/null +++ b/mcc/src/org/labkey/mcc/security/MccFinalReviewerRole.java @@ -0,0 +1,21 @@ +package org.labkey.mcc.security; + +import org.jetbrains.annotations.NotNull; +import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.security.permissions.UpdatePermission; +import org.labkey.api.security.roles.AbstractRole; + +public class MccFinalReviewerRole extends AbstractRole +{ + public MccFinalReviewerRole() + { + super("MccFinalReviewer", "These users can enter the final reviews for MCC requests", ReadPermission.class, InsertPermission.class, UpdatePermission.class, MccRequestorPermission.class, MccRabReviewPermission.class, MccFinalReviewPermission.class); + } + + @Override + public @NotNull String getDisplayName() + { + return "MCC Final Reviewer"; + } +} diff --git a/mcc/src/org/labkey/mcc/security/MccRabReviewPermission.java b/mcc/src/org/labkey/mcc/security/MccRabReviewPermission.java new file mode 100644 index 000000000..ae97e9e31 --- /dev/null +++ b/mcc/src/org/labkey/mcc/security/MccRabReviewPermission.java @@ -0,0 +1,11 @@ +package org.labkey.mcc.security; + +import org.labkey.api.security.permissions.AbstractPermission; + +public class MccRabReviewPermission extends AbstractPermission +{ + public MccRabReviewPermission() + { + super("MccRabReview", "This permission allows the user to perform tasked related to RAB review in the MCC"); + } +} diff --git a/mcc/src/org/labkey/mcc/security/MccRabReviewerRole.java b/mcc/src/org/labkey/mcc/security/MccRabReviewerRole.java new file mode 100644 index 000000000..0e3a22ad4 --- /dev/null +++ b/mcc/src/org/labkey/mcc/security/MccRabReviewerRole.java @@ -0,0 +1,21 @@ +package org.labkey.mcc.security; + +import org.jetbrains.annotations.NotNull; +import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.security.permissions.ReadPermission; +import org.labkey.api.security.permissions.UpdatePermission; +import org.labkey.api.security.roles.AbstractRole; + +public class MccRabReviewerRole extends AbstractRole +{ + public MccRabReviewerRole() + { + super("MccRabReviewer", "These users can enter RAB reviews", ReadPermission.class, InsertPermission.class, UpdatePermission.class, MccRequestorPermission.class, MccRabReviewPermission.class); + } + + @Override + public @NotNull String getDisplayName() + { + return "MCC RAB Reviewer"; + } +} diff --git a/mcc/src/org/labkey/mcc/security/MccRequestAdminPermission.java b/mcc/src/org/labkey/mcc/security/MccRequestAdminPermission.java index 559d02c31..fa2ce3c84 100644 --- a/mcc/src/org/labkey/mcc/security/MccRequestAdminPermission.java +++ b/mcc/src/org/labkey/mcc/security/MccRequestAdminPermission.java @@ -1,10 +1,7 @@ package org.labkey.mcc.security; -import org.jetbrains.annotations.NotNull; import org.labkey.api.security.permissions.AbstractPermission; -import java.util.Collection; - public class MccRequestAdminPermission extends AbstractPermission { public MccRequestAdminPermission()