From ca520a11c0aabb98e5bc2297cb390308390ee31a Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 23 Mar 2021 21:23:02 +0100 Subject: [PATCH] Controller Categorization Authoring Step --- .../documents/CategorizationStep.java | 295 ++++++++++++++++++ .../documents/CategorizationTree.java | 54 ++++ .../documents/CategorizationTreeNode.java | 112 +++++++ .../DefaultAuthoringStepConstants.java | 22 ++ .../ui/DefaultAuthoringStepsBundle.properties | 1 + .../DefaultAuthoringStepsBundle_de.properties | 1 + ccm-pagemodelseditor/package-lock.json | 178 +++++------ 7 files changed, 574 insertions(+), 89 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTree.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTreeNode.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DefaultAuthoringStepConstants.java create mode 100644 ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties create mode 100644 ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationStep.java new file mode 100644 index 000000000..94713ee8c --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationStep.java @@ -0,0 +1,295 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections.documents; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryManager; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.categorization.Domain; +import org.libreccm.categorization.DomainOwnership; +import org.libreccm.categorization.ObjectNotAssignedToCategoryException; +import org.libreccm.core.UnexpectedErrorException; +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemManager; +import org.librecms.contentsection.ContentSection; + +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/") +@AuthoringStepPathFragment(CategorizationStep.PATH_FRAGMENT) +@Named("CmsCategorizationStep") +public class CategorizationStep implements MvcAuthoringStep { + + static final String PATH_FRAGMENT = "categorization"; + + @Inject + private CategoryManager categoryManager; + + @Inject + private CategoryRepository categoryRepo; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private ContentItemManager itemManager; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private Models models; + + private ContentSection section; + + private ContentItem document; + + @Override + public Class supportedDocumentType() { + return ContentItem.class; + } + + @Override + public String getLabel() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("authoringsteps.categorization.label"); + } + + @Override + public String getDescription() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("authoringsteps.categorization.description"); + } + + @Override + public String getBundle() { + return DefaultAuthoringStepConstants.BUNDLE; + } + + @Override + public ContentSection getContentSection() { + return section; + } + + @Override + public void setContentSection(final ContentSection section) { + this.section = section; + } + + @Override + public String getContentSectionLabel() { + return section.getLabel(); + } + + @Override + public String getContentSectionTitle() { + return globalizationHelper + .getValueFromLocalizedString(section.getTitle()); + } + + @Override + public ContentItem getContentItem() { + return document; + } + + @Override + public void setContentItem(final ContentItem document) { + this.document = document; + } + + @Override + public String getContentItemPath() { + return itemManager.getItemPath(document); + } + + @Override + public String getContentItemTitle() { + return globalizationHelper + .getValueFromLocalizedString(document.getTitle()); + } + + @Override + public String showStep() { + return "org/librecms/ui/contenttypes/categorization.xhtml"; + } + + @Transactional(Transactional.TxType.REQUIRED) + public List getCategorizationTrees() { + return section + .getDomains() + .stream() + .map(DomainOwnership::getDomain) + .map(this::buildCategorizationTree) + .collect(Collectors.toList()); + } + + @POST + @Path("/{domainIdentifier}") + @Transactional(Transactional.TxType.REQUIRED) + public String updateCategorization( + @PathParam("domainIdentifierParam") final String domainIdentifierParam, + @FormParam("assignedCategories") + final Set assignedCategoriesParam + ) { + final Identifier domainIdentifier = identifierParser.parseIdentifier( + domainIdentifierParam + ); + final Optional domainResult; + switch (domainIdentifier.getType()) { + case ID: + domainResult = section + .getDomains() + .stream() + .map(DomainOwnership::getDomain) + .filter( + domain -> domain.getObjectId() == Long + .parseLong(domainIdentifier.getIdentifier()) + ).findAny(); + break; + case UUID: + domainResult = section + .getDomains() + .stream() + .map(DomainOwnership::getDomain) + .filter( + domain -> domain.getUuid().equals( + domainIdentifier.getIdentifier() + ) + ).findAny(); + break; + default: + domainResult = section + .getDomains() + .stream() + .map(DomainOwnership::getDomain) + .filter( + domain -> domain.getDomainKey().equals( + domainIdentifier.getIdentifier() + ) + ).findAny(); + } + + if (!domainResult.isPresent()) { + models.put("section", section.getLabel()); + models.put("domainIdentifier", domainIdentifierParam); + return "org/librecms/ui/contenttypes/categorization-domain-not-found.xhtml"; + } + + final Domain domain = domainResult.get(); + updateAssignedCategories(domain.getRoot(), assignedCategoriesParam); + + return String.format( + "/%s@documents/%s/@authoringsteps/%s", + section.getLabel(), + getContentItemPath(), + PATH_FRAGMENT + ); + } + + private void updateAssignedCategories( + final Category category, + final Set assignedCategoriesParam + ) { + if (assignedCategoriesParam.contains(category.getUuid()) + && !categoryManager.isAssignedToCategory(category, document)) { + categoryManager.addObjectToCategory(document, category); + } + + try { + if (!assignedCategoriesParam.contains(category.getUuid()) + && categoryManager.isAssignedToCategory(category, document)) { + categoryManager.removeObjectFromCategory(document, category); + } + } catch (ObjectNotAssignedToCategoryException ex) { + throw new UnexpectedErrorException(ex); + } + } + + private CategorizationTree buildCategorizationTree(final Domain domain) { + final CategorizationTree tree = new CategorizationTree(); + tree.setDomainDescription( + globalizationHelper.getValueFromLocalizedString( + domain.getDescription() + ) + ); + tree.setDomainKey(domain.getDomainKey()); + tree.setDomainTitle( + globalizationHelper.getValueFromLocalizedString( + domain.getTitle()) + ); + tree.setRoot(buildCategorizationTreeNode(domain.getRoot())); + + return tree; + } + + private CategorizationTreeNode buildCategorizationTreeNode( + final Category category + ) { + final CategorizationTreeNode node = new CategorizationTreeNode(); + node.setAssigned(categoryManager.isAssignedToCategory( + category, document) + ); + node.setCategoryId(category.getObjectId()); + node.setCategoryName(category.getName()); + node.setCategoryUuid(category.getUuid()); + node.setDescription( + globalizationHelper.getValueFromLocalizedString( + category.getDescription() + ) + ); + node.setSubCategories( + category + .getSubCategories() + .stream() + .map(this::buildCategorizationTreeNode) + .collect(Collectors.toList()) + ); + node.setSubCategoryAssigned( + category + .getSubCategories() + .stream() + .allMatch( + subCat -> categoryManager.isAssignedToCategory( + subCat, document + ) + ) + ); + node.setTitle( + globalizationHelper.getValueFromLocalizedString( + category.getTitle() + ) + ); + node.setUniqueId(category.getUniqueId()); + + return node; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTree.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTree.java new file mode 100644 index 000000000..7d487f6f1 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTree.java @@ -0,0 +1,54 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections.documents; + +/** + * + * @author Jens Pelzetter + */ +public class CategorizationTree { + + private String domainKey; + + private String domainTitle; + + private String domainDescription; + + private CategorizationTreeNode root; + + public String getDomainKey() { + return domainKey; + } + + public void setDomainKey(final String domainKey) { + this.domainKey = domainKey; + } + + public String getDomainTitle() { + return domainTitle; + } + + public void setDomainTitle(final String domainTitle) { + this.domainTitle = domainTitle; + } + + public String getDomainDescription() { + return domainDescription; + } + + public void setDomainDescription(final String domainDescription) { + this.domainDescription = domainDescription; + } + + public CategorizationTreeNode getRoot() { + return root; + } + + public void setRoot(final CategorizationTreeNode root) { + this.root = root; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTreeNode.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTreeNode.java new file mode 100644 index 000000000..b764a1587 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CategorizationTreeNode.java @@ -0,0 +1,112 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections.documents; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Jens Pelzetter + */ +public class CategorizationTreeNode { + + private long categoryId; + + private String categoryUuid; + + private String uniqueId; + + private String categoryName; + + private String title; + + private String description; + + private boolean assigned; + + private boolean subCategoryAssigned; + + private List subCategories; + + public long getCategoryId() { + return categoryId; + } + + public void setCategoryId(final long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryUuid() { + return categoryUuid; + } + + public void setCategoryUuid(final String categoryUuid) { + this.categoryUuid = categoryUuid; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(final String uniqueId) { + this.uniqueId = uniqueId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(final String categoryName) { + this.categoryName = categoryName; + } + + public String getTitle() { + return title; + } + + public void setTitle(final String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public boolean isAssigned() { + return assigned; + } + + public void setAssigned(final boolean assigned) { + this.assigned = assigned; + } + + public boolean isSubCategoryAssigned() { + return subCategoryAssigned; + } + + public void setSubCategoryAssigned(final boolean subCategoryAssigned) { + this.subCategoryAssigned = subCategoryAssigned; + } + + public List getSubCategories() { + return Collections.unmodifiableList(subCategories); + } + + public void setSubCategories( + final List subCategories + ) { + this.subCategories = new ArrayList<>(subCategories); + } + + + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DefaultAuthoringStepConstants.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DefaultAuthoringStepConstants.java new file mode 100644 index 000000000..76eba4a22 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DefaultAuthoringStepConstants.java @@ -0,0 +1,22 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections.documents; + +/** + * + * @author Jens Pelzetter + */ +public final class DefaultAuthoringStepConstants { + + private DefaultAuthoringStepConstants() { + + } + + + public static final String BUNDLE + = "org.libreccms.ui.DefaultAuthoringStepsBundle"; + +} diff --git a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties @@ -0,0 +1 @@ + diff --git a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties @@ -0,0 +1 @@ + diff --git a/ccm-pagemodelseditor/package-lock.json b/ccm-pagemodelseditor/package-lock.json index 3fc7e615e..77ec6e01f 100644 --- a/ccm-pagemodelseditor/package-lock.json +++ b/ccm-pagemodelseditor/package-lock.json @@ -16,7 +16,7 @@ "integrity": "sha512-mOrlCEdwX3seT3n0AXNt4KNPAZZxcsABUHwBgFXOt+nvFUXkxCAO6UBJHPrDxWEa2KDMil86355fjo8jbZ+K0Q==", "dev": true, "requires": { - "@types/react": "*" + "@types/react": "16.4.11" } }, "@types/react": { @@ -25,8 +25,8 @@ "integrity": "sha512-1DQnmwO8u8N3ucvRX2ZLDEjQ2VctkAvL/rpbm2ev4uaZA0z4ysU+I0tk+K8ZLblC6p7MCgFyF+cQlSNIPUHzeQ==", "dev": true, "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" + "@types/prop-types": "15.5.5", + "csstype": "2.5.6" } }, "@types/react-dom": { @@ -35,8 +35,8 @@ "integrity": "sha512-vaq4vMaJOaNgFff1t3LnHYr6vRa09vRspMkmLdXtFZmO1fwDI2snP+dpOkwrtlU8UC8qsqemCu4RmVM2OLq/fA==", "dev": true, "requires": { - "@types/node": "*", - "@types/react": "*" + "@types/node": "10.7.1", + "@types/react": "16.4.11" } }, "@types/react-modal": { @@ -45,7 +45,7 @@ "integrity": "sha512-EhRC3xjsehC0e8OKz/NmEyjc/ggHxVj4rNu8p/AfSohbn5NHY0V58fj0OZgQPZzXY42v+rLxiO7PL1uOeBfimg==", "dev": true, "requires": { - "@types/react": "*" + "@types/react": "16.4.11" } }, "ansi-regex": { @@ -66,7 +66,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "asap": { @@ -80,9 +80,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { "chalk": { @@ -91,11 +91,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "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": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } } } @@ -112,7 +112,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -128,9 +128,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" }, "dependencies": { "ansi-styles": { @@ -139,7 +139,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.2" } }, "supports-color": { @@ -148,7 +148,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -202,7 +202,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" } }, "escape-string-regexp": { @@ -233,13 +233,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.18" } }, "fs.realpath": { @@ -254,12 +254,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-ansi": { @@ -268,7 +268,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -287,7 +287,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "inflight": { @@ -296,8 +296,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -311,7 +311,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "is-stream": { @@ -324,8 +324,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" } }, "js-tokens": { @@ -339,8 +339,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "lodash": { @@ -358,7 +358,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "minimatch": { @@ -367,7 +367,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "node-fetch": { @@ -375,8 +375,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "encoding": "0.1.12", + "is-stream": "1.1.0" } }, "object-assign": { @@ -390,7 +390,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "path-is-absolute": { @@ -410,7 +410,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "prop-types": { @@ -418,9 +418,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "react": { @@ -428,10 +428,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.4.2.tgz", "integrity": "sha512-dMv7YrbxO4y2aqnvA7f/ik9ibeLSHQJTI6TrYAenPSaQ6OXfb+Oti+oJiy8WBxgRzlKatYqtCjphTgDSCEiWFg==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.1" } }, "react-dom": { @@ -439,10 +439,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz", "integrity": "sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.1" } }, "react-lifecycles-compat": { @@ -455,10 +455,10 @@ "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.5.1.tgz", "integrity": "sha512-GxL7ycOgKC+p641cR+V1bw5dC1faL2N86/AJlzbMVmvt1totoylgkJmn9zvLuHeuarGbB7CLfHMGpeRowaj2jQ==", "requires": { - "exenv": "^1.2.0", - "prop-types": "^15.5.10", - "react-lifecycles-compat": "^3.0.0", - "warning": "^3.0.0" + "exenv": "1.2.2", + "prop-types": "15.6.1", + "react-lifecycles-compat": "3.0.4", + "warning": "3.0.0" } }, "react-redux": { @@ -466,12 +466,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" + "hoist-non-react-statics": "2.5.5", + "invariant": "2.2.4", + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" } }, "redux": { @@ -479,8 +479,8 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", "integrity": "sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA==", "requires": { - "loose-envify": "^1.1.0", - "symbol-observable": "^1.2.0" + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" } }, "resolve": { @@ -489,7 +489,7 @@ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.6" } }, "safer-buffer": { @@ -520,7 +520,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -546,18 +546,18 @@ "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.17.1", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.12.0", + "minimatch": "3.0.4", + "resolve": "1.8.1", + "semver": "5.5.0", + "tslib": "1.9.3", + "tsutils": "2.29.0" } }, "tsutils": { @@ -566,7 +566,7 @@ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { - "tslib": "^1.8.1" + "tslib": "1.9.3" } }, "typescript": { @@ -585,7 +585,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "whatwg-fetch": {