diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml b/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml index d4a94d9fc0..fe804f3261 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml @@ -16,6 +16,20 @@ on: - 'staticwebapp.config.json' - 'README.md' workflow_dispatch: + inputs: + ref: + description: Branch or tag or SHA to publish + required: false + version: + description: 'Version to publish' + required: false + tag: + description: 'Tag to publish' + required: false + type: choice + options: + - 'next' + - 'latest' env: NODE_OPTIONS: --max-old-space-size=16384 @@ -29,6 +43,8 @@ jobs: cancel-in-progress: true steps: - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref }} - uses: actions/setup-node@v3 with: node-version: 18 @@ -37,11 +53,30 @@ jobs: scope: '@umbraco-cms' - run: npm ci - run: npm run build:for:npm - - name: Version and publish + - name: Calculate version + run: | + if [ -z "${{inputs.version}}" ]; then + echo "No version input, calculating version from package.json" + SHA_SHORT=$(echo $GITHUB_SHA | cut -c1-8) + VERSION=$(node -p "require('./package.json').version")-$SHA_SHORT + echo "Version: $VERSION" + echo "BACKOFFICE_VERSION=$VERSION" >> "$GITHUB_ENV" + else + echo "Version input found, using ${{inputs.version}}" + echo "BACKOFFICE_VERSION=${{inputs.version}}" >> "$GITHUB_ENV" + fi + - name: Publish run: | - SHA_SHORT=$(echo $GITHUB_SHA | cut -c1-8) npm whoami - npm version 14.0.0-$SHA_SHORT --allow-same-version --no-git-tag-version - npm publish --tag next --access public + npm version $BACKOFFICE_VERSION --allow-same-version --no-git-tag-version + npm publish --tag $BACKOFFICE_NPM_TAG --access public + echo "### Published new version of @umbraco-cms/backoffice to npm! :rocket:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "- Version: $BACKOFFICE_VERSION" >> $GITHUB_STEP_SUMMARY + echo "- Tag: $BACKOFFICE_NPM_TAG" >> $GITHUB_STEP_SUMMARY + echo "- Commit: $GITHUB_SHA" >> $GITHUB_STEP_SUMMARY + echo "- Commit message: $GITHUB_SHA_MESSAGE" >> $GITHUB_STEP_SUMMARY + echo "- Commit date: $GITHUB_SHA_DATE" >> $GITHUB_STEP_SUMMARY env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + BACKOFFICE_NPM_TAG: ${{ inputs.tag || 'next' }} diff --git a/src/Umbraco.Web.UI.Client/.npmrc b/src/Umbraco.Web.UI.Client/.npmrc index 521a9f7c07..d4f5d5ff86 100644 --- a/src/Umbraco.Web.UI.Client/.npmrc +++ b/src/Umbraco.Web.UI.Client/.npmrc @@ -1 +1,2 @@ +@umbraco-cms:registry=https://registry.npmjs.org legacy-peer-deps=true diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 25177c0562..bd52d7f096 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1,12 +1,12 @@ { "name": "@umbraco-cms/backoffice", - "version": "14.0.0--preview003", + "version": "14.0.0--preview004", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@umbraco-cms/backoffice", - "version": "14.0.0--preview003", + "version": "14.0.0--preview004", "license": "MIT", "dependencies": { "@openid/appauth": "^1.3.1", @@ -17,7 +17,7 @@ "lodash-es": "4.17.21", "monaco-editor": "^0.41.0", "rxjs": "^7.8.1", - "tinymce": "^6.6.1", + "tinymce": "^6.7.0", "tinymce-i18n": "^23.8.7", "uuid": "^9.0.0" }, @@ -26,16 +26,16 @@ "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", - "@rollup/plugin-commonjs": "^25.0.3", + "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.1.0", - "@storybook/addon-a11y": "7.2.1", - "@storybook/addon-actions": "7.2.1", - "@storybook/addon-essentials": "7.2.1", - "@storybook/addon-links": "7.2.1", + "@rollup/plugin-node-resolve": "^15.2.1", + "@storybook/addon-a11y": "7.4.5", + "@storybook/addon-actions": "7.4.5", + "@storybook/addon-essentials": "7.4.5", + "@storybook/addon-links": "7.4.5", "@storybook/mdx2-csf": "^1.1.0", - "@storybook/web-components": "7.2.1", - "@storybook/web-components-vite": "7.2.1", + "@storybook/web-components": "7.4.5", + "@storybook/web-components-vite": "7.4.5", "@types/chai": "^4.3.5", "@types/lodash-es": "^4.17.8", "@types/mocha": "^10.0.1", @@ -54,7 +54,7 @@ "eslint-plugin-lit": "^1.8.3", "eslint-plugin-lit-a11y": "^4.1.0", "eslint-plugin-local-rules": "^1.3.2", - "eslint-plugin-storybook": "^0.6.13", + "eslint-plugin-storybook": "^0.6.14", "eslint-plugin-wc": "^1.5.0", "msw": "^1.2.3", "openapi-typescript-codegen": "^0.25.0", @@ -67,9 +67,9 @@ "rollup": "^3.27.2", "rollup-plugin-dts": "^5.3.1", "rollup-plugin-esbuild": "^5.0.0", - "rollup-plugin-import-css": "^3.3.1", + "rollup-plugin-import-css": "^3.3.4", "rollup-plugin-web-worker-loader": "^1.6.1", - "storybook": "7.2.1", + "storybook": "7.4.5", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.7", "typescript": "^5.1.6", @@ -184,9 +184,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -250,12 +250,12 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -278,15 +278,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -301,9 +301,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -334,9 +334,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -368,12 +368,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -392,16 +392,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -432,14 +432,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -449,13 +449,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -511,9 +511,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -529,14 +529,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" @@ -583,9 +583,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -598,14 +598,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -618,6 +618,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -634,6 +635,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -650,6 +652,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -971,9 +974,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -1021,9 +1024,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1052,12 +1055,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1069,18 +1072,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1108,9 +1111,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1154,9 +1157,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1186,9 +1189,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1218,9 +1221,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1250,9 +1253,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1281,9 +1284,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1312,12 +1315,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1328,12 +1331,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1345,15 +1348,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1410,9 +1413,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1426,9 +1429,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1442,16 +1445,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1477,9 +1480,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1493,9 +1496,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1510,9 +1513,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1541,13 +1544,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1681,13 +1684,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", - "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -1762,17 +1765,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", - "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", + "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", + "@babel/compat-data": "^7.22.20", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1793,41 +1796,41 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-block-scoping": "^7.22.15", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-destructuring": "^7.22.15", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.10", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", @@ -1841,7 +1844,7 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.19", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-regenerator": "^0.5.2", @@ -1856,13 +1859,13 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz", - "integrity": "sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz", + "integrity": "sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-flow-strip-types": "^7.22.5" }, "engines": { @@ -1887,16 +1890,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", - "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-typescript": "^7.22.5" + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1906,9 +1909,9 @@ } }, "node_modules/@babel/register": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz", - "integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", + "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2087,13 +2090,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2619,31 +2622,31 @@ "dev": true }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -2651,9 +2654,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "dev": true }, "node_modules/@humanwhocodes/config-array": { @@ -2878,9 +2881,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -2890,22 +2893,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2974,12 +2977,12 @@ } }, "node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -3715,6 +3718,38 @@ } } }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-select": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", @@ -3759,6 +3794,30 @@ } } }, + "node_modules/@radix-ui/react-separator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", + "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", @@ -3778,6 +3837,92 @@ } } }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", + "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", + "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-toggle": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", + "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-separator": "1.0.3", + "@radix-ui/react-toggle-group": "1.0.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", @@ -3942,9 +4087,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.3.tgz", - "integrity": "sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA==", + "version": "25.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz", + "integrity": "sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -3987,9 +4132,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", - "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz", + "integrity": "sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -4012,9 +4157,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", + "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4040,21 +4185,21 @@ "dev": true }, "node_modules/@storybook/addon-a11y": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.2.1.tgz", - "integrity": "sha512-r4YLTcPfGqoshu3uq+dyydWZ35zIwoumJ/zgFTlPsxmpV9WArXEKg25fKUNfJMuEE+7U5NqC9xq8ocUa9ihMlg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.4.5.tgz", + "integrity": "sha512-7W8fjCdmwX4zlDM4jpzVKNgelWSqbYr3cH834pqOFAkyiyNVIsNRPQBgSwkkljgz0uAsz8nFCRFK3Oo1btl6Yg==", "dev": true, "dependencies": { - "@storybook/addon-highlight": "7.2.1", - "@storybook/channels": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/addon-highlight": "7.4.5", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" @@ -4077,25 +4222,25 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.2.1.tgz", - "integrity": "sha512-YUiKksgRIUm80eZacj/x14BEYCQY5iel1/Wo6mrTP7bVQrUNiCmnINSrup0DObg7lmIaq00h3ow7gKeYJ+x6zw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.4.5.tgz", + "integrity": "sha512-FkjJWmPN/+duLSkRwfa2bwlwjKfY6yCXYn7CRzn3rb64B8f50NB79zAgVLHjkJh9l6T3DIlWtol6vqPHj1aRpw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", "prop-types": "^15.7.2", "react-inspector": "^6.0.0", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "ts-dedent": "^2.0.0", "uuid": "^9.0.0" }, @@ -4117,19 +4262,19 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.2.1.tgz", - "integrity": "sha512-F+/eERFnCIjDaOkCbCS0erre1AbjsHoM0IdLu2sGIBwuroFwKYy/ijadSsJ1zk4eBqZFxdyN4CuMN6EsK1Xm+Q==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.4.5.tgz", + "integrity": "sha512-fTq9E1WrYH/9hwDemFVLVcaI2iSSuwWnvY/8tqGrY9xhQF5dIpeHf+z8+HWXpau7e6Z0/WiYR+1vwAcIKt95LQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -4151,21 +4296,21 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.2.1.tgz", - "integrity": "sha512-ioILEP4wZo6n8ifr1b+o8xCdMVLWyhHqNWoQoBRixxWwpzR4/fHaKo7wBGSkOOWubkhen6wUMUuiJbDdoGyR7g==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.4.5.tgz", + "integrity": "sha512-Mxs56jt44HIbZ4gJa0AII1U8GqEGFsvcM5Iob0ETNpxCW5Kj5iHly/4Ws0RFWPH/krrQKaLpWXaUxKmbtEzhJA==", "dev": true, "dependencies": { - "@storybook/blocks": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/core-events": "7.2.1", - "@storybook/manager-api": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/blocks": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/core-events": "7.4.5", + "@storybook/manager-api": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -4187,26 +4332,26 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.2.1.tgz", - "integrity": "sha512-QlUM22wK0cE9glMRt1auP3BccjafdRvcsAnaLvDIL12HRaUqMpH6vvNN3A3MXo6XuzbOmDwAov5mXdCenpz02A==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.4.5.tgz", + "integrity": "sha512-KjFVeq8oL7ZC1gsk8iY3Nn0RrHHUpczmOTCd8FeVNmKD4vq+dkPb/8bJLy+jArmIZ8vRhknpTh6kp1BqB7qHGQ==", "dev": true, "dependencies": { "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/csf-plugin": "7.2.1", - "@storybook/csf-tools": "7.2.1", + "@storybook/blocks": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/csf-plugin": "7.4.5", + "@storybook/csf-tools": "7.4.5", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.2.1", - "@storybook/postinstall": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/react-dom-shim": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/node-logger": "7.4.5", + "@storybook/postinstall": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/react-dom-shim": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -4222,24 +4367,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.2.1.tgz", - "integrity": "sha512-+ICPYpuljKOoO1oTRfoax4n+3UD2/xAY8qQmAsRNN3xOBNJfdrsrCocrfY1j74xqoX+Zflvp5V481zq+MpP4XQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.4.5.tgz", + "integrity": "sha512-H7zZWJXZP0UU2kXfo9zlQfjIKHuuqYBK7PZ2/SL5y08mTrbtt1BfqYScz3xRvHocaFcsBWCXdy8jJULT4KFUpw==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.2.1", - "@storybook/addon-backgrounds": "7.2.1", - "@storybook/addon-controls": "7.2.1", - "@storybook/addon-docs": "7.2.1", - "@storybook/addon-highlight": "7.2.1", - "@storybook/addon-measure": "7.2.1", - "@storybook/addon-outline": "7.2.1", - "@storybook/addon-toolbars": "7.2.1", - "@storybook/addon-viewport": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/manager-api": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/preview-api": "7.2.1", + "@storybook/addon-actions": "7.4.5", + "@storybook/addon-backgrounds": "7.4.5", + "@storybook/addon-controls": "7.4.5", + "@storybook/addon-docs": "7.4.5", + "@storybook/addon-highlight": "7.4.5", + "@storybook/addon-measure": "7.4.5", + "@storybook/addon-outline": "7.4.5", + "@storybook/addon-toolbars": "7.4.5", + "@storybook/addon-viewport": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/manager-api": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/preview-api": "7.4.5", "ts-dedent": "^2.0.0" }, "funding": { @@ -4252,14 +4397,14 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.2.1.tgz", - "integrity": "sha512-6nNqpSMImn1mSGmEKF1o+C6o4lWJjduGYnCIO/ouXExaNLMrdcGKUEWrluABLOeDRPcNC9/EkuIEd8IsDnUX4A==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.4.5.tgz", + "integrity": "sha512-6Ru411+Iis4m2weKb8kB1eEssLvCHwFqAf4fjcOC//O5Vaf5+beHYZJUm/rzD0k/oUHfLCBwDBSBY5TLRegkdA==", "dev": true, "dependencies": { - "@storybook/core-events": "7.2.1", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.2.1" + "@storybook/preview-api": "7.4.5" }, "funding": { "type": "opencollective", @@ -4267,19 +4412,19 @@ } }, "node_modules/@storybook/addon-links": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.2.1.tgz", - "integrity": "sha512-3UQfOZ1+wGlPsHWWjXjPskq6nsDXuB+8QvOcpqy51mK+5Zv/EQe386hWj9VUpjLNMxXarWETa5CXGfoQdFzJTA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.4.5.tgz", + "integrity": "sha512-eKczq3U5KfPLaxMUzzVQQrGVtzDshUmrSEEuWKf9ZbK3mh5yVuagIBb88edgUX58vZ3TJMvqQzq1+BtUoPHQ6Q==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/router": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/router": "7.4.5", + "@storybook/types": "7.4.5", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -4301,18 +4446,18 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.2.1.tgz", - "integrity": "sha512-3Rq/B3Iurbo5dZvUN735GHK+9EDm0xw+liK0PdeYvl21/RkXTV+a4aBcWyyeWwwu1S7pdK1B/0WEc9d5Lot8sA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.4.5.tgz", + "integrity": "sha512-FQGZniTH67nC1YPR4ep0p+isgxwLaNAmIAyCZWXPRTkZssIrnXVwNgi0A2QkHdxZvxj8yXGFTOVXLWEPT9YvFQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", "tiny-invariant": "^1.3.1" }, "funding": { @@ -4333,18 +4478,18 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.2.1.tgz", - "integrity": "sha512-v2dYDhfSzV8Nsi1pmjcLEOHGJLlUnpnSXlQymb338YJEFKP2G5ylHzKAHG16MmzKeZZd3rthTB0246SFCyf0hg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.4.5.tgz", + "integrity": "sha512-eOH9BZzpehUz5FXD98OLnWgzmBFMvEB2kFfw5JiO7IRx7Fan80fx/WDQuMSNDOgLBCTTvsZ4TBMMXZHpw91WAw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", "ts-dedent": "^2.0.0" }, "funding": { @@ -4365,16 +4510,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.2.1.tgz", - "integrity": "sha512-SEDj9f0EgifPK/Eyh703N1tbk7SZ7yAZOnNUK8T0mwdKrMa7jskvYuift8iSnJA2ldp1siqwe1Obq+Oielp9hQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.4.5.tgz", + "integrity": "sha512-PZlwUTIdQ18de3zNb+627VSF4UrCGIXDdikyO9O5j2Cd0xfr5uhS6tgQ+3AT0DfUj0UIkKxilwcAt+agpNyicA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1" + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5" }, "funding": { "type": "opencollective", @@ -4394,18 +4539,18 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.2.1.tgz", - "integrity": "sha512-aHl3rCh4MNByfWVtjBzkwMtz0iHQHFhatWXVt7mQoTQFBbZHpeynKvLfKBprp+2whK9RoDHqBUjqGTZrECdpRA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.4.5.tgz", + "integrity": "sha512-SBLnUMIztVrqJ0fRCsVg9KZ29APLIxqAvTsYHF3twy5KB2naeCFuX3K9LxSH7vbROI6zHEfnPduz/Ykyvu9yUg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -4427,22 +4572,22 @@ } }, "node_modules/@storybook/blocks": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.2.1.tgz", - "integrity": "sha512-1fPsFC6n9R267KwxGHiL80OuIdMDRC9QuIW4sRF0tF/G/yvucbofySYRQl/Y8LjsMJq8D4NpG5xLsneSxMP5cg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.5.tgz", + "integrity": "sha512-FhAIkCT2HrzJcKsC3mL5+uG3GrbS23mYAT1h3iyPjCliZzxfCCI9UCMUXqYx4Z/FmAGJgpsQQXiBFZuoTHO9aQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/components": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/components": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.2.1", + "@storybook/docs-tools": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -4451,7 +4596,7 @@ "memoizerific": "^1.11.3", "polished": "^4.2.2", "react-colorful": "^5.1.2", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "tocbot": "^4.20.1", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" @@ -4466,15 +4611,15 @@ } }, "node_modules/@storybook/builder-manager": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.2.1.tgz", - "integrity": "sha512-X8B1cUfDaTtsJY3xJNwPy6W4UN7LWXkKktJBoNUGESigQGKpAMvUAmABCZIjZD8GcdGMtU8y/fA7YimUpy/ZKQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.4.5.tgz", + "integrity": "sha512-Jhql8iZgK9cxDmG9NSTejsj5FptHni2TBa5Sea2Uz1NIBQ0OpzNdUfYVX6TN/PEq3QrWXTrAEKPqsL2qGjOrxw==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.2.1", - "@storybook/manager": "7.2.1", - "@storybook/node-logger": "7.2.1", + "@storybook/core-common": "7.4.5", + "@storybook/manager": "7.4.5", + "@storybook/node-logger": "7.4.5", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", @@ -4883,20 +5028,20 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.2.1.tgz", - "integrity": "sha512-D/RNcH6WAxMAMmC3w9wwgDbYUJ9SjSwc6NPcxGrKk9o0SWDsKWWx4r6mM0W5FJ7Wh11Ca46LLnPC3cFfEg4YDQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.4.5.tgz", + "integrity": "sha512-0aIMvBIx2U/DhDjdjWCW/KIG3HAJpus8NIUIvkVAUCaA7Vn8XvnSsdaRSTTxaaJReFZcIxDf7MebHSCJ0UEKqQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/csf-plugin": "7.2.1", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/csf-plugin": "7.4.5", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.2.1", - "@storybook/preview": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/node-logger": "7.4.5", + "@storybook/preview": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", @@ -4937,9 +5082,9 @@ "dev": true }, "node_modules/@storybook/builder-vite/node_modules/magic-string": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", - "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "version": "0.30.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.4.tgz", + "integrity": "sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -4949,16 +5094,16 @@ } }, "node_modules/@storybook/channels": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.2.1.tgz", - "integrity": "sha512-3ZogzjwlFG+oarwnI7TTvWvHVOUtJbjrgZkM5QuLMlxNzIR1XuBY8f01yf4K8+VpdNy9DY+7Q/j6tBThfwYvpA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.5.tgz", + "integrity": "sha512-zWPZn4CxPFXsrrSRQ9JD8GmTeWeFYgr3sTBpe23hnhYookCXVNJ6AcaXogrT9b2ALfbB6MiFDbZIHHTgIgbWpg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/global": "^5.0.0", "qs": "^6.10.0", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "tiny-invariant": "^1.3.1" }, "funding": { @@ -4967,22 +5112,23 @@ } }, "node_modules/@storybook/cli": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.2.1.tgz", - "integrity": "sha512-rPZDUvM0FRHZU4Wcm0ASOr/0xZq/6uySulqpLgoSkeZIC0xLXh/bI6YoDrD9UJV6GIRiqHMWMdxWd1e+TH8XHg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.4.5.tgz", + "integrity": "sha512-PlTkcHdKCugg3pD1zkBP/oFazcZsr7F3wdEmTvygfH0Cx/sQWg5wXBZCYKmf0ONRK4RKL3LVM8DRpeYiQVEFWg==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/core-server": "7.2.1", - "@storybook/csf-tools": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/telemetry": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/codemod": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/core-events": "7.4.5", + "@storybook/core-server": "7.4.5", + "@storybook/csf-tools": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/telemetry": "7.4.5", + "@storybook/types": "7.4.5", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -5270,9 +5416,9 @@ "dev": true }, "node_modules/@storybook/client-logger": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.2.1.tgz", - "integrity": "sha512-Lyht/lJg2S65CXRy9rXAZXP/Mgye7jbi/aqQL8z9VRMGChbL+k/3pSZnXTTrD1OVSpCEr4UWA+9bStzT4VjtYA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.5.tgz", + "integrity": "sha512-Bn6eTAjhPDUfLpvuxhKkpDpOtkadfkSmkBNBZRu3r0Dzk2J1nNyKV5K6D8dOU4PFVof4z/gXYj5bktT29jKsmw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5283,18 +5429,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.2.1.tgz", - "integrity": "sha512-R19fdPfslupxfbtyuGcRa2m1nCug2Zm8bS0GhnPtUl7eGBA4glcf4KKwP52pEqgJAsarfiL2cLSnN5wqQGQ/Sw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.4.5.tgz", + "integrity": "sha512-gyI2xliSv4vvnfNQN+0e3tRmT7beiq8q8iGjcBtpOhA2xrStyCR7PjbOfLXtRx2I/b50MDZMRTcckzeM3BLoWQ==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/csf-tools": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/types": "7.4.5", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", @@ -5324,18 +5470,18 @@ } }, "node_modules/@storybook/components": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.2.1.tgz", - "integrity": "sha512-7JuMT2yK9FGPu9hFCo38tC3FDyr/hJ3CQwU6dSR6E5rT9E658dq31Xl3y/fM5OMzl8MX8Off7TWiybHSuwYJTA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.4.5.tgz", + "integrity": "sha512-boskkfvMBB8CFYY9+1ofFNyKrdWXTY/ghzt7oK80dz6f2Eseo/WXK3OsCdCq5vWbLRCdbgJ8zXG8pAFi4yBsxA==", "dev": true, "dependencies": { "@radix-ui/react-select": "^1.2.2", - "@storybook/client-logger": "7.2.1", + "@radix-ui/react-toolbar": "^1.0.4", + "@storybook/client-logger": "7.4.5", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.1.0", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -5350,13 +5496,13 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.2.1.tgz", - "integrity": "sha512-ujJdkaY6LXGCA8pqFBYTNMySmawm3GPcORYevkmM2edSbNKlu904+HvheRirajluzV7ropzGxUBZR9TMwgmDGg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.4.5.tgz", + "integrity": "sha512-d/qiCUZeOKY0HX/YmomxlccxJ2NKC3ttRrAsAXzJGypClKabv20X+qbeO/E7Kp5UQxIEJx1wuwJPcnlCvjgPDA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/preview-api": "7.2.1" + "@storybook/client-logger": "7.4.5", + "@storybook/preview-api": "7.4.5" }, "funding": { "type": "opencollective", @@ -5364,13 +5510,14 @@ } }, "node_modules/@storybook/core-common": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.2.1.tgz", - "integrity": "sha512-g1MQ04lgL16Ct89tPj6RSw72yd+a+ZJ4ceH3Ev+SmnU8efBLPmr6+G5Bx7+rY1W2c6NdpFgtSidjgOGqQ8gppw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.4.5.tgz", + "integrity": "sha512-c4pBuILMD4YhSpJ+QpKtsUZpK+/rfolwOvzXfJwlN5EpYzMz6FjVR/LyX0cCT2YLI3X5YWRoCdvMxy5Aeryb8g==", "dev": true, "dependencies": { - "@storybook/node-logger": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/core-events": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/types": "7.4.5", "@types/find-cache-dir": "^3.2.1", "@types/node": "^16.0.0", "@types/node-fetch": "^2.6.4", @@ -5827,19 +5974,19 @@ } }, "node_modules/@storybook/core-common/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5885,36 +6032,39 @@ } }, "node_modules/@storybook/core-events": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.2.1.tgz", - "integrity": "sha512-EUXYb3gyQ2EzpDAWkgfoDl1EPabj3OE6+zntsD/gwvzQU85BTocs10ksnRyS55bfrQpYbf+Z+gw2CZboyagLgg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.5.tgz", + "integrity": "sha512-Jzy/adSC95saYCZlgXE5j7jmiMLAXYpnBFBxEtBdXwSWEBb0zt21n1nyWBEAv9s/k2gqDXlPHKHeL5Mn6y40zA==", "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/core-server": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.2.1.tgz", - "integrity": "sha512-jhS918Frl5j6LSB3x7qzHHuRL5e3RXqCkBQe5KtR2zXMgYlalSyGcX5uT8byWFznUsQIjGmUrf6ZIoKdRdslWg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.4.5.tgz", + "integrity": "sha512-cW+Qx9Ls823577bd/s9Kv4M1MdKS8mkk6/+nYbwtAwH3hkdlb077rlk/ue0X4O9NZmCrtaJ84KNrBkeDUdFyLQ==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.2.1", - "@storybook/channels": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/builder-manager": "7.4.5", + "@storybook/channels": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.2.1", + "@storybook/csf-tools": "7.4.5", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/telemetry": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/telemetry": "7.4.5", + "@storybook/types": "7.4.5", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -5935,7 +6085,7 @@ "read-pkg-up": "^7.0.1", "semver": "^7.3.7", "serve-favicon": "^2.5.0", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0", "util": "^0.12.4", @@ -6043,12 +6193,12 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.2.1.tgz", - "integrity": "sha512-qhxkKOsUjCS/hqsDgwgoM81ZXAXfTNrJJPHCs4Wa1dHoUVUn7rro7VANIO0GVNrRDnha3YR4fEmnD8kklLKmCQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.4.5.tgz", + "integrity": "sha512-8p3AnwIm3xXtQhiF7OQ0rBiP/Pn5OCMHRiT4FytRnNimGaw7gxRZ2xzM608QZHQ4A8rHfmgoM2FTwgxdC15ulA==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.2.1", + "@storybook/csf-tools": "7.4.5", "unplugin": "^1.3.1" }, "funding": { @@ -6057,9 +6207,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.2.1.tgz", - "integrity": "sha512-QqZOBd6lmhPoIBLutyYYJ3wBwEZF+fUjiL8vhw3lgq+Mrer14lmKrImKDSjd1PsqVbbGQEJZ4TAJHZc3vdQs0w==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.4.5.tgz", + "integrity": "sha512-xbm5HGYvlwF0Efivx37v9rO7Exel1/Tdb/Yv/vXn4D/hQeljNVLNz4Bomfy4EQ207rRsrGDSOHEhLUbHDimnxg==", "dev": true, "dependencies": { "@babel/generator": "^7.22.9", @@ -6067,9 +6217,8 @@ "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.2.1", + "@storybook/types": "7.4.5", "fs-extra": "^11.1.0", - "prettier": "^2.8.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" }, @@ -6078,21 +6227,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/@storybook/docs-mdx": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", @@ -6100,14 +6234,14 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.2.1.tgz", - "integrity": "sha512-snRdkqdaxAwlalIEtuElySzC68Lo/0KfrGRR6xSDxWIhjAPNqsRLPHEXlZrJ43Tn/V2oxCRU8eb21pP5/58krw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.4.5.tgz", + "integrity": "sha512-ctK+yGb2nvWISSvCCzj3ZhDaAb7I2BLjbxuBGTyNPvl4V9UQ9LBYzdJwR50q+DfscxdwSHMSOE/0OnzmJdaSJA==", "dev": true, "dependencies": { - "@storybook/core-common": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/core-common": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -6123,23 +6257,10 @@ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true }, - "node_modules/@storybook/icons": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.1.5.tgz", - "integrity": "sha512-PWJIaa/NtOu2VSWnj07evF1OI5+6H7ZTAvy0LO38RheW4W8iS+xoYsh2cr/nxLBblfhbw533uJrhdqpxCytxfA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/@storybook/manager": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.2.1.tgz", - "integrity": "sha512-wD2tRH8gLk2VNFMVcWmGZTXGTMNXdM3rnXiyKtmSVwFzacmOtLzEsCOprwI6WJpZv3v1vHY0s6idN9iadTVMhw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.4.5.tgz", + "integrity": "sha512-yoqVktWzzC0f8cXsxErOEUfT+VFfWV/W7soytIPQuJFqNaq+BqR5A7WCeoY7BIv3mdpRjo4GKwerCsgoHYeHhg==", "dev": true, "funding": { "type": "opencollective", @@ -6147,25 +6268,25 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.2.1.tgz", - "integrity": "sha512-jRuYTrsNKq+g1u9kbQRvBsRKVITOdiNu9c633MeCH73oBVo8WNnZF/tW/ER86oTnru0H7EmRdgz3v9ft/wS2GQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.5.tgz", + "integrity": "sha512-8Hdh5Tutet8xRy2fAknczfvpshz09eVnLd8m34vcFceUOYvEnvDbWerufhlEzovsF4v7U32uqbDHKdKTamWEQQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.2.1", - "@storybook/theming": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/router": "7.4.5", + "@storybook/theming": "7.4.5", + "@storybook/types": "7.4.5", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "semver": "^7.3.7", "store2": "^2.14.2", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -6217,9 +6338,9 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.2.1.tgz", - "integrity": "sha512-Ywjqi8iAc26RYbZfmpzvzdKbaQZaD1T/IRNfVGReM/jTXnX0VSdsa6P/pfurbyHcQw//D3TSdqRHOMtbp0nIJg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.4.5.tgz", + "integrity": "sha512-fJSykphbryuEYj1qihbaTH5oOzD4NkptRxyf2uyBrpgkr5tCTq9d7GHheqaBuIdi513dsjlcIR7z5iHxW7ZD+Q==", "dev": true, "funding": { "type": "opencollective", @@ -6227,9 +6348,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.2.1.tgz", - "integrity": "sha512-xOzX1MygQ+9xpku6FuODhXvfv/CcKlQPOGpZk8ejE/04Eow0JHluGI1cxdnpqGcCBygkw7DP+xrtQCv75c7Gjg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.4.5.tgz", + "integrity": "sha512-MWRjnKkUpEe2VkHNNpv3zkuMvxM2Zu9DMxFENQaEmhqUHkIFh5klfFwzhSBRexVLzIh7DA1p7mntIpY5A6lh+Q==", "dev": true, "funding": { "type": "opencollective", @@ -6237,9 +6358,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.2.1.tgz", - "integrity": "sha512-5mLNhuaePx3Zv8mO93Y/M+U7ppqV5bS13rPfMHcVmSb7mQ/3hN7zkF6NhPOX6LoBUxetHiAJh5dA5McNE3adLQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.4.5.tgz", + "integrity": "sha512-hCVFoPJP0d7vFCJKaWEsDMa6LcRFcEikQ8Cy6Vo+trS8xXwvwE+vIBqyuPozl4O/MYD9iOlzjgZFNwaUUgX0Jg==", "dev": true, "funding": { "type": "opencollective", @@ -6247,17 +6368,17 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.2.1.tgz", - "integrity": "sha512-WKecuOdeh9+og6bPR9KoQf/JCeSRPCcfZv9uNfJzAp3IiTnS3UpfCz+HBZzZJQrisgbd7OulNY400HQUmxY2Ag==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.5.tgz", + "integrity": "sha512-6xXQZPyilkGVddfZBI7tMbMMgOyIoZTYgTnwSPTMsXxO0f0TvtNDmGdwhn0I1nREHKfiQGpcQe6gwddEMnGtSg==", "dev": true, "dependencies": { - "@storybook/channels": "7.2.1", - "@storybook/client-logger": "7.2.1", - "@storybook/core-events": "7.2.1", + "@storybook/channels": "7.4.5", + "@storybook/client-logger": "7.4.5", + "@storybook/core-events": "7.4.5", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.2.1", + "@storybook/types": "7.4.5", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6273,9 +6394,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.2.1.tgz", - "integrity": "sha512-QzQQN2nZkG7c0Mg5HvhfQuH10HjAJEnA8vDlENIFMj3XqtUAq4HE2n73gEcvdFJMXL4G16N58+TgR1e2cFdRKw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.4.5.tgz", + "integrity": "sha512-/hGe8yuiWbT7L3ZsllmJPgxT9MEQE3k23FhliyKx6IGHsWoYaEsPYPZ9tygqtKY8RpqqMUKWz8+kbO79zUxaoQ==", "dev": true, "funding": { "type": "opencollective", @@ -6287,12 +6408,12 @@ } }, "node_modules/@storybook/router": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.2.1.tgz", - "integrity": "sha512-9Cn5boUS+7yhrKlSy1kt7ruNs/znk3555kclBD6+uuhH/dD84feGeiGYE4GUuLmcKrDFtNF185/Gr1huJ556tA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.5.tgz", + "integrity": "sha512-IM4IhiPiXsx3FAUeUOAB47uiuUS8Yd37VQcNlXLBO28GgHoTSYOrjS+VTGLIV5cAGKr8+H5pFB+q35BnlFUpkQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", + "@storybook/client-logger": "7.4.5", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6306,14 +6427,14 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.2.1.tgz", - "integrity": "sha512-ewYvX+ZzuTCl9a8DUbKkSPD6GhxUStl/+Eni1faE1OEnyduwbJFlse0EBpOa4YZTcghlngrHV3pulEW8qOgNFA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.4.5.tgz", + "integrity": "sha512-JbhQXZF5sqS2c7Cf+vAtuKTdTSBDco+liUP2UGQFjqdacTRLVzxyj+YY2UH4aAQn7wpmnQ67iHnqFp0+fdYmAA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/core-common": "7.2.1", - "@storybook/csf-tools": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/core-common": "7.4.5", + "@storybook/csf-tools": "7.4.5", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -6378,13 +6499,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.2.1.tgz", - "integrity": "sha512-cfnNCLvKmzxjmoYKfLl7Q64gSTouLvd23CtvBAOlWcRYnMJ9v4/7A2tK3xQyVRlJYh9OuXiHFLL8AXbN58Hkzw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.5.tgz", + "integrity": "sha512-QSIJDIMzOegzlhubIBaYIovf4mlf+AVL0SmQOskPS8GZ6s9t77yUUI6gZTEjO+S4eB3djXRsfTTijQ8+z4XmRA==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.2.1", + "@storybook/client-logger": "7.4.5", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6398,12 +6519,12 @@ } }, "node_modules/@storybook/types": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.2.1.tgz", - "integrity": "sha512-YwlIY1uyxfJjijbB5x1d1QOKaUUDJnMX8BSb8oGqU4cyT76X/Is4CbGs+vccFsJo0tZu1GfuahYXl0EDT0nnSQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.5.tgz", + "integrity": "sha512-DTWFNjfRTpncjufDoUs0QnNkgHG2qThGKWL1D6sO18cYI02zWPyHWD8/cbqlvtT7XIGe3s1iUEfCTdU5GcwWBA==", "dev": true, "dependencies": { - "@storybook/channels": "7.2.1", + "@storybook/channels": "7.4.5", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" @@ -6414,18 +6535,18 @@ } }, "node_modules/@storybook/web-components": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.2.1.tgz", - "integrity": "sha512-V8nTCZ5E/GsWRtOGx6epRxjVooiG5qt250qKuPnuFZodxGjcgX414di5VR2qVJVbg6cFexgRblCO/cj8f4WJqQ==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.4.5.tgz", + "integrity": "sha512-bLmrxnM4LKm8DfawUd89/EgUpPLIu0iRnxGKSzuUO6Rc1NW0WsCb/OLDAMzC6Eu1Ga7qLKMdzDgBoHZxRv8MrA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.2.1", - "@storybook/core-client": "7.2.1", - "@storybook/docs-tools": "7.2.1", + "@storybook/client-logger": "7.4.5", + "@storybook/core-client": "7.4.5", + "@storybook/docs-tools": "7.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.2.1", - "@storybook/preview-api": "7.2.1", - "@storybook/types": "7.2.1", + "@storybook/manager-api": "7.4.5", + "@storybook/preview-api": "7.4.5", + "@storybook/types": "7.4.5", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, @@ -6441,15 +6562,15 @@ } }, "node_modules/@storybook/web-components-vite": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.2.1.tgz", - "integrity": "sha512-7F00LJOKyvlF5NucxqZqgmpfzrm4I/luL5VA7/6N/Cvey+2vLMR+c7wxYXm/p3lIAFYXQCv4BJm9RsGwzxmRBg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.4.5.tgz", + "integrity": "sha512-J90WA/CKNUvDu962W1SnzsXmttIS8im0i9Op8zjMPAHq+nVzfXB0Qb/LUR3RbQHFU01V7BFaWgrA0CdINeN04g==", "dev": true, "dependencies": { - "@storybook/builder-vite": "7.2.1", - "@storybook/core-server": "7.2.1", - "@storybook/node-logger": "7.2.1", - "@storybook/web-components": "7.2.1", + "@storybook/builder-vite": "7.4.5", + "@storybook/core-server": "7.4.5", + "@storybook/node-logger": "7.4.5", + "@storybook/web-components": "7.4.5", "magic-string": "^0.30.0" }, "engines": { @@ -6522,9 +6643,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -6535,18 +6656,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -6554,9 +6675,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -6648,9 +6769,9 @@ } }, "node_modules/@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.3.tgz", + "integrity": "sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==", "dev": true, "dependencies": { "@types/node": "*" @@ -6684,15 +6805,15 @@ "dev": true }, "node_modules/@types/ejs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", - "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.3.tgz", + "integrity": "sha512-mv5T/JI/bu+pbfz1o+TLl1NF0NIBbjS0Vl6Ppz1YY9DkXfzZT0lelXpfS5i3ZS3U/p90it7uERQpBvLYoK8e4A==", "dev": true }, "node_modules/@types/emscripten": { - "version": "1.39.7", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.7.tgz", - "integrity": "sha512-tLqYV94vuqDrXh515F/FOGtBcRMTPGvVV1LzLbtYDcQmmhtpf/gLYf+hikBbQk8MzOHNz37wpFfJbYAuSn8HqA==", + "version": "1.39.8", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.8.tgz", + "integrity": "sha512-Rk0HKcMXFUuqT32k1kXHZWgxiMvsyYsmlnjp0rLKa0MMoqXLE3T9dogDBTRfuc3SAsXu97KD3k4SKR1lHqd57w==", "dev": true }, "node_modules/@types/estree": { @@ -6738,9 +6859,9 @@ "dev": true }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "dependencies": { "@types/node": "*" @@ -6896,9 +7017,9 @@ "dev": true }, "node_modules/@types/mime-types": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", - "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.2.tgz", + "integrity": "sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==", "dev": true }, "node_modules/@types/mocha": { @@ -6920,33 +7041,19 @@ "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "form-data": "^4.0.0" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", "dev": true }, "node_modules/@types/parse5": { @@ -7103,18 +7210,18 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.26.tgz", + "integrity": "sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "node_modules/@types/yauzl": { @@ -9393,15 +9500,16 @@ } }, "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, "node_modules/ast-types": { @@ -9654,13 +9762,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -9852,9 +9960,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -9871,10 +9979,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -10016,9 +10124,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001516", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", - "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "version": "1.0.30001542", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz", + "integrity": "sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==", "dev": true, "funding": [ { @@ -10686,12 +10794,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -11185,9 +11293,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.463", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", - "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==", + "version": "1.4.537", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz", + "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==", "dev": true }, "node_modules/element-internals-polyfill": { @@ -11385,12 +11493,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, "node_modules/esbuild": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", @@ -11435,9 +11537,9 @@ "dev": true }, "node_modules/esbuild-register": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz", - "integrity": "sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", + "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -11718,9 +11820,9 @@ "dev": true }, "node_modules/eslint-plugin-storybook": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.13.tgz", - "integrity": "sha512-smd+CS0WH1jBqUEJ3znGS7DU4ayBE9z6lkQAK2yrSUv1+rq8BT/tiI5C/rKE7rmiqiAfojtNYZRhzo5HrulccQ==", + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.14.tgz", + "integrity": "sha512-IeYigPur/MvESNDo43Z+Z5UvlcEVnt0dDZmnw1odi9X2Th1R3bpGyOZsHXb9bp1pFecOpRUuoMG5xdID2TwwOg==", "dev": true, "dependencies": { "@storybook/csf": "^0.0.1", @@ -12576,9 +12678,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.214.0.tgz", - "integrity": "sha512-RW1Dh6BuT14DA7+gtNRKzgzvG3GTPdrceHCi4ddZ9VFGQ9HtO5L8wzxMGsor7XtInIrbWZZCSak0oxnBF7tApw==", + "version": "0.217.2", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.217.2.tgz", + "integrity": "sha512-O+nt/FLXa1hTwtW0O9h36iZjbL84G8e1uByx5dDXMC97AJEbZXwJ4ohfaE8BNWrYFyYX0NGfz1o8AtLQvaaD/Q==", "dev": true, "engines": { "node": ">=0.4.0" @@ -14348,9 +14450,9 @@ } }, "node_modules/jackspeak": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", - "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -14436,20 +14538,20 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -14461,21 +14563,21 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -14539,13 +14641,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.2", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16674,9 +16776,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz", - "integrity": "sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.0.tgz", + "integrity": "sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==", "dev": true }, "node_modules/node-fetch/node_modules/tr46": { @@ -17412,9 +17514,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -17772,9 +17874,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -18316,9 +18418,9 @@ } }, "node_modules/recast": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.3.tgz", - "integrity": "sha512-HbCVFh2ANP6a09nzD4lx7XthsxMOJWKX5pIcUwtLrmeEIl3I0DwjCoVXDE0Aobk+7k/mS3H50FK4iuYArpcT6Q==", + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", "dev": true, "dependencies": { "assert": "^2.0.0", @@ -18359,9 +18461,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -18779,12 +18881,12 @@ "dev": true }, "node_modules/rollup-plugin-import-css": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.3.1.tgz", - "integrity": "sha512-/v/OjjDPhhhbua5w4VzHRTtqfyyG950jJSObtM9os5ELGgaHiolNOvpZNk2KeTSFMuhdrXirGXM64bluHgwySA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.3.4.tgz", + "integrity": "sha512-w5p1Dd1CavAht/P82zB3WX2RVy7O47MlJGSmgrWXTBPAkWHTbOBh/nUPz94IczCD0HLxpuT4AhF24cix7CpZWA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.2" + "@rollup/pluginutils": "^5.0.4" }, "engines": { "node": ">=16" @@ -19332,9 +19434,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", "dev": true }, "node_modules/sprintf-js": { @@ -19421,12 +19523,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.2.1.tgz", - "integrity": "sha512-uNNqJrWUVaxdZdd3GpMTHt9h2EftoUKxtpAWeQlzx20DDvcliVC1yvLT54sLAzY8nlxxN+fBUuBbTSJ1Dx4TPg==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.4.5.tgz", + "integrity": "sha512-J7fidphTJ6SJHlR8f/USQE30K6ipbynLVLsTOz0bNYW/0Ua2t9u6dAYGbbq6bLikl3zxzQbdm9lXMUzmaYAdIA==", "dev": true, "dependencies": { - "@storybook/cli": "7.2.1" + "@storybook/cli": "7.4.5" }, "bin": { "sb": "index.js", @@ -19697,9 +19799,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -19742,9 +19844,9 @@ "dev": true }, "node_modules/telejson": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.1.0.tgz", - "integrity": "sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -19928,9 +20030,9 @@ "dev": true }, "node_modules/tinymce": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.6.1.tgz", - "integrity": "sha512-n1ub/Jq6c5o2mju6A1HPFoR5/X7eH8720yDzLchg4MbKKJg6tthTGr+lBPHzQyrImwbfo7LVgx28mN5InzVMmw==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.7.0.tgz", + "integrity": "sha512-Wf2RSobIXQ7XNw3/v4z1lPGiH3Pjsmc/6/7fG28aIS6uVWj/7IhvOPuwfJJDeOx0o0D3nSnoLHgR2KU8JAdE+w==" }, "node_modules/tinymce-i18n": { "version": "23.8.7", @@ -20572,12 +20674,12 @@ } }, "node_modules/unplugin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", - "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.10.0", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.5.0" @@ -20593,9 +20695,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 2cb0650ff4..6671c3e070 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -1,7 +1,7 @@ { "name": "@umbraco-cms/backoffice", "license": "MIT", - "version": "14.0.0--preview003", + "version": "14.0.0--preview004", "type": "module", "exports": { ".": null, @@ -16,7 +16,6 @@ "./auth": "./dist-cms/shared/auth/index.js", "./icon": "./dist-cms/shared/icon/index.js", "./models": "./dist-cms/shared/models/index.js", - "./repository": "./dist-cms/shared/repository/index.js", "./resources": "./dist-cms/shared/resources/index.js", "./router": "./dist-cms/shared/router/index.js", "./style": "./dist-cms/shared/style/index.js", @@ -47,6 +46,7 @@ "./variant": "./dist-cms/packages/core/variant/index.js", "./workspace": "./dist-cms/packages/core/workspace/index.js", "./events": "./dist-cms/packages/core/umb-events/index.js", + "./repository": "./dist-cms/packages/core/repository/index.js", "./dictionary": "./dist-cms/packages/dictionary/dictionary/index.js", "./document": "./dist-cms/packages/documents/documents/index.js", "./document-blueprint": "./dist-cms/packages/documents/document-blueprints/index.js", @@ -133,7 +133,7 @@ "lodash-es": "4.17.21", "monaco-editor": "^0.41.0", "rxjs": "^7.8.1", - "tinymce": "^6.6.1", + "tinymce": "^6.7.0", "tinymce-i18n": "^23.8.7", "uuid": "^9.0.0" }, @@ -142,16 +142,16 @@ "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", - "@rollup/plugin-commonjs": "^25.0.3", + "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.1.0", - "@storybook/addon-a11y": "7.2.1", - "@storybook/addon-actions": "7.2.1", - "@storybook/addon-essentials": "7.2.1", - "@storybook/addon-links": "7.2.1", + "@rollup/plugin-node-resolve": "^15.2.1", + "@storybook/addon-a11y": "7.4.5", + "@storybook/addon-actions": "7.4.5", + "@storybook/addon-essentials": "7.4.5", + "@storybook/addon-links": "7.4.5", "@storybook/mdx2-csf": "^1.1.0", - "@storybook/web-components": "7.2.1", - "@storybook/web-components-vite": "7.2.1", + "@storybook/web-components": "7.4.5", + "@storybook/web-components-vite": "7.4.5", "@types/chai": "^4.3.5", "@types/lodash-es": "^4.17.8", "@types/mocha": "^10.0.1", @@ -170,7 +170,7 @@ "eslint-plugin-lit": "^1.8.3", "eslint-plugin-lit-a11y": "^4.1.0", "eslint-plugin-local-rules": "^1.3.2", - "eslint-plugin-storybook": "^0.6.13", + "eslint-plugin-storybook": "^0.6.14", "eslint-plugin-wc": "^1.5.0", "msw": "^1.2.3", "openapi-typescript-codegen": "^0.25.0", @@ -183,9 +183,9 @@ "rollup": "^3.27.2", "rollup-plugin-dts": "^5.3.1", "rollup-plugin-esbuild": "^5.0.0", - "rollup-plugin-import-css": "^3.3.1", + "rollup-plugin-import-css": "^3.3.4", "rollup-plugin-web-worker-loader": "^1.6.1", - "storybook": "7.2.1", + "storybook": "7.4.5", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.7", "typescript": "^5.1.6", @@ -197,5 +197,9 @@ }, "msw": { "workerDirectory": "public" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" } } diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 43d28c0f01..8d8f3d2e8e 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -114,10 +114,6 @@ export class UmbAppElement extends UmbLitElement { // Try to initialise the auth flow and get the runtime status try { - if (this.bypassAuth === false) { - await this.#authFlow.fetchServiceConfiguration(); - } - // Get the current runtime level await this.#setInitStatus(); diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index f226748e64..acd5f33aae 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -1822,6 +1822,9 @@ export default { permissionsDefault: 'Standardrettigheder', permissionsGranular: 'Granulære rettigheder', permissionsGranularHelp: 'Sæt rettigheder for specifikke noder', + permissionsEntityGroup_document: 'Indhold', + permissionsEntityGroup_media: 'Medie', + permissionsEntityGroup_member: 'Medlemmer', profile: 'Profil', searchAllChildren: "Søg alle 'børn'", languagesHelp: 'Tilføj sprog for at give brugerne adgang til at redigere', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 1feec5f802..37adbf86e2 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -52,7 +52,7 @@ export default { update: 'Update', setPermissions: 'Set permissions', unlock: 'Unlock', - createblueprint: 'Create Content Template', + createblueprint: 'Create Document Blueprint', resendInvite: 'Resend Invitation', deployQueueForTransfer: 'Queue for transfer', deployRestore: 'Workspace restore', @@ -86,7 +86,7 @@ export default { sort: 'Allow access to change the sort order for nodes', translate: 'Allow access to translate a node', update: 'Allow access to save a node', - createblueprint: 'Allow access to create a Content Template', + createblueprint: 'Allow access to create a Document Blueprint', notify: 'Allow access to setup notifications for content nodes', deployQueueForTransfer: 'Allow the user to queue item(s)', deployRestore: 'Allow the user to restore items for the whole workspace', @@ -329,14 +329,14 @@ export default { variantUnpublishNotAllowed: 'Unpublish is not allowed', }, blueprints: { - createBlueprintFrom: 'Create a new Content Template from %0%', + createBlueprintFrom: 'Create a new Document Blueprint from %0%', blankBlueprint: 'Blank', - selectBlueprint: 'Select a Content Template', - createdBlueprintHeading: 'Content Template created', - createdBlueprintMessage: "A Content Template was created from '%0%'", - duplicateBlueprintMessage: 'Another Content Template with the same name already exists', + selectBlueprint: 'Select a Document Blueprint', + createdBlueprintHeading: 'Document Blueprint created', + createdBlueprintMessage: "A Document Blueprint was created from '%0%'", + duplicateBlueprintMessage: 'Another Document Blueprint with the same name already exists', blueprintDescription: - 'A Content Template is predefined content that an editor can select to use as the\n basis for creating new content\n ', + 'A Document Blueprint is predefined content that an editor can select to use as the\n basis for creating new content\n ', }, media: { clickToUpload: 'Click to upload', @@ -378,7 +378,7 @@ export default { create: { chooseNode: 'Where do you want to create the new %0%', createUnder: 'Create an item under', - createContentBlueprint: 'Select the Document Type you want to make a content template for', + createContentBlueprint: 'Select the Document Type you want to make a content blueprint for', enterFolderName: 'Enter a folder name', updateData: 'Choose a type and a title', noDocumentTypes: @@ -1294,7 +1294,7 @@ export default { editMultiContentPublishedText: '%0% documents published and visible on the website', editVariantPublishedText: '%0% published and visible on the website', editMultiVariantPublishedText: '%0% documents published for languages %1% and visible on the website', - editBlueprintSavedHeader: 'Content Template saved', + editBlueprintSavedHeader: 'Content Blueprint saved', editBlueprintSavedText: 'Changes have been successfully saved', editContentSavedHeader: 'Content saved', editContentSavedText: 'Remember to publish to make changes visible', @@ -1705,7 +1705,7 @@ export default { }, treeHeaders: { content: 'Content', - contentBlueprints: 'Content Templates', + contentBlueprints: 'Content Blueprints', media: 'Media', cacheBrowser: 'Cache Browser', contentRecycleBin: 'Recycle Bin', @@ -1822,6 +1822,9 @@ export default { permissionsDefault: 'Default permissions', permissionsGranular: 'Granular permissions', permissionsGranularHelp: 'Set permissions for specific nodes', + permissionsEntityGroup_document: 'Content', + permissionsEntityGroup_media: 'Media', + permissionsEntityGroup_member: 'Member', profile: 'Profile', searchAllChildren: 'Search all children', languagesHelp: 'Limit the languages users have access to edit', @@ -2073,7 +2076,7 @@ export default { protectDescription: 'Setup access restrictions on %0%', rightsDescription: 'Setup Permissions on %0%', sortDescription: 'Change sort order for %0%', - createblueprintDescription: 'Create Content Template based on %0%', + createblueprintDescription: 'Create Content Blueprint based on %0%', openContextMenu: 'Open context menu for', currentLanguage: 'Current language', switchLanguage: 'Switch language to', @@ -2417,15 +2420,15 @@ export default { addColumnSpanOption: 'Add spanning %0% columns option', }, contentTemplatesDashboard: { - whatHeadline: 'What are Content Templates?', + whatHeadline: 'What are Content Blueprints?', whatDescription: - 'Content Templates are pre-defined content that can be selected when creating a new\n content node.\n ', - createHeadline: 'How do I create a Content Template?', + 'Content Blueprinta are pre-defined content that can be selected when creating a new\n content node.\n ', + createHeadline: 'How do I create a Content Blueprint?', createDescription: - '\n

There are two ways to create a Content Template:

\n \n

Once given a name, editors can start using the Content Template as a foundation for their new page.

\n ', - manageHeadline: 'How do I manage Content Templates?', + '\n

There are two ways to create a Content Blueprint:

\n \n

Once given a name, editors can start using the Content Blueprint as a foundation for their new page.

\n ', + manageHeadline: 'How do I manage Content Blueprints?', manageDescription: - 'You can edit and delete Content Templates from the "Content Templates" tree in the\n Settings section. Expand the Document Type which the Content Template is based on and click it to edit or delete\n it.\n ', + 'You can edit and delete Content Blueprints from the "Content Blueprints" tree in the\n Settings section. Expand the Document Type which the Content Blueprint is based on and click it to edit or delete\n it.\n ', }, preview: { endLabel: 'End', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index d6cc08b4c8..32e57dfdb8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -8,7 +8,7 @@ import * as serverHandlers from './handlers/server.handlers.js'; import { handlers as upgradeHandlers } from './handlers/upgrade.handlers.js'; import { handlers as userHandlers } from './handlers/user.handlers.js'; import { handlers as telemetryHandlers } from './handlers/telemetry.handlers.js'; -import { handlers as userGroupsHandlers } from './handlers/user-group.handlers.js'; +import { handlers as userGroupsHandlers } from './handlers/user-group/index.js'; import { handlers as examineManagementHandlers } from './handlers/examine-management.handlers.js'; import { handlers as modelsBuilderHandlers } from './handlers/modelsbuilder.handlers.js'; import { handlers as healthCheckHandlers } from './handlers/health-check.handlers.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts index c47a803edf..113799666c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts @@ -267,7 +267,12 @@ export const data: Array = parentId: null, propertyEditorAlias: 'Umbraco.EmailAddress', propertyEditorUiAlias: 'Umb.PropertyEditorUi.Email', - values: [], + values: [ + { + alias: 'inputMode', + value: 'email', + }, + ], }, { type: 'data-type', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts index 6be5d293fe..d6c442fe89 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts @@ -75,19 +75,10 @@ export class UmbEntityData extends UmbData { } delete(ids: Array) { - const deletedKeys = this.data - .filter((item) => { - if (!item.id) throw new Error('Item has no id'); - ids.includes(item.id); - }) - .map((item) => item.id); - this.data = this.data.filter((item) => { if (!item.id) throw new Error('Item has no id'); - ids.indexOf(item.id) === -1; + return !ids.includes(item.id); }); - - return deletedKeys; } updateData(updateItem: T) { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts index fd24e3d456..973dd02a2e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts @@ -2,7 +2,11 @@ import type { MediaDetails } from '../../packages/media/media/index.js'; import { UmbEntityTreeData } from './entity-tree.data.js'; import { UmbEntityData } from './entity.data.js'; import { createContentTreeItem } from './utils.js'; -import { ContentTreeItemResponseModel, PagedMediaTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + ContentTreeItemResponseModel, + MediaItemResponseModel, + PagedMediaTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ { @@ -183,6 +187,14 @@ export const data: Array = [ }, ]; +const createMediaItem = (item: MediaDetails): MediaItemResponseModel => { + return { + id: item.id, + name: item.name, + icon: item.icon, + }; +}; + // Temp mocked database // TODO: all properties are optional in the server schema. I don't think this is correct. // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -194,6 +206,11 @@ class UmbMediaData extends UmbEntityData { super(data); } + getItems(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); + return items.map((item) => createMediaItem(item)); + } + getTreeRoot(): PagedMediaTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createContentTreeItem(item)); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group.data.ts new file mode 100644 index 0000000000..4fea6c2999 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group.data.ts @@ -0,0 +1,78 @@ +import { UmbEntityData } from './entity.data.js'; +import { + UMB_USER_PERMISSION_DOCUMENT_CREATE, + UMB_USER_PERMISSION_DOCUMENT_DELETE, + UMB_USER_PERMISSION_DOCUMENT_READ, +} from '@umbraco-cms/backoffice/document'; +import { + PagedUserGroupResponseModel, + UserGroupItemResponseModel, + UserGroupResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +const createUserGroupItem = (item: UserGroupResponseModel): UserGroupItemResponseModel => { + return { + name: item.name, + id: item.id, + icon: item.icon, + }; +}; + +// Temp mocked database +class UmbUserGroupData extends UmbEntityData { + constructor(data: Array) { + super(data); + } + + getAll(): PagedUserGroupResponseModel { + return { + total: this.data.length, + items: this.data, + }; + } + + getItems(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); + return items.map((item) => createUserGroupItem(item)); + } + + /** + * Returns a list of permissions for the given user group ids + * @param {string[]} userGroupIds + * @return {*} {string[]} + * @memberof UmbUserGroupData + */ + getPermissions(userGroupIds: string[]): string[] { + const permissions = this.data + .filter((userGroup) => userGroupIds.includes(userGroup.id || '')) + .map((userGroup) => (userGroup.permissions?.length ? userGroup.permissions : [])) + .flat(); + + // Remove duplicates + return [...new Set(permissions)]; + } +} + +export const data: Array = [ + { + id: 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', + name: 'Administrators', + icon: 'umb:medal', + documentStartNodeId: 'all-property-editors-document-id', + permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE], + }, + { + id: '9d24dc47-a4bf-427f-8a4a-b900f03b8a12', + name: 'User Group 1', + icon: 'umb:bell', + permissions: [UMB_USER_PERMISSION_DOCUMENT_DELETE], + }, + { + id: 'f4626511-b0d7-4ab1-aebc-a87871a5dcfa', + name: 'User Group 2', + icon: 'umb:ball', + permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], + }, +]; + +export const umbUserGroupData = new UmbUserGroupData(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-groups.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-groups.data.ts deleted file mode 100644 index 968fb0919d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-groups.data.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UmbEntityData } from './entity.data.js'; -import { PagedUserGroupResponseModel, UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -// Temp mocked database -class UmbUserGroupsData extends UmbEntityData { - constructor(data: Array) { - super(data); - } - - getAll(): PagedUserGroupResponseModel { - return { - total: this.data.length, - items: this.data, - }; - } -} - -export const data: Array = [ - { - id: 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - name: 'Administrators', - icon: 'umb:medal', - }, -]; - -export const umbUserGroupsData = new UmbUserGroupsData(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/users.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user.data.ts similarity index 58% rename from src/Umbraco.Web.UI.Client/src/mocks/data/users.data.ts rename to src/Umbraco.Web.UI.Client/src/mocks/data/user.data.ts index c3ace50024..18dbc0ce37 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/users.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user.data.ts @@ -1,9 +1,23 @@ -import { UmbData } from './data.js'; +import { UmbEntityData } from './entity.data.js'; +import { umbUserGroupData } from './user-group.data.js'; import { UmbLoggedInUser } from '@umbraco-cms/backoffice/auth'; -import { PagedUserResponseModel, UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import { + PagedUserResponseModel, + UpdateUserGroupsOnUserRequestModel, + UserItemResponseModel, + UserResponseModel, + UserStateModel, +} from '@umbraco-cms/backoffice/backend-api'; + +const createUserItem = (item: UserResponseModel): UserItemResponseModel => { + return { + name: item.name, + id: item.id, + }; +}; // Temp mocked database -class UmbUsersData extends UmbData { +class UmbUserData extends UmbEntityData { constructor(data: UserResponseModel[]) { super(data); } @@ -15,12 +29,21 @@ class UmbUsersData extends UmbData { }; } - getById(id: string): UserResponseModel | undefined { - return this.data.find((user) => user.id === id); + getItems(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); + return items.map((item) => createUserItem(item)); + } + + setUserGroups(data: UpdateUserGroupsOnUserRequestModel): void { + const users = this.data.filter((user) => data.userIds?.includes(user.id ?? '')); + users.forEach((user) => { + user.userGroupIds = data.userGroupIds; + }); } getCurrentUser(): UmbLoggedInUser { const firstUser = this.data[0]; + const permissions = firstUser.userGroupIds?.length ? umbUserGroupData.getPermissions(firstUser.userGroupIds) : []; return { id: firstUser.id, @@ -33,79 +56,9 @@ class UmbUsersData extends UmbData { languages: [], contentStartNodeIds: firstUser.contentStartNodeIds, mediaStartNodeIds: firstUser.mediaStartNodeIds, - permissions: [], + permissions, }; } - - save(id: string, saveItem: UserResponseModel) { - const foundIndex = this.data.findIndex((item) => item.id === id); - if (foundIndex !== -1) { - // update - this.data[foundIndex] = saveItem; - this.updateData(saveItem); - } else { - // new - this.data.push(saveItem); - } - - return saveItem; - } - - protected updateData(updateItem: UserResponseModel) { - const itemIndex = this.data.findIndex((item) => item.id === updateItem.id); - const item = this.data[itemIndex]; - - console.log('updateData', updateItem, itemIndex, item); - - if (!item) return; - - const itemKeys = Object.keys(item); - const newItem = {}; - - for (const [key] of Object.entries(updateItem)) { - if (itemKeys.indexOf(key) !== -1) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - newItem[key] = updateItem[key]; - } - } - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this.data[itemIndex] = newItem; - - console.log('updateData', this.data[itemIndex]); - } - - // updateUserGroup(ids: string[], userGroup: string) { - // this.data.forEach((user) => { - // if (ids.includes(user.id)) { - // } else { - // } - - // this.updateData(user); - // }); - - // return this.data.map((user) => user.id); - // } - - // enable(ids: string[]) { - // const users = this.data.filter((user) => ids.includes(user.id)); - // users.forEach((user) => { - // user.status = 'enabled'; - // this.updateData(user); - // }); - // return users.map((user) => user.id); - // } - - // disable(ids: string[]) { - // const users = this.data.filter((user) => ids.includes(user.id)); - // users.forEach((user) => { - // user.status = 'disabled'; - // this.updateData(user); - // }); - // return users.map((user) => user.id); - // } } export const data: Array = [ @@ -124,7 +77,11 @@ export const data: Array = [ updateDate: '2/10/2022', createDate: '3/13/2022', failedLoginAttempts: 946, - userGroupIds: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'], + userGroupIds: [ + 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', + '9d24dc47-a4bf-427f-8a4a-b900f03b8a12', + 'f4626511-b0d7-4ab1-aebc-a87871a5dcfa', + ], }, { id: '82e11d3d-b91d-43c9-9071-34d28e62e81d', @@ -196,4 +153,4 @@ export const data: Array = [ }, ]; -export const umbUsersData = new UmbUsersData(data); +export const umbUsersData = new UmbUserData(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts index 874bb40a16..17bfb287f0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts @@ -1,5 +1,6 @@ const { rest } = window.MockServiceWorker; import { umbDictionaryData } from '../data/dictionary.data.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { ImportDictionaryRequestModel, DictionaryOverviewResponseModel, @@ -48,7 +49,7 @@ const overviewData: Array = [ // TODO: add schema export const handlers = [ - rest.get('/umbraco/management/api/v1/dictionary/:id', (req, res, ctx) => { + rest.get(umbracoPath('/dictionary/:id'), (req, res, ctx) => { const id = req.params.id as string; if (!id) return; @@ -56,7 +57,7 @@ export const handlers = [ return res(ctx.status(200), ctx.json(dictionary)); }), - rest.get('/umbraco/management/api/v1/dictionary', (req, res, ctx) => { + rest.get(umbracoPath('/dictionary'), (req, res, ctx) => { const skip = req.url.searchParams.get('skip'); const take = req.url.searchParams.get('take'); if (!skip || !take) return; @@ -74,25 +75,16 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.post('/umbraco/management/api/v1/dictionary', async (req, res, ctx) => { + rest.post(umbracoPath('/dictionary'), async (req, res, ctx) => { const data = await req.json(); + if (!data) return; data.icon = 'umb:book-alt'; data.hasChildren = false; data.type = 'dictionary-item'; - data.translations = [ - { - isoCode: 'en-US', - translation: '', - }, - { - isoCode: 'fr', - translation: '', - }, - ]; - const value = umbDictionaryData.save(data.id, data); + const value = umbDictionaryData.insert(data); const createdResult = { value, @@ -102,7 +94,7 @@ export const handlers = [ return res(ctx.status(200), ctx.json(createdResult)); }), - rest.patch('/umbraco/management/api/v1/dictionary/:id', async (req, res, ctx) => { + rest.patch(umbracoPath('/dictionary/:id'), async (req, res, ctx) => { const data = await req.json(); if (!data) return; @@ -115,7 +107,19 @@ export const handlers = [ return res(ctx.status(200), ctx.json(saved)); }), - rest.get('/umbraco/management/api/v1/tree/dictionary/root', (req, res, ctx) => { + rest.put(umbracoPath('/dictionary/:id'), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + const id = req.params.id as string; + if (!id) return; + + const saved = umbDictionaryData.save(id, data); + + return res(ctx.status(200), ctx.json(saved)); + }), + + rest.get(umbracoPath('/tree/dictionary/root'), (req, res, ctx) => { const items = umbDictionaryData.getTreeRoot(); const response = { total: items.length, @@ -124,7 +128,7 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get('/umbraco/management/api/v1/tree/dictionary/children', (req, res, ctx) => { + rest.get(umbracoPath('/tree/dictionary/children'), (req, res, ctx) => { const parentId = req.url.searchParams.get('parentId'); if (!parentId) return; @@ -138,7 +142,7 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get('/umbraco/management/api/v1/tree/dictionary/item', (req, res, ctx) => { + rest.get(umbracoPath('/tree/dictionary/item'), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; @@ -147,17 +151,17 @@ export const handlers = [ return res(ctx.status(200), ctx.json(items)); }), - rest.delete('/umbraco/management/api/v1/dictionary/:id', (req, res, ctx) => { + rest.delete(umbracoPath('/dictionary/:id'), (req, res, ctx) => { const id = req.params.id as string; if (!id) return; - const deletedKeys = umbDictionaryData.delete([id]); + umbDictionaryData.delete([id]); - return res(ctx.status(200), ctx.json(deletedKeys)); + return res(ctx.status(200)); }), // TODO => handle properly, querystring breaks handler - rest.get('/umbraco/management/api/v1/dictionary/:id/export', (req, res, ctx) => { + rest.get(umbracoPath('/dictionary/:id/export'), (req, res, ctx) => { const id = req.params.id as string; if (!id) return; @@ -165,18 +169,18 @@ export const handlers = [ const item = umbDictionaryData.getById(id); alert( - `Downloads file for dictionary "${item?.name}", ${includeChildren === 'true' ? 'with' : 'without'} children.` + `Downloads file for dictionary "${item?.name}", ${includeChildren === 'true' ? 'with' : 'without'} children.`, ); return res(ctx.status(200)); }), - rest.post('/umbraco/management/api/v1/dictionary/upload', async (req, res, ctx) => { + rest.post(umbracoPath('/dictionary/upload'), async (req, res, ctx) => { if (!req.arrayBuffer()) return; return res(ctx.status(200), ctx.json(uploadResponse)); }), - rest.post('/umbraco/management/api/v1/dictionary/import', async (req, res, ctx) => { + rest.post(umbracoPath('/dictionary/import'), async (req, res, ctx) => { const file = req.url.searchParams.get('file'); if (!file || !importResponse.id) return; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts index 4b15c2d898..6ec9a61774 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts @@ -1,8 +1,16 @@ const { rest } = window.MockServiceWorker; import { umbMediaData } from '../data/media.data.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: add schema export const handlers = [ + rest.get(umbracoPath('/media/item'), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbMediaData.getItems(ids); + return res(ctx.status(200), ctx.json(items)); + }), + rest.get('/umbraco/management/api/v1/media/details/:id', (req, res, ctx) => { console.warn('Please move to schema'); const id = req.params.id as string; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts index b51faa885a..12112a7b34 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts @@ -45,16 +45,17 @@ const detailHandlers: RestHandler>[] = [ rest.delete(umbracoPath('/partial-view'), (req, res, ctx) => { const path = req.url.searchParams.get('path'); if (!path) return res(ctx.status(400)); - const response = umbPartialViewsData.delete([path]); - return res(ctx.status(200), ctx.json(response)); + umbPartialViewsData.delete([path]); + return res(ctx.status(200)); }), + rest.put(umbracoPath('/partial-view'), (req, res, ctx) => { const requestBody = req.json() as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbPartialViewsData.updateData(requestBody); + umbPartialViewsData.updateData(requestBody); return res(ctx.status(200)); }), ]; const folderHandlers: RestHandler>[] = []; -export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers] \ No newline at end of file +export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group.handlers.ts deleted file mode 100644 index 571943d163..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group.handlers.ts +++ /dev/null @@ -1,21 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbUserGroupsData } from '../data/user-groups.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -const slug = '/user-group'; - -export const handlers = [ - rest.get(umbracoPath(`${slug}`), (req, res, ctx) => { - const response = umbUserGroupsData.getAll(); - - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const userGroup = umbUserGroupsData.getById(id); - - return res(ctx.status(200), ctx.json(userGroup)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/collection.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/collection.handlers.ts new file mode 100644 index 0000000000..56ffe6f449 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/collection.handlers.ts @@ -0,0 +1,11 @@ +const { rest } = window.MockServiceWorker; +import { umbUserGroupData } from '../../data/user-group.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const collectionHandlers = [ + rest.get(umbracoPath(`${slug}`), (req, res, ctx) => { + const response = umbUserGroupData.getAll(); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts new file mode 100644 index 0000000000..100493e1c8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts @@ -0,0 +1,44 @@ +const { rest } = window.MockServiceWorker; +import { umbUserGroupData } from '../../data/user-group.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(`${slug}`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + umbUserGroupData.insert(data); + + return res(ctx.status(200)); + }), + + rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + const dataType = umbUserGroupData.getById(id); + + return res(ctx.status(200), ctx.json(dataType)); + }), + + rest.put(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const data = await req.json(); + if (!data) return; + + umbUserGroupData.save(id, data); + + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + umbUserGroupData.delete([id]); + + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts new file mode 100644 index 0000000000..c49236b99a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts @@ -0,0 +1,5 @@ +import { collectionHandlers } from './collection.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; + +export const handlers = [...itemHandlers, ...collectionHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts new file mode 100644 index 0000000000..c0d7a0e52d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts @@ -0,0 +1,14 @@ +const { rest } = window.MockServiceWorker; +import { umbUserGroupData } from '../../data/user-group.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${slug}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbUserGroupData.getItems(ids); + + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/slug.ts new file mode 100644 index 0000000000..25f6d8e6d1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/slug.ts @@ -0,0 +1 @@ +export const slug = '/user-group'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user.handlers.ts index 9da37812be..175f439d69 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user.handlers.ts @@ -1,11 +1,28 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../data/users.data.js'; +import { umbUsersData } from '../data/user.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; const slug = '/user'; export const handlers = [ + rest.get(umbracoPath(`${slug}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbUsersData.getItems(ids); + + return res(ctx.status(200), ctx.json(items)); + }), + + rest.post(umbracoPath(`${slug}/set-user-groups`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + umbUsersData.setUserGroups(data); + + return res(ctx.status(200)); + }), + rest.get(umbracoPath(`${slug}/filter`), (req, res, ctx) => { //TODO: Implementer filter const response = umbUsersData.getAll(); @@ -23,7 +40,7 @@ export const handlers = [ ctx.status(200), ctx.json({ sections: ['Umb.Section.Content', 'Umb.Section.Media', 'Umb.Section.Settings', 'My.Section.Custom'], - }) + }), ); }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts index 59a3af5f4c..cc2a60b22b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts @@ -17,6 +17,7 @@ export * from './input-checkbox-list/index.js'; export * from './input-color/index.js'; export * from './input-eye-dropper/index.js'; export * from './input-list-base/index.js'; +export * from './input-markdown-editor/index.js'; export * from './input-multi-url/index.js'; export * from './input-tiny-mce/index.js'; export * from './input-number-range/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts index bb957c23c4..37350a2ee8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts @@ -61,7 +61,7 @@ export class UmbInputListBaseElement extends UmbLitElement { protected renderButton() { return html` - Add + ${this.localize.term('general_add')} `; } protected renderContent() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/index.ts new file mode 100644 index 0000000000..073c23b3cc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/index.ts @@ -0,0 +1 @@ +export * from './input-markdown.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts new file mode 100644 index 0000000000..e9202df63b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts @@ -0,0 +1,81 @@ +import { UmbCodeEditorElement, loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; +import { css, html, customElement, query, property } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +/** + * @element umb-input-markdown + * @fires change - when the value of the input changes + */ + +@customElement('umb-input-markdown') +export class UmbInputMarkdownElement extends FormControlMixin(UmbLitElement) { + protected getFormElement() { + return undefined; + } + + @property({ type: Boolean }) + preview?: boolean; + + #isCodeEditorReady = new UmbBooleanState(false); + isCodeEditorReady = this.#isCodeEditorReady.asObservable(); + + @query('umb-code-editor') + _codeEditor?: UmbCodeEditorElement; + + constructor() { + super(); + this.#loadCodeEditor(); + } + + async #loadCodeEditor() { + try { + await loadCodeEditor(); + this._codeEditor?.editor?.updateOptions({ + lineNumbers: false, + minimap: false, + folding: false, + }); + this.#isCodeEditorReady.next(true); + } catch (error) { + console.error(error); + } + } + + render() { + return html`
+ + ${this.renderPreview()}`; + } + + renderPreview() { + if (!this.preview) return; + return html`
TODO Preview
`; + } + + static styles = [ + css` + :host { + display: flex; + flex-direction: column; + } + #actions { + background-color: var(--uui-color-background-alt); + display: flex; + } + + umb-code-editor { + height: 200px; + border-radius: var(--uui-border-radius); + border: 1px solid var(--uui-color-divider-emphasis); + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-markdown': UmbInputMarkdownElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts new file mode 100644 index 0000000000..01056abb10 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts @@ -0,0 +1,13 @@ +import { Meta, StoryObj } from '@storybook/web-components'; +import './input-markdown.element.js'; +import type { UmbInputMarkdownElement } from './input-markdown.element.js'; + +const meta: Meta = { + title: 'Components/Inputs/Markdown', + component: 'umb-input-markdown', +}; + +export default meta; +type Story = StoryObj; + +export const Overview: Story = {}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts index a93649fa3e..73427c9aca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts @@ -1,11 +1,11 @@ import { UmbInputListBaseElement } from '../input-list-base/input-list-base.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UMB_SECTION_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { ManifestSection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-input-section') -export class UmbInputPickerSectionElement extends UmbInputListBaseElement { +export class UmbInputSectionElement extends UmbInputListBaseElement { @state() private _sections: Array = []; @@ -47,7 +47,7 @@ export class UmbInputPickerSectionElement extends UmbInputListBaseElement { label="remove" color="danger"> - ` + `, )} `; @@ -85,6 +85,6 @@ export class UmbInputPickerSectionElement extends UmbInputListBaseElement { declare global { interface HTMLElementTagNameMap { - 'umb-input-section': UmbInputPickerSectionElement; + 'umb-input-section': UmbInputSectionElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts index 30367b89ae..b39e4966d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts @@ -1,8 +1,8 @@ import { Meta, StoryObj } from '@storybook/web-components'; import './input-section.element.js'; -import type { UmbInputPickerSectionElement } from './input-section.element.js'; +import type { UmbInputSectionElement } from './input-section.element.js'; -const meta: Meta = { +const meta: Meta = { title: 'Components/Inputs/Section', component: 'umb-input-section', argTypes: { @@ -22,7 +22,7 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Overview: Story = { args: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts index 2a6e1f5d74..943dbe8d41 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts @@ -1,10 +1,14 @@ import type { SectionAliasConditionConfig } from './section-alias.condition.js'; import type { SwitchConditionConfig } from './switch.condition.js'; import type { WorkspaceAliasConditionConfig } from '@umbraco-cms/backoffice/workspace'; -import { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api'; +import type { UserPermissionConditionConfig } from '@umbraco-cms/backoffice/current-user'; +/* TODO: in theory should't the core package import from other packages. +Are there any other way we can do this? */ export type ConditionTypes = | SectionAliasConditionConfig | WorkspaceAliasConditionConfig | SwitchConditionConfig + | UserPermissionConditionConfig | UmbConditionConfigBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index ff6dcfd29c..65ba8fdb27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -28,6 +28,8 @@ import type { ManifestWorkspace } from './workspace.model.js'; import type { ManifestWorkspaceAction } from './workspace-action.model.js'; import type { ManifestWorkspaceEditorView } from './workspace-editor-view.model.js'; import type { ManifestWorkspaceViewCollection } from './workspace-view-collection.model.js'; +import type { ManifestUserPermission } from './user-permission.model.js'; +import type { ManifestUserGranularPermission } from './user-granular-permission.model.js'; import type { ManifestBase, ManifestBundle, @@ -65,6 +67,8 @@ export * from './workspace-action.model.js'; export * from './workspace-view-collection.model.js'; export * from './workspace-editor-view.model.js'; export * from './workspace.model.js'; +export * from './user-permission.model.js'; +export * from './user-granular-permission.model.js'; export type ManifestTypes = | ManifestBundle @@ -106,4 +110,6 @@ export type ManifestTypes = | ManifestWorkspaceAction | ManifestWorkspaceEditorView | ManifestWorkspaceViewCollection + | ManifestUserPermission + | ManifestUserGranularPermission | ManifestBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts new file mode 100644 index 0000000000..fc6698a802 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts @@ -0,0 +1,10 @@ +import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api'; + +export interface ManifestUserGranularPermission extends ManifestElement { + type: 'userGranularPermission'; + meta: MetaUserGranularPermission; +} + +export interface MetaUserGranularPermission { + entityType: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts new file mode 100644 index 0000000000..7a3b35a448 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -0,0 +1,15 @@ +import type { ManifestBase } from '@umbraco-cms/backoffice/extension-api'; + +export interface ManifestUserPermission extends ManifestBase { + type: 'userPermission'; + meta: MetaUserPermission; +} + +export interface MetaUserPermission { + entityType: string; + label?: string; + labelKey?: string; + description?: string; + descriptionKey?: string; + group?: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts index 26cadc7123..a87b2663fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts @@ -1,3 +1,6 @@ import './localize.element.js'; +import './localize-date.element.js'; +import './localize-number.element.js'; +import './localize-relative-time.element.js'; export * from './registry/localization.registry.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts new file mode 100644 index 0000000000..fba0090dc0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts @@ -0,0 +1,51 @@ +import { css, customElement, html, property, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +/** + * This element allows you to localize a date + * @element umb-localize-date + * @slot - The fallback value if the key is not found. + */ +@customElement('umb-localize-date') +export class UmbLocalizeDateElement extends UmbLitElement { + /** + * The date to localize. + * @attr + * @example date="Sep 22 2023" + */ + @property() + date!: string | Date; + + /** + * Formatting options + * @attr + * @example options={ dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' } + */ + @property() + options?: Intl.DateTimeFormatOptions; + + @state() + protected get text(): string { + return this.localize.date(this.date, this.options); + } + + protected render() { + return this.date + ? html`${unsafeHTML(this.text)}` + : html`` + } + + static styles = [ + css` + :host { + display: contents; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-localize-date': UmbLocalizeDateElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-number.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-number.element.ts new file mode 100644 index 0000000000..91a5169508 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-number.element.ts @@ -0,0 +1,51 @@ +import { css, customElement, html, property, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +/** + * This element allows you to localize a number + * @element umb-localize-number + * @slot - The fallback value if the key is not found. + */ +@customElement('umb-localize-number') +export class UmbLocalizeNumberElement extends UmbLitElement { + /** + * The number to localize. + * @attr + * @example number=1_000_000 + */ + @property() + number!: number | string; + + /** + * Formatting options + * @attr + * @example options={ style: 'currency', currency: 'EUR' } + */ + @property() + options?: Intl.NumberFormatOptions; + + @state() + protected get text(): string { + return this.localize.number(this.number, this.options); + } + + protected render() { + return this.number + ? html`${unsafeHTML(this.text)}` + : html`` + } + + static styles = [ + css` + :host { + display: contents; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-localize-number': UmbLocalizeNumberElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-relative-time.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-relative-time.element.ts new file mode 100644 index 0000000000..84e042e9fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-relative-time.element.ts @@ -0,0 +1,59 @@ +import { css, customElement, html, property, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +/** + * This element allows you to localize a relative time + * @element umb-localize-relative-time + * @slot - The fallback value if the key is not found. + */ +@customElement('umb-localize-relative-time') +export class UmbLocalizeRelativeTimeElement extends UmbLitElement { + /** + * The date to localize. + * @attr + * @example time=10 + */ + @property() + time!: number; + + /** + * Formatting options + * @attr + * @example options={ dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' } + */ + @property() + options?: Intl.RelativeTimeFormatOptions; + + /** + * Unit + * @attr + * @example unit='seconds' + */ + @property() + unit: Intl.RelativeTimeFormatUnit = 'seconds'; + + @state() + protected get text(): string { + return this.localize.relativeTime(this.time, this.unit, this.options); + } + + protected render() { + return this.time + ? html`${unsafeHTML(this.text)}` + : html`` + } + + static styles = [ + css` + :host { + display: contents; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-localize-relative-time': UmbLocalizeRelativeTimeElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts index ba1efaeb01..8b30164757 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts @@ -9,7 +9,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-localize') export class UmbLocalizeElement extends UmbLitElement { /** - * The key to localize. The key is case sensitive. + * The key to localize. The key is case sensitive. * @attr * @example key="general_ok" */ @@ -33,7 +33,7 @@ export class UmbLocalizeElement extends UmbLitElement { */ @property() debug = false; - + @state() protected get text(): string { const localizedValue = this.localize.term(this.key, ...(this.args ?? [])); @@ -50,11 +50,11 @@ export class UmbLocalizeElement extends UmbLitElement { } protected render() { - return this.text + return this.text.trim() ? html`${unsafeHTML(this.text)}` : this.debug - ? html`${this.key}` - : html``; + ? html`${this.key}` + : html``; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts new file mode 100644 index 0000000000..cacdb22527 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -0,0 +1,112 @@ +import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { + UmbEntityUserPermissionSettingsModalData, + UmbEntityUserPermissionSettingsModalResult, + UmbModalContext, +} from '@umbraco-cms/backoffice/modal'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { ManifestUserPermission, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; + +@customElement('umb-entity-user-permission-settings-modal') +export class UmbEntityUserPermissionSettingsModalElement extends UmbLitElement { + @property({ attribute: false }) + modalContext?: UmbModalContext; + + @property({ type: Object }) + data?: UmbEntityUserPermissionSettingsModalData; + + @state() + private _userPermissionManifests: Array = []; + + private _handleConfirm() { + this.modalContext?.submit(); + } + + private _handleCancel() { + this.modalContext?.reject(); + } + + constructor() { + super(); + this.observe( + umbExtensionsRegistry.extensionsOfType('userPermission'), + (userPermissionManifests) => (this._userPermissionManifests = userPermissionManifests), + ); + } + + render() { + return html` + + + Render user permissions for ${this.data?.entityType} ${this.data?.unique} + ${this._userPermissionManifests.map((permission) => this.#renderPermission(permission))} + + Cancel + + + + `; + } + + #onChangeUserPermission(event: UUIBooleanInputEvent, userPermissionManifest: ManifestUserPermission) { + console.log(userPermissionManifest); + console.log(event.target.checked); + } + + #isAllowed(userPermissionManifest: ManifestUserPermission) { + return true; + //return this._userGroup?.permissions?.includes(userPermissionManifest.alias); + } + + #renderPermission(userPermissionManifest: ManifestUserPermission) { + return html`
+ this.#onChangeUserPermission(event, userPermissionManifest)}> +
+
${userPermissionManifest.meta.label}
+ ${userPermissionManifest.meta.description} +
+
+
`; + } + + static styles = [ + UmbTextStyles, + css` + .permission-toggle { + display: flex; + align-items: center; + border-bottom: 1px solid var(--uui-color-divider); + padding: var(--uui-size-space-3) 0 var(--uui-size-space-4) 0; + } + + .permission-meta { + margin-left: var(--uui-size-space-4); + line-height: 1.2em; + } + + .permission-name { + font-weight: bold; + } + `, + ]; +} + +export default UmbEntityUserPermissionSettingsModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-entity-user-permission-modal': UmbEntityUserPermissionSettingsModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts index 6d7044fd52..9f8b55d4f9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts @@ -61,6 +61,12 @@ const modals: Array = [ name: 'Tree Picker Modal', loader: () => import('./tree-picker/tree-picker-modal.element.js'), }, + { + type: 'modal', + alias: 'Umb.Modal.EntityUserPermissionSettings', + name: 'Entity User Permission Settings Modal', + loader: () => import('./entity-user-permission-settings/entity-user-permission-settings-modal.element.js'), + }, ]; export const manifests = [...modals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts index e0199b2663..3ecae28a7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts @@ -1,9 +1,10 @@ import type { UmbTreeElement } from '../../../tree/tree.element.js'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbTreePickerModalData, UmbPickerModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbSelectedEvent } from '@umbraco-cms/backoffice/events'; @customElement('umb-tree-picker-modal') export class UmbTreePickerModalElement extends UmbModalBaseElement< @@ -27,6 +28,7 @@ export class UmbTreePickerModalElement; +} + +export type UmbEntityUserPermissionSettingsModalResult = undefined; + +export const UMB_ENTITY_USER_PERMISSION_MODAL = new UmbModalToken< + UmbEntityUserPermissionSettingsModalData, + UmbEntityUserPermissionSettingsModalResult +>('Umb.Modal.EntityUserPermissionSettings', { + type: 'sidebar', +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts index 63163c3cb8..6871d578f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts @@ -33,3 +33,4 @@ export * from './data-type-picker-modal.token.js'; export * from './workspace-modal.token.js'; export * from './data-type-picker-flow-modal.token.js'; export * from './data-type-picker-flow-data-type-picker-modal.token.js'; +export * from './entity-user-permission-settings-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts index 2800d55146..a77b907fee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts @@ -83,9 +83,6 @@ export class UmbPickerInputContext } async requestRemoveItem(unique: string) { - await this.#init; - if (!this.repository) throw new Error('Repository is not initialized'); - // TODO: id won't always be available on the model, so we need to get the unique property from somewhere. Maybe the repository? const item = this.#itemManager.getItems().find((item) => this.#getUnique(item) === unique); if (!item) throw new Error('Could not find item with unique: ' + unique); @@ -104,5 +101,6 @@ export class UmbPickerInputContext #removeItem(unique: string) { const newSelection = this.getSelection().filter((value) => value !== unique); this.setSelection(newSelection); + this.host.dispatchEvent(new UmbChangeEvent()); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts index a101f8c1e8..e578e919a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts @@ -1,8 +1,9 @@ -import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { UmbInputMarkdownElement } from '@umbraco-cms/backoffice/components'; /** * @element umb-property-editor-ui-markdown-editor @@ -15,11 +16,24 @@ export class UmbPropertyEditorUIMarkdownEditorElement @property() value = ''; + @state() + private _preview?: boolean; + @property({ attribute: false }) - public config?: UmbPropertyEditorConfigCollection; + public set config(config: UmbPropertyEditorConfigCollection | undefined) { + this._preview = config?.getValueByAlias('preview'); + } + + #onChange(e: Event) { + this.value = (e.target as UmbInputMarkdownElement).value as string; + this.dispatchEvent(new CustomEvent('property-value-change')); + } render() { - return html`
umb-property-editor-ui-markdown-editor
`; + return html``; } static styles = [UmbTextStyles]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/text-box/property-editor-ui-text-box.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/text-box/property-editor-ui-text-box.element.ts index a03b55a591..e7abbf0dcc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/text-box/property-editor-ui-text-box.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/text-box/property-editor-ui-text-box.element.ts @@ -1,29 +1,36 @@ import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; + +type UuiInputTypeType = typeof UUIInputElement.prototype.type; @customElement('umb-property-editor-ui-text-box') export class UmbPropertyEditorUITextBoxElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { - #defaultType = 'text'; + #defaultType: UuiInputTypeType = 'text'; @property() value = ''; @state() - private _type?: string; + private _type: UuiInputTypeType = this.#defaultType; + + @state() + private _inputMode?: string; @state() private _maxChars?: number; @property({ attribute: false }) public set config(config: UmbPropertyEditorConfigCollection | undefined) { - this._type = config?.getValueByAlias('inputType') ?? this.#defaultType; + this._type = config?.getValueByAlias('inputType') ?? this.#defaultType; + this._inputMode = config?.getValueByAlias('inputMode'); this._maxChars = config?.getValueByAlias('maxChars'); } - private onInput(e: InputEvent) { + private onChange(e: Event) { this.value = (e.target as HTMLInputElement).value; this.dispatchEvent(new CustomEvent('property-value-change')); } @@ -31,9 +38,10 @@ export class UmbPropertyEditorUITextBoxElement extends UmbLitElement implements render() { return html``; + .type=${this._type} + inputMode=${ifDefined(this._inputMode)} + maxlength=${ifDefined(this._maxChars)} + @change=${this.onChange}>`; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/collection-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/collection-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/collection-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/collection-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/copy-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/copy-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/copy-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/collection-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/collection-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/collection-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/collection-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/copy-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/copy-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/copy-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/copy-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/data-source-response.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/data-source-response.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/data-source-response.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/data-source-response.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/data-source.interface.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/data-source.interface.ts index 23689c83d9..c029560648 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/data-source.interface.ts @@ -5,11 +5,11 @@ export interface UmbDataSource< CreateResponseType, UpdateRequestType, ResponseType, - CreateScaffoldPresetType = Partial + CreateScaffoldPresetType = Partial, > { createScaffold( parentId: string | null, - preset?: Partial | CreateScaffoldPresetType + preset?: Partial | CreateScaffoldPresetType, ): Promise>; get(unique: string): Promise>; insert(data: CreateRequestType): Promise>; diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-paged-response-data.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-paged-response-data.function.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-paged-response-data.function.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-paged-response-data.function.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-paged-response-data.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-paged-response-data.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-paged-response-data.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-paged-response-data.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-response-data.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-response-data.function.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-response-data.function.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-response-data.function.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-response-data.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-response-data.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/extend-data-source-response-data.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/extend-data-source-response-data.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/folder-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/item-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/item-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/item-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/item-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/move-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/move-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/move-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/move-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/data-source/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/tree-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/data-source/tree-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/tree-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/detail-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/detail-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/folder-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/item-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/item-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/item-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/move-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move-repository.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/repository/move-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/move-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/repository/repository-items.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-items.manager.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/shared/repository/repository-items.manager.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-items.manager.ts index 75f08fb040..991d1aa290 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/repository/repository-items.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-items.manager.ts @@ -29,7 +29,7 @@ export class UmbRepositoryItemsManager string | undefined + getUniqueMethod?: (entry: ItemType) => string | undefined, ) { this.host = host; this.#getUnique = getUniqueMethod || ((entry) => entry.id || ''); @@ -46,8 +46,13 @@ export class UmbRepositoryItemsManager + +# Drag and Drop + +Drag and Drop can be done by using the `UmbSorterController` + +To get started using drag and drop, finish the following steps: + +- Preparing the model +- Setting the configuration +- Registering the controller + +#### Preparing the model + +The SorterController needs a model to know what item it is we are dealing with. + +```typescript +type MySortEntryType = { + id: string; + value: string; +}; + +const awesomeModel: Array = [ + { + id: '0', + value: 'Entry 0', + }, + { + id: '1', + value: 'Entry 1', + }, + { + id: '2', + value: 'Entry 2', + }, +]; +``` + +#### Setting the configuration + +When you know the model of which that is being sorted, you can set up the configuration. +The configuration has a lot of optional options, but the required ones are: + +- compareElementToModel() +- querySelectModelToElement() +- identifier +- itemSelector +- containerSelector + +It can be set up as following: + +```typescript +import { UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; + +type MySortEntryType = {...} +const awesomeModel: Array = [...] + +const MY_SORTER_CONFIG: UmbSorterConfig = { + compareElementToModel: (element: HTMLElement, model: MySortEntryType) => { + return element.getAttribute('data-sort-entry-id') === model.id; + }, + querySelectModelToElement: (container: HTMLElement, modelEntry: MySortEntryType) => { + return container.querySelector('data-sort-entry-id=[' + modelEntry.id + ']'); + }, + identifier: 'test-sorter', + itemSelector: 'li', + containerSelector: 'ul', +}; + +export class MyElement extends UmbElementMixin(LitElement) { + + render() { + return html` +
    + ${awesomeModel.map( + (entry) => + html`
  • + ${entry.value} +
  • `, + )} +
+ `; + } +} +``` + +#### Registering the controller + +When the model and configuration are available we can register the controller and tell the controller what model we are using. + +```typescript +import { UmbSorterController, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; + +type MySortEntryType = {...} +const awesomeModel: Array = [...] +const MY_SORTER_CONFIG: UmbSorterConfig = {...} + + +export class MyElement extends UmbElementMixin(LitElement) { + #sorter = new UmbSorterController(this, MY_SORTER_CONFIG); + + constructor() { + this.#sorter.setModel(awesomeModel); + } + + render() { + return html` +
    + ${awesomeModel.map( + (entry) => + html`
  • + ${entry.value} +
  • `, + )} +
+ `; + } +} +``` + +### Placeholder + +While dragging an entry, the entry will get an additional class that can be styled. +The class is by default `--umb-sorter-placeholder` but can be changed via the configuration to a different value. + +```typescript +const MY_SORTER_CONFIG: UmbSorterConfig = { + ... + placeholderClass: 'dragging-now', +}; +``` + +```typescript + static styles = [ + css` + li { + display:relative; + } + + li.dragging-now span { + visibility: hidden; + } + + li.dragging-now::after { + content: ''; + position: absolute; + inset: 0px; + border: 1px dashed grey; + } + `, +]; +``` + +### Horizontal sorting + +By default, the sorter controller will sort vertically. You can sort your model horizontally by setting the `resolveVerticalDirection` to return false. + +```typescript +const MY_SORTER_CONFIG: UmbSorterConfig = { + ... + resolveVerticalDirection: () => return false, +}; +``` + +### Performing logic when using the controller (TODO: Better title) + +Let's say your model has a property sortOrder that you would like to update when the entry is being sorted. +You can add your code logic in the configuration option `performItemInsert` and `performItemRemove` + +```typescript +export class MyElement extends UmbElementMixin(LitElement) { + #sorter = new UmbSorterController(this, { + ...SORTER_CONFIG, + performItemInsert: ({ item, newIndex }) => { + console.log(item, newIndex); + // Perform some logic here to calculate the new sortOrder & save it. + return true; + }, + performItemRemove: () => true, + }); +} +``` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/test-sorter-controller.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/test-sorter-controller.element.ts index c6843e234b..6ad3b41ad1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/test-sorter-controller.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/stories/test-sorter-controller.element.ts @@ -1,24 +1,23 @@ import { UmbSorterConfig, UmbSorterController } from '../sorter.controller.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; type SortEntryType = { id: string; value: string; }; -const sorterConfig: UmbSorterConfig = { +const SORTER_CONFIG: UmbSorterConfig = { compareElementToModel: (element: HTMLElement, model: SortEntryType) => { return element.getAttribute('data-sort-entry-id') === model.id; }, querySelectModelToElement: (container: HTMLElement, modelEntry: SortEntryType) => { - return container.querySelector('data-sort-entry-id[' + modelEntry.id + ']'); + return container.querySelector('data-sort-entry-id=[' + modelEntry.id + ']'); }, identifier: 'test-sorter', itemSelector: 'li', containerSelector: 'ul', }; - const model: Array = [ { id: '0', @@ -38,18 +37,35 @@ const model: Array = [ export default class UmbTestSorterControllerElement extends UmbLitElement { public sorter; + @state() + private vertical = true; + constructor() { super(); - - this.sorter = new UmbSorterController(this, sorterConfig); + this.sorter = new UmbSorterController(this, { + ...SORTER_CONFIG, + resolveVerticalDirection: () => { + this.vertical ? true : false; + }, + }); this.sorter.setModel(model); } + #toggle() { + this.vertical = !this.vertical; + } + render() { return html` -
    + + Horizontal/Vertical + +
      ${model.map( - (entry) => html`
    • ${entry.value}
    • ` + (entry) => + html`
    • + ${entry.value} +
    • `, )}
    `; @@ -59,39 +75,47 @@ export default class UmbTestSorterControllerElement extends UmbLitElement { css` :host { display: block; + box-sizing: border-box; } ul { + display: flex; + flex-direction: column; + gap: 5px; list-style: none; padding: 0; - margin: 0; + margin: 10px 0; + } + + ul.horizontal { + flex-direction: row; } li { + cursor: grab; + position: relative; + flex: 1; + border-radius: var(--uui-border-radius); + } + + li span { + display: flex; + align-items: center; + gap: 5px; padding: 10px; - margin: 5px; - background: #eee; + background-color: rgba(0, 255, 0, 0.3); } - li:hover { - background: #ddd !important; - cursor: move; + li.--umb-sorter-placeholder span { + visibility: hidden; } - li:active { - background: #ccc; - } - - #sort0 { - background: #f00; - } - - #sort1 { - background: #0f0; - } - - #sort2 { - background: #c9da10; + li.--umb-sorter-placeholder::after { + content: ''; + position: absolute; + inset: 0px; + border-radius: var(--uui-border-radius); + border: 1px dashed var(--uui-color-divider-emphasis); } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index ef94d2f024..1e9c5fe3a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -1,12 +1,12 @@ -import { Observable, map } from '@umbraco-cms/backoffice/external/rxjs'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbPagedData, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { ManifestTree, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { createExtensionClass } from '@umbraco-cms/backoffice/extension-api'; import { ProblemDetails, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; import { UmbSelectionManagerBase } from '@umbraco-cms/backoffice/utils'; +import { UmbSelectedEvent } from '@umbraco-cms/backoffice/events'; // TODO: update interface export interface UmbTreeContext extends UmbBaseController { @@ -102,12 +102,12 @@ export class UmbTreeContextBase public select(unique: string | null) { if (!this.getSelectable()) return; this.#selectionManager.select(unique); - this._host.getHostElement().dispatchEvent(new CustomEvent('selected')); + this._host.getHostElement().dispatchEvent(new UmbSelectedEvent()); } public deselect(unique: string | null) { this.#selectionManager.deselect(unique); - this._host.getHostElement().dispatchEvent(new CustomEvent('selected')); + this._host.getHostElement().dispatchEvent(new UmbSelectedEvent()); } public async requestTreeRoot() { @@ -144,7 +144,7 @@ export class UmbTreeContextBase if (!treeManifest) return; this.#observeRepository(treeManifest); }, - '_observeTreeManifest' + '_observeTreeManifest', ); } } @@ -166,7 +166,7 @@ export class UmbTreeContextBase throw new Error('Could not create repository with alias: ' + repositoryAlias + ''); } }, - '_observeRepository' + '_observeRepository', ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index de7c270b54..aa06b67efa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -119,7 +119,7 @@ export class UmbTreeElement extends UmbLitElement { this._items, // TODO: use unique here: (item, index) => item.name + '___' + index, - (item) => html`` + (item) => html``, )} `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/index.ts index 3bcae218c6..5835784021 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/index.ts @@ -2,3 +2,4 @@ export * from './input.event.js'; export * from './change.event.js'; export * from './delete.event.js'; export * from './executed.event.js'; +export * from './selected.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/selected.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/selected.event.ts new file mode 100644 index 0000000000..9ecf5d7767 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/umb-events/selected.event.ts @@ -0,0 +1,6 @@ +export class UmbSelectedEvent extends Event { + public constructor() { + // mimics the native change event + super('selected', { bubbles: true, composed: false, cancelable: false }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboards/dictionary/dashboard-localization-dictionary.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboards/dictionary/dashboard-localization-dictionary.element.ts index 4fb93e300d..9f9831a07d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboards/dictionary/dashboard-localization-dictionary.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboards/dictionary/dashboard-localization-dictionary.element.ts @@ -1,15 +1,9 @@ import { UmbDictionaryRepository } from '../../dictionary/repository/dictionary.repository.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbTableConfig, UmbTableColumn, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DictionaryOverviewResponseModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CREATE_DICTIONARY_MODAL, -} from '@umbraco-cms/backoffice/modal'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-dashboard-translation-dictionary') export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { @@ -25,8 +19,6 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { #repo!: UmbDictionaryRepository; - #modalContext!: UmbModalManagerContext; - #tableItems: Array = []; #tableColumns: Array = []; @@ -35,10 +27,6 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { constructor() { super(); - - new UmbContextConsumerController(this, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; - }); } async connectedCallback() { @@ -66,7 +54,7 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { #setTableColumns() { this.#tableColumns = [ { - name: 'Name', + name: this.localize.term('general_name'), alias: 'name', }, ]; @@ -92,7 +80,7 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { columnAlias: 'name', value: html` + href="section/dictionary/workspace/dictionary-item/edit/${dictionary.id}"> ${dictionary.name} `, }, @@ -107,11 +95,11 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { value: dictionary.translatedIsoCodes?.includes(l.isoCode) ? html`` : html``, }); }); @@ -123,41 +111,27 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { } #filter(e: { target: HTMLInputElement }) { - this._tableItemsFiltered = e.target.value - ? this.#tableItems.filter((t) => t.id.includes(e.target.value)) + const searchValue = e.target.value.toLocaleLowerCase(); + this._tableItemsFiltered = searchValue + ? this.#tableItems.filter((t) => t.id.toLocaleLowerCase().includes(searchValue)) : this.#tableItems; } - async #create() { - // TODO: what to do if modal service is not available? - if (!this.#modalContext) return; - if (!this.#repo) return; - - const modalContext = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { parentId: null }); - - const { name, parentId } = await modalContext.onSubmit(); - if (!name || parentId === undefined) return; - - const { data: url } = await this.#repo.create({ name, parentId }); - - if (!url) return; - //TODO: Why do we need to extract the id like this? - const id = url.substring(url.lastIndexOf('/') + 1); - - history.pushState({}, '', `/section/dictionary/workspace/dictionary-item/edit/${id}`); - } - render() { return html` @@ -108,54 +100,61 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { #renderLeftColumn() { if (!this._userGroup) return nothing; - return html` -
    Assign access
    - + return html` + +
    + this.#onSectionsChange(e.target.value)}> + @change=${this.#onSectionsChange}> - CONTENT START NODE PICKER NOT IMPLEMENTED YET + label=${this.localize.term('defaultdialogs_selectContentStartNode')} + description=${this.localize.term('user_startnodehelp')}> + - MEDIA START NODE PICKER NOT IMPLEMENTED YET + label=${this.localize.term('defaultdialogs_selectMediaStartNode')} + description=${this.localize.term('user_mediastartnodehelp')}> +
    -
    Default Permissions
    - PERMISSIONS NOT IMPLEMENTED YET +
    +
    + + `; } #renderRightColumn() { return html` -
    Users
    - - this.#onUsersChange((e.target as any).selectedIds)} - .selectedIds=${this._userKeys ?? []}> +
    +
    - -
    Delete user group
    - -
    `; + + `; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts index 04b1193c9a..d750f28faf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts @@ -55,7 +55,7 @@ export class UmbUserGroupWorkspaceContext getEntityId(): string | undefined { throw new Error('Method not implemented.'); } - + getEntityType(): string { return 'user-group'; } @@ -63,6 +63,7 @@ export class UmbUserGroupWorkspaceContext getData(): UserGroupResponseModel | undefined { throw new Error('Method not implemented.'); } + async save() { if (!this.#data.value) return; @@ -104,10 +105,34 @@ export class UmbUserGroupWorkspaceContext updateUserKeys(keys: Array) { this.#userIds.next(keys); } + + /** + * Adds a permission to the user group permission array. + * @param {string} permissionAlias + * @memberof UmbUserGroupWorkspaceContext + */ + addPermission(permissionAlias: string) { + const permissions = this.#data.getValue()?.permissions ?? []; + const newValue = [...permissions, permissionAlias]; + this.#data.update({ permissions: newValue }); + } + + /** + * Removes a permission from the user group permission array. + * @param {string} permissionAlias + * @memberof UmbUserGroupWorkspaceContext + */ + removePermission(permissionAlias: string) { + const permissions = this.#data.getValue()?.permissions ?? []; + const newValue = permissions.filter((alias) => alias !== permissionAlias); + this.#data.update({ permissions: newValue }); + } } - -export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbUserGroupWorkspaceContext +>( 'UmbWorkspaceContext', - (context): context is UmbUserGroupWorkspaceContext => context.getEntityType?.() === 'user-group' + (context): context is UmbUserGroupWorkspaceContext => context.getEntityType?.() === 'user-group', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.element.ts index d4064d4457..861d9e3ebf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.element.ts @@ -1,6 +1,6 @@ import { UmbUserGroupWorkspaceContext } from './user-group-workspace.context.js'; import { UmbUserGroupWorkspaceEditorElement } from './user-group-workspace-editor.element.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @@ -22,7 +22,7 @@ export class UmbUserGroupWorkspaceElement extends UmbLitElement { new UmbWorkspaceIsNewRedirectController( this, this.#workspaceContext, - this.shadowRoot!.querySelector('umb-router-slot')! + this.shadowRoot!.querySelector('umb-router-slot')!, ); }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/user-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/user-collection-header.element.ts index c16f51b9e3..2f190f9f5b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/user-collection-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/user-collection-header.element.ts @@ -117,20 +117,21 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement { return html` - +
    - State: ${this._stateFilterSelection} + : +
    ${this._stateFilterOptions.map( (option) => html`` @@ -140,19 +141,25 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement { - Group: + + : + +
    - - - - + + + + + +
    - - Order By: ${this._orderBy} + + : + ${this._orderBy}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/grid/user-collection-grid-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/grid/user-collection-grid-view.element.ts index 11ad468214..7d9df20e55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/grid/user-collection-grid-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/grid/user-collection-grid-view.element.ts @@ -1,4 +1,4 @@ -import { getLookAndColorFromUserStatus } from '../../../../utils.js'; +import { getDisplayStateFromUserStatus } from '../../../../utils.js'; import { UmbUserCollectionContext } from '../../user-collection.context.js'; import { type UmbUserDetail } from '../../../types.js'; import { css, html, nothing, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; @@ -63,24 +63,24 @@ export class UmbUserCollectionGridViewElement extends UmbLitElement { return nothing; } - const statusLook = getLookAndColorFromUserStatus(user.state); + const statusLook = getDisplayStateFromUserStatus(user.state); return html` - ${user.state} + `; } #renderUserLoginDate(user: UmbUserDetail) { if (!user.lastLoginDate) { - return html``; + return html``; } return html``; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts index 477631e48f..c8d4bbf3f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts @@ -1,4 +1,4 @@ -import { getLookAndColorFromUserStatus } from '../../../../../../utils.js'; +import { getDisplayStateFromUserStatus } from '../../../../../../utils.js'; import { html, LitElement, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-user-table-status-column-layout') @@ -10,8 +10,8 @@ export class UmbUserTableStatusColumnLayoutElement extends LitElement { return html`${this.value.status && this.value.status !== 'enabled' ? html` + look="${getDisplayStateFromUserStatus(this.value.status).look}" + color="${getDisplayStateFromUserStatus(this.value.status).color}"> ${this.value.status} ` : nothing}`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/components/index.ts index 9166992fcc..2a4312053b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/components/index.ts @@ -1 +1,5 @@ import './user-input/user-input.element.js'; +import './user-permission-setting/user-permission-setting.element.js'; + +export * from './user-input/user-input.element.js'; +export * from './user-permission-setting/user-permission-setting.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/components/user-input/user-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/components/user-input/user-input.element.ts index 69db7f7311..15d6f274b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/components/user-input/user-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/components/user-input/user-input.element.ts @@ -1,5 +1,5 @@ import { UmbUserPickerContext } from './user-input.context.js'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -76,13 +76,13 @@ export class UmbUserInputElement extends FormControlMixin(UmbLitElement) { this.addValidator( 'rangeUnderflow', () => this.minMessage, - () => !!this.min && this.#pickerContext.getSelection().length < this.min + () => !!this.min && this.#pickerContext.getSelection().length < this.min, ); this.addValidator( 'rangeOverflow', () => this.maxMessage, - () => !!this.max && this.#pickerContext.getSelection().length > this.max + () => !!this.max && this.#pickerContext.getSelection().length > this.max, ); this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); @@ -105,7 +105,7 @@ export class UmbUserInputElement extends FormControlMixin(UmbLitElement) { private _renderItem(item: UserItemResponseModel) { if (!item.id) return; return html` - + this.#pickerContext.requestRemoveItem(item.id!)} label="Remove ${item.name}" >Remove + +
    +
    ${this.label}
    + ${this.description} +
    +
    +
    `; + } + + static styles = [ + UmbTextStyles, + css` + #setting { + display: flex; + align-items: center; + border-bottom: 1px solid var(--uui-color-divider); + padding: var(--uui-size-space-3) 0 var(--uui-size-space-4) 0; + } + + #meta { + margin-left: var(--uui-size-space-4); + line-height: 1.2em; + } + + #name { + font-weight: bold; + } + `, + ]; +} + +export default UmbUserPermissionSettingElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-user-permission-setting': UmbUserPermissionSettingElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/index.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/index.ts index d4702960d5..966b5e5d2d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/index.ts @@ -1 +1,3 @@ +export * from './components/index.js'; +export * from './repository/index.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/modals/user-picker/user-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/modals/user-picker/user-picker-modal.element.ts index 9196cf8391..52f6217bec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/modals/user-picker/user-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/modals/user-picker/user-picker-modal.element.ts @@ -1,46 +1,34 @@ import { UmbUserRepository } from '../../repository/user.repository.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement, state, ifDefined, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { UmbUserPickerModalData, UmbUserPickerModalResult } from '@umbraco-cms/backoffice/modal'; -import { createExtensionClass } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { UmbSelectionManagerBase } from '@umbraco-cms/backoffice/utils'; -import { type UmbUserDetail } from '@umbraco-cms/backoffice/users'; +import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-picker-modal') export class UmbUserPickerModalElement extends UmbModalBaseElement { @state() - private _users: Array = []; + private _users: Array = []; #selectionManager = new UmbSelectionManagerBase(); - #userRepository?: UmbUserRepository; + #userRepository = new UmbUserRepository(this); - constructor() { - super(); + connectedCallback(): void { + super.connectedCallback(); - // TODO: this code is reused in multiple places, so it should be extracted to a function - new UmbObserverController( - this, - umbExtensionsRegistry.getByTypeAndAlias('repository', 'Umb.Repository.User'), - async (repositoryManifest) => { - if (!repositoryManifest) return; - - try { - const result = await createExtensionClass(repositoryManifest, [this]); - this.#userRepository = result; - this.#observeUsers(); - } catch (error) { - throw new Error('Could not create repository with alias: Umb.Repository.User'); - } - } - ); + // TODO: in theory this config could change during the lifetime of the modal, so we could observe it + this.#selectionManager.setMultiple(this.data?.multiple ?? false); + this.#selectionManager.setSelection(this.data?.selection ?? []); } - async #observeUsers() { + protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { + super.firstUpdated(_changedProperties); + this.#requestUsers(); + } + + async #requestUsers() { if (!this.#userRepository) return; - // TODO is this the correct end point? const { data } = await this.#userRepository.requestCollection(); if (data) { @@ -63,14 +51,14 @@ export class UmbUserPickerModalElement extends UmbModalBaseElement html` this.#selectionManager.select(user.id!)} @deselected=${() => this.#selectionManager.deselect(user.id!)} ?selected=${this.#selectionManager.isSelected(user.id!)}> - + - ` + `, )}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/index.ts new file mode 100644 index 0000000000..238844e8bf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/index.ts @@ -0,0 +1 @@ +export * from './user.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts index 02aeb397b7..946820c8ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts @@ -80,7 +80,7 @@ export class UmbUserRepository } // COLLECTION - async requestCollection(filter: UmbUserCollectionFilterModel = { skip: 0, take: 100 }) { + async requestCollection(filter: UmbUserCollectionFilterModel = { skip: 0, take: 100000 }) { //TODO: missing observable return this.#collectionSource.filterCollection(filter); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts index 6904a3a8e9..ed3b4afb6b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts @@ -1,8 +1,7 @@ -import { getLookAndColorFromUserStatus } from '../../utils.js'; -import { UmbUserRepository } from '../repository/user.repository.js'; -import { UmbUserGroupInputElement } from '../../user-groups/components/input-user-group/user-group-input.element.js'; +import { getDisplayStateFromUserStatus } from '../../utils.js'; import { type UmbUserDetail } from '../index.js'; import { UmbUserWorkspaceContext } from './user-workspace.context.js'; +import { UmbUserRepository } from '@umbraco-cms/backoffice/users'; import { UUIInputElement, UUIInputEvent, UUISelectElement } from '@umbraco-cms/backoffice/external/uui'; import { css, @@ -15,18 +14,14 @@ import { repeat, } from '@umbraco-cms/backoffice/external/lit'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; - -import { UMB_CHANGE_PASSWORD_MODAL } from '@umbraco-cms/backoffice/modal'; -import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_CHANGE_PASSWORD_MODAL, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { createExtensionClass } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UMB_AUTH, UmbLoggedInUser } from '@umbraco-cms/backoffice/auth'; +import { UMB_AUTH, type UmbLoggedInUser } from '@umbraco-cms/backoffice/auth'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { type UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; @customElement('umb-user-workspace-editor') export class UmbUserWorkspaceEditorElement extends UmbLitElement { @@ -43,7 +38,7 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { #modalContext?: UmbModalManagerContext; #workspaceContext?: UmbUserWorkspaceContext; - #userRepository?: UmbUserRepository; + #userRepository = new UmbUserRepository(this); constructor() { super(); @@ -57,22 +52,6 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { this.#workspaceContext = workspaceContext as UmbUserWorkspaceContext; this.#observeUser(); }); - - // TODO: this code is reused in multiple places, so it should be extracted to a function - new UmbObserverController( - this, - umbExtensionsRegistry.getByTypeAndAlias('repository', 'Umb.Repository.User'), - async (repositoryManifest) => { - if (!repositoryManifest) return; - - try { - const result = await createExtensionClass(repositoryManifest, [this]); - this.#userRepository = result; - } catch (error) { - throw new Error('Could not create repository with alias: Umb.Repository.User'); - } - }, - ); } #observeUser() { @@ -197,23 +176,32 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { return html`
    Profile
    - - + + - +
    -
    Assign access
    +
    Assign Access
    - + + label=${this.localize.term('user_startnodes')} + description=${this.localize.term('user_startnodeshelp')}> @@ -230,21 +218,23 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { slot="editor"> + label=${this.localize.term('user_mediastartnodes')} + description=${this.localize.term('user_mediastartnodeshelp')}> NEED MEDIA PICKER
    - +
    - Based on the assigned groups and start nodes, the user has access to the following nodes + Based on the assigned groups and start nodes, the user has access to the following nodes
    - Content + Content ${this.#renderContentStartNodes()}
    - Media + Media @@ -254,49 +244,53 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { #renderRightColumn() { if (!this._user || !this.#workspaceContext) return nothing; - const statusLook = getLookAndColorFromUserStatus(this._user.state); + const displayState = getDisplayStateFromUserStatus(this._user.state); return html`
    - +
    ${this.#renderActionButtons()}
    - Status: - - ${this._user.state} + Status: + + ${this.localize.term('user_' + displayState.key)}
    ${this._user?.state === UserStateModel.INVITED ? html` - - + + ` : nothing} - ${this.#renderInfoItem('Last login', this._user.lastLoginDate || `${this._user.name} has not logged in yet`)} - ${this.#renderInfoItem('Failed login attempts', this._user.failedLoginAttempts)} ${this.#renderInfoItem( - 'Last lockout date', - this._user.lastLockoutDate || `${this._user.name} has not been locked out`, + 'user_lastLogin', + this.localize.date(this._user.lastLoginDate!) || + `${this._user.name + ' ' + this.localize.term('user_noLogin')} `, + )} + ${this.#renderInfoItem('user_failedPasswordAttempts', this._user.failedLoginAttempts)} + ${this.#renderInfoItem( + 'user_lastLockoutDate', + this._user.lastLockoutDate || `${this._user.name + ' ' + this.localize.term('user_noLockouts')}`, )} ${this.#renderInfoItem( - 'Password last changed', - this._user.lastLoginDate || `${this._user.name} has not changed password`, + 'user_lastPasswordChangeDate', + this._user.lastLoginDate || `${this._user.name + ' ' + this.localize.term('user_noPasswordChange')}`, )} - ${this.#renderInfoItem('User created', this._user.createDate)} - ${this.#renderInfoItem('User last updated', this._user.updateDate)} - ${this.#renderInfoItem('Key', this._user.id)} + ${this.#renderInfoItem('user_createDate', this.localize.date(this._user.createDate!))} + ${this.#renderInfoItem('user_updateDate', this.localize.date(this._user.updateDate!))} + ${this.#renderInfoItem('general_id', this._user.id)}
    `; } - #renderInfoItem(label: string, value?: string | number) { + #renderInfoItem(labelkey: string, value?: string | number) { return html`
    - ${label} + ${value}
    `; @@ -310,28 +304,45 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { const buttons: TemplateResult[] = []; - if (this._user.state === UserStateModel.DISABLED) { - buttons.push(html` - - `); - } + if (this._user.id !== this._currentUser?.id) { + if (this._user.state === UserStateModel.DISABLED) { + buttons.push(html` + + `); + } - if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) { - buttons.push(html` - - `); + if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) { + buttons.push(html` + + `); + } } if (this._currentUser?.id !== this._user?.id) { const button = html` - + `; buttons.push(button); } buttons.push( - html``, + html``, ); return buttons; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/utils.test.ts b/src/Umbraco.Web.UI.Client/src/packages/users/utils.test.ts index 29d0b8c150..47fd1a9126 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/utils.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/utils.test.ts @@ -1,5 +1,5 @@ import { expect } from '@open-wc/testing'; -import { getLookAndColorFromUserStatus } from './utils.js'; +import { getDisplayStateFromUserStatus } from './utils.js'; import { InterfaceColor, InterfaceLook } from '@umbraco-cms/backoffice/external/uui'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; @@ -13,7 +13,7 @@ describe('UmbUserExtensions', () => { ]; testCases.forEach((testCase) => { - const { look, color } = getLookAndColorFromUserStatus(testCase.status); + const { look, color } = getDisplayStateFromUserStatus(testCase.status); expect(look).to.equal(testCase.look); expect(color).to.equal(testCase.color); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/users/utils.ts index c3a95ed99f..d1ae7b30f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/utils.ts @@ -1,18 +1,24 @@ import { InterfaceColor, InterfaceLook } from '@umbraco-cms/backoffice/external/uui'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -export const getLookAndColorFromUserStatus = ( - status?: UserStateModel -): { look: InterfaceLook; color: InterfaceColor } => { - switch (status) { - case UserStateModel.INACTIVE: - case UserStateModel.INVITED: - return { look: 'primary', color: 'warning' }; - case UserStateModel.ACTIVE: - return { look: 'primary', color: 'positive' }; - case UserStateModel.DISABLED: - return { look: 'primary', color: 'danger' }; - default: - return { look: 'secondary', color: 'default' }; - } -}; +interface DisplayStatus { + look: InterfaceLook; + color: InterfaceColor; + key: string; +} +const userStates: DisplayStatus[] = [ + { "key": "All", color:"positive", look: "secondary" } , + { "key": "Active", "color": "positive", look: "primary" }, + { "key": "Disabled", "color": "danger", look: "primary" }, + { "key": "LockedOut", "color": "danger", look: "secondary" }, + { "key": "Invited", "color": "warning", look: "primary" }, + { "key": "Inactive", "color": "warning", look: "primary" } +]; + +export const getDisplayStateFromUserStatus = (status?: UserStateModel): DisplayStatus => + userStates + .filter(state => state.key === status)! + .map(state => ({ + ...state, + key:'state'+state.key + }))[0] diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts index f93a592d6a..34134e3503 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts @@ -88,8 +88,7 @@ export class UmbAuthFlow { readonly #storageBackend: LocalStorageBackend; // state - #configuration: AuthorizationServiceConfiguration | undefined; - readonly #openIdConnectUrl: string; + readonly #configuration: AuthorizationServiceConfiguration; readonly #redirectUri: string; readonly #clientId: string; readonly #scope: string; @@ -104,11 +103,17 @@ export class UmbAuthFlow { clientId = 'umbraco-back-office', scope = 'offline_access', ) { - this.#openIdConnectUrl = openIdConnectUrl; this.#redirectUri = redirectUri; this.#clientId = clientId; this.#scope = scope; + this.#configuration = new AuthorizationServiceConfiguration({ + authorization_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/authorize`, + token_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/token`, + revocation_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/revoke`, + end_session_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/signout`, + }); + this.#notifier = new AuthorizationNotifier(); this.#tokenHandler = new BaseTokenRequestHandler(requestor); this.#storageBackend = new LocalStorageBackend(); @@ -155,11 +160,6 @@ export class UmbAuthFlow { * - If there is no new authorization to be made, do nothing */ async setInitialState() { - // Ensure there is a connection to the server - if (!this.#configuration) { - await this.fetchServiceConfiguration(); - } - const tokenResponseJson = await this.#storageBackend.getItem(TOKEN_RESPONSE_NAME); if (tokenResponseJson) { const response = new TokenResponse(JSON.parse(tokenResponseJson)); @@ -183,25 +183,12 @@ export class UmbAuthFlow { return this.#authorizationHandler.completeAuthorizationRequestIfPossible(); } - /** - * This method will query the server for the service configuration usually found at /.well-known/openid-configuration. - */ - async fetchServiceConfiguration(): Promise { - const response = await AuthorizationServiceConfiguration.fetchFromIssuer(this.#openIdConnectUrl, requestor); - this.#configuration = response; - } - /** * This method will make an authorization request to the server. * * @param username The username to use for the authorization request. It will be provided to the OpenID server as a hint. */ makeAuthorizationRequest(username?: string): void { - if (!this.#configuration) { - console.log('Unknown service configuration'); - throw new Error('Unknown service configuration'); - } - const extras: StringMap = { prompt: 'consent', access_type: 'offline' }; if (username) { @@ -252,11 +239,6 @@ export class UmbAuthFlow { * @returns The access token for the user. */ async performWithFreshTokens(): Promise { - if (!this.#configuration) { - console.log('Unknown service configuration'); - return Promise.reject('Unknown service configuration'); - } - if (!this.#refreshToken) { console.log('Missing refreshToken.'); return Promise.resolve('Missing refreshToken.'); @@ -294,11 +276,6 @@ export class UmbAuthFlow { * This method will make a token request to the server using the authorization code. */ async #makeRefreshTokenRequest(code: string, codeVerifier: string | undefined): Promise { - if (!this.#configuration) { - console.log('Unknown service configuration'); - return Promise.reject(); - } - const extras: StringMap = {}; if (codeVerifier) { diff --git a/src/Umbraco.Web.UI.Client/src/shared/modal/modal-element.element.ts b/src/Umbraco.Web.UI.Client/src/shared/modal/modal-element.element.ts index f48b660d33..cd85083498 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/modal/modal-element.element.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/modal/modal-element.element.ts @@ -6,7 +6,7 @@ import type { ManifestModal, UmbModalExtensionElement } from '@umbraco-cms/backo export abstract class UmbModalBaseElement< ModalDataType extends object = object, ModalResultType = unknown, - ModalManifestType extends ManifestModal = ManifestModal + ModalManifestType extends ManifestModal = ManifestModal, > extends UmbLitElement implements UmbModalExtensionElement diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index e40d094367..67ec84f13e 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -46,7 +46,7 @@ "@umbraco-cms/backoffice/events": ["src/packages/core/umb-events"], "@umbraco-cms/backoffice/icon": ["src/shared/icon-registry"], "@umbraco-cms/backoffice/models": ["src/shared/models"], - "@umbraco-cms/backoffice/repository": ["src/shared/repository"], + "@umbraco-cms/backoffice/repository": ["src/packages/core/repository"], "@umbraco-cms/backoffice/resources": ["src/shared/resources"], "@umbraco-cms/backoffice/router": ["src/shared/router"], "@umbraco-cms/backoffice/style": ["src/shared/style"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 47c5b195e6..1af3c40ae8 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -44,7 +44,6 @@ export default { '@umbraco-cms/backoffice/auth': './src/shared/auth/index.ts', '@umbraco-cms/backoffice/icon': './src/shared/icon-registry/index.ts', '@umbraco-cms/backoffice/models': './src/shared/models/index.ts', - '@umbraco-cms/backoffice/repository': './src/shared/repository/index.ts', '@umbraco-cms/backoffice/resources': './src/shared/resources/index.ts', '@umbraco-cms/backoffice/router': './src/shared/router/index.ts', '@umbraco-cms/backoffice/style': './src/shared/style/index.ts', @@ -79,6 +78,7 @@ export default { '@umbraco-cms/backoffice/workspace': './src/packages/core/workspace/index.ts', '@umbraco-cms/backoffice/culture': './src/packages/core/culture/index.ts', '@umbraco-cms/backoffice/events': './src/packages/core/umb-events/index.ts', + '@umbraco-cms/backoffice/repository': './src/packages/core/repository/index.ts', '@umbraco-cms/backoffice/dictionary': './src/packages/dictionary/dictionary/index.ts',