diff --git a/src/Umbraco.Web.UI.Client/.storybook/main.ts b/src/Umbraco.Web.UI.Client/.storybook/main.ts index 22cadbe5ec..47e2a92d14 100644 --- a/src/Umbraco.Web.UI.Client/.storybook/main.ts +++ b/src/Umbraco.Web.UI.Client/.storybook/main.ts @@ -38,8 +38,8 @@ const config: StorybookConfig = { }, refs: { uui: { - title: 'Umbraco UI Library (1.6.0)', - url: 'https://04709c3--62189360eeb21b003ab2f4ad.chromatic.com/', + title: 'Umbraco UI Library', + url: 'https://62189360eeb21b003ab2f4ad-vfnpsanjps.chromatic.com/', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index e0a47af8c8..ee3c1ade14 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1,19 +1,19 @@ { "name": "@umbraco-cms/backoffice", - "version": "14.0.0-beta003", + "version": "14.0.0-beta004", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@umbraco-cms/backoffice", - "version": "14.0.0-beta003", + "version": "14.0.0-beta004", "license": "MIT", "dependencies": { "@types/diff": "^5.0.9", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", - "@umbraco-ui/uui": "1.7.2", - "@umbraco-ui/uui-css": "1.7.2", + "@umbraco-ui/uui": "1.8.0-rc.2", + "@umbraco-ui/uui-css": "1.8.0-rc.0", "base64-js": "^1.5.1", "diff": "^5.2.0", "dompurify": "^3.0.9", @@ -6879,814 +6879,814 @@ } }, "node_modules/@umbraco-ui/uui": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.7.2.tgz", - "integrity": "sha512-+rUacd8MUGp2Abw4h1URh26DxuOwDTJ4YD8biyWAecijBa+GRZcZ6CtwQnrk/QTOzCDMXn56X8KrKWNdb7Ia7w==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.8.0-rc.2.tgz", + "integrity": "sha512-KYySEmXsl0Ga1lAqAiClsjCMquSAZpo/9HZUcnrkw1dgZN8XaHmt/0O+b1QOty7WHZihurcvPQh169+BfMwUFw==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.7.0", - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-avatar-group": "1.7.0", - "@umbraco-ui/uui-badge": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0", - "@umbraco-ui/uui-box": "1.7.2", - "@umbraco-ui/uui-breadcrumbs": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-button-group": "1.7.0", - "@umbraco-ui/uui-button-inline-create": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0", - "@umbraco-ui/uui-card-block-type": "1.7.0", - "@umbraco-ui/uui-card-content-node": "1.7.0", - "@umbraco-ui/uui-card-media": "1.7.0", - "@umbraco-ui/uui-card-user": "1.7.0", - "@umbraco-ui/uui-caret": "1.7.0", - "@umbraco-ui/uui-checkbox": "1.7.0", - "@umbraco-ui/uui-color-area": "1.7.0", - "@umbraco-ui/uui-color-picker": "1.7.0", - "@umbraco-ui/uui-color-slider": "1.7.0", - "@umbraco-ui/uui-color-swatch": "1.7.0", - "@umbraco-ui/uui-color-swatches": "1.7.0", - "@umbraco-ui/uui-combobox": "1.7.1", - "@umbraco-ui/uui-combobox-list": "1.7.0", - "@umbraco-ui/uui-css": "1.7.2", - "@umbraco-ui/uui-dialog": "1.7.2", - "@umbraco-ui/uui-dialog-layout": "1.7.0", - "@umbraco-ui/uui-file-dropzone": "1.7.0", - "@umbraco-ui/uui-file-preview": "1.7.0", - "@umbraco-ui/uui-form": "1.7.0", - "@umbraco-ui/uui-form-layout-item": "1.7.0", - "@umbraco-ui/uui-form-validation-message": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-icon-registry": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", - "@umbraco-ui/uui-input": "1.7.0", - "@umbraco-ui/uui-input-file": "1.7.1", - "@umbraco-ui/uui-input-lock": "1.7.1", - "@umbraco-ui/uui-input-password": "1.7.0", - "@umbraco-ui/uui-keyboard-shortcut": "1.7.0", - "@umbraco-ui/uui-label": "1.7.0", - "@umbraco-ui/uui-loader": "1.7.0", - "@umbraco-ui/uui-loader-bar": "1.7.0", - "@umbraco-ui/uui-loader-circle": "1.7.0", - "@umbraco-ui/uui-menu-item": "1.7.0", - "@umbraco-ui/uui-modal": "1.7.0", - "@umbraco-ui/uui-pagination": "1.7.1", - "@umbraco-ui/uui-popover": "1.7.0", - "@umbraco-ui/uui-popover-container": "1.7.0", - "@umbraco-ui/uui-progress-bar": "1.7.0", - "@umbraco-ui/uui-radio": "1.7.0", - "@umbraco-ui/uui-range-slider": "1.7.0", - "@umbraco-ui/uui-ref": "1.7.0", - "@umbraco-ui/uui-ref-list": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0", - "@umbraco-ui/uui-ref-node-data-type": "1.7.0", - "@umbraco-ui/uui-ref-node-document-type": "1.7.0", - "@umbraco-ui/uui-ref-node-form": "1.7.0", - "@umbraco-ui/uui-ref-node-member": "1.7.0", - "@umbraco-ui/uui-ref-node-package": "1.7.0", - "@umbraco-ui/uui-ref-node-user": "1.7.0", - "@umbraco-ui/uui-scroll-container": "1.7.0", - "@umbraco-ui/uui-select": "1.7.0", - "@umbraco-ui/uui-slider": "1.7.0", - "@umbraco-ui/uui-symbol-expand": "1.7.0", - "@umbraco-ui/uui-symbol-file": "1.7.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.7.0", - "@umbraco-ui/uui-symbol-folder": "1.7.0", - "@umbraco-ui/uui-symbol-lock": "1.7.0", - "@umbraco-ui/uui-symbol-more": "1.7.0", - "@umbraco-ui/uui-symbol-sort": "1.7.0", - "@umbraco-ui/uui-table": "1.7.0", - "@umbraco-ui/uui-tabs": "1.7.2", - "@umbraco-ui/uui-tag": "1.7.0", - "@umbraco-ui/uui-textarea": "1.7.2", - "@umbraco-ui/uui-toast-notification": "1.7.2", - "@umbraco-ui/uui-toast-notification-container": "1.7.2", - "@umbraco-ui/uui-toast-notification-layout": "1.7.2", - "@umbraco-ui/uui-toggle": "1.7.0", - "@umbraco-ui/uui-visually-hidden": "1.7.0" + "@umbraco-ui/uui-action-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-avatar-group": "1.8.0-rc.0", + "@umbraco-ui/uui-badge": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0", + "@umbraco-ui/uui-box": "1.8.0-rc.1", + "@umbraco-ui/uui-breadcrumbs": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0", + "@umbraco-ui/uui-button-inline-create": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-card-block-type": "1.8.0-rc.0", + "@umbraco-ui/uui-card-content-node": "1.8.0-rc.0", + "@umbraco-ui/uui-card-media": "1.8.0-rc.0", + "@umbraco-ui/uui-card-user": "1.8.0-rc.0", + "@umbraco-ui/uui-caret": "1.8.0-rc.0", + "@umbraco-ui/uui-checkbox": "1.8.0-rc.0", + "@umbraco-ui/uui-color-area": "1.8.0-rc.0", + "@umbraco-ui/uui-color-picker": "1.8.0-rc.0", + "@umbraco-ui/uui-color-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatches": "1.8.0-rc.0", + "@umbraco-ui/uui-combobox": "1.8.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0", + "@umbraco-ui/uui-dialog": "1.8.0-rc.0", + "@umbraco-ui/uui-dialog-layout": "1.8.0-rc.0", + "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-file-preview": "1.8.0-rc.0", + "@umbraco-ui/uui-form": "1.8.0-rc.0", + "@umbraco-ui/uui-form-layout-item": "1.8.0-rc.0", + "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0", + "@umbraco-ui/uui-input-file": "1.8.0-rc.2", + "@umbraco-ui/uui-input-lock": "1.8.0-rc.2", + "@umbraco-ui/uui-input-password": "1.8.0-rc.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.8.0-rc.0", + "@umbraco-ui/uui-label": "1.8.0-rc.0", + "@umbraco-ui/uui-loader": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-circle": "1.8.0-rc.0", + "@umbraco-ui/uui-menu-item": "1.8.0-rc.1", + "@umbraco-ui/uui-modal": "1.8.0-rc.2", + "@umbraco-ui/uui-pagination": "1.8.0-rc.2", + "@umbraco-ui/uui-popover": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-progress-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-radio": "1.8.0-rc.0", + "@umbraco-ui/uui-range-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-ref": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-list": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-data-type": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-document-type": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-form": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-member": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-package": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-user": "1.8.0-rc.0", + "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0", + "@umbraco-ui/uui-select": "1.8.0-rc.0", + "@umbraco-ui/uui-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-lock": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-sort": "1.8.0-rc.0", + "@umbraco-ui/uui-table": "1.8.0-rc.0", + "@umbraco-ui/uui-tabs": "1.8.0-rc.2", + "@umbraco-ui/uui-tag": "1.8.0-rc.0", + "@umbraco-ui/uui-textarea": "1.8.0-rc.0", + "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2", + "@umbraco-ui/uui-toast-notification-container": "1.8.0-rc.2", + "@umbraco-ui/uui-toast-notification-layout": "1.8.0-rc.0", + "@umbraco-ui/uui-toggle": "1.8.0-rc.0", + "@umbraco-ui/uui-visually-hidden": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.7.0.tgz", - "integrity": "sha512-Lw067iEU4DihiOsL3cg2QqE4x7B7bqjYQK0EouBbD+mhJaE2IOw5eve2UIBN1KU/iQ+7V9q4qa++is1nitvUWA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-zG53nm7DMLsyu79gehxtuMj/2bEMgKA7lI6qudi7de74/lFvrGhxZ7JqT5RV6pDiriCxsqBd9OlLoynoWMOJow==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.7.0.tgz", - "integrity": "sha512-cW3qTTarFqXK4Ze5xMERo9pj3pRRKTvTDB57a5uA0gQ1/70uhgPnozWSX7EK22ml4w/5pmtxXXgRKfSiU9DGtQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.8.0-rc.0.tgz", + "integrity": "sha512-UbwoRBRXgtrebNZ1PTvQWqmgMuTSBD4dZ4xEF6mf7s0BRImI+6AoJevx3GETClnRB9UuD1lOR1GyxA7D76PCDA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.7.0.tgz", - "integrity": "sha512-TFDR0Mb+ug1NzVXq9RnxMiQ9pcxBcmzfOoxpR1NWMB/sAgNs/H/pTTqjieLel0/A5Am9q//8f7f9vmhTPpybGg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.8.0-rc.0.tgz", + "integrity": "sha512-s+odJUrwkMnDBqqP7ms1AGJznLQOw1XdVTtaJLx926U1932JBdlkDFtlKWPNrvGHRv6nILTVQWiyaz0TP02Lcg==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.7.0.tgz", - "integrity": "sha512-cdPHjXMag8KkYLaWfyYfp9N1qqG+th2Ijx7ms8EpTHAX2gtU1L/A3ShxWox0Ck1TJ75jrW66+HrqiMwDOmbn6g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.8.0-rc.0.tgz", + "integrity": "sha512-gG6Lr9dc/6GuHcGVTnb1uJFea95GKqxZHPyp0ljuc1TWUfrX9tKm+QXsHjMwbhpM0GWJUH5iPt0dB7xCsrkTFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.7.0.tgz", - "integrity": "sha512-66aDdgTrq2nx4BNzM9A/lc9dZYz/fyX5OVpkQDRsrpYeOLJMN3oOnE7aChIdBNW3I9lfVNJf6fh0iL27K5JCiQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.8.0-rc.0.tgz", + "integrity": "sha512-C7JhJD0Z5/wGZ/f3E68gdtqIspGK5LaEXN0A9pJtS2ZkdMbUFYo85y8aY9NWGGXDkEXHttMvUHv/ePiFsr/7Gw==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.7.0.tgz", - "integrity": "sha512-Hp6wOFqFLaZU0oW63GlMJ8s4va/TG+i7Sjs0qT91//5iJhJtpvgwY3j4ARoDfk0d8rKRIapiPT+hNMo9xr1sfQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.8.0-rc.0.tgz", + "integrity": "sha512-EFK9GPRa59E94Hp3K32uJGKAlYu2P9nENK9WQ8swCthBtw9a8GL9HxaQxGebgbf1kwkjyoihCYAF229czDe2Xw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.7.2.tgz", - "integrity": "sha512-KzQ58amR9dzc8GPoXvE1LZLAASEDYr/NUgHO15nX5ZyKj22EPNuT/9lbXVLzUzO2WoS7OJYRL3Hr8dPizhizBQ==", + "version": "1.8.0-rc.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.8.0-rc.1.tgz", + "integrity": "sha512-5FcG55k0dDYili4JfdOjsNkhAyseyHbqcEKOGmtV110ugvTZpjB/N/Zo49aHNkEIw4FduTLGhP6/2eFjSpLmYA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.2" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.7.0.tgz", - "integrity": "sha512-y0sB4UypNwCle9qPlQ7Y++a4BkmFpn9vSTeJ6WRWueVyjKT99icmCV1c8/Q47blMajp0FLG2/ajevxg/aZSO4Q==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.8.0-rc.0.tgz", + "integrity": "sha512-eubEanIW9LyNSxj53LNb5zCO9Hj23TJEqpYnoci4lSaeaqNOUfpQnn2FYoS8rmvZwnGpBWOq40XSCd1VbNbgbQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-button": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.7.1.tgz", - "integrity": "sha512-z2nZccn/Hel2QvytWVejDzqjNPRLJ/jLgCmLpgHoKU2IlckEgZqy4wxKcgH2Iu2bJ+wgIwpAAmlidLK0LX0tCw==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.8.0-rc.2.tgz", + "integrity": "sha512-5JAS247c0NdjsOdzdXOqjOEsfb1HxvPWvBc2KUMOi2hjh/TQbp765BXB0lvc5RqePwuJbwogeAhbesLuRvCCwQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.7.0.tgz", - "integrity": "sha512-CM0sytzzEXiDmFfB6GXnmQw5LzCNuwSo66BC6zYI4cg1+mk2a1UBu1Z8CVpvS3tsTkzk/nGd/ZFKkoIziDVKJg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.8.0-rc.0.tgz", + "integrity": "sha512-m4+OE/5CLuPikIoPIne2Rvi9cSUcTvz9qne1ZuTHtu/owuYLKA1lp1wCPVGJTkA3zITeLXkMbpuRaCpaKjB6Zw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.7.0.tgz", - "integrity": "sha512-SVep/tcsTJuO8jvZIX0e3EOaY1S+sOk0ZFmq+HxUJDt6csFjXsqJO48DjIon1AKq95ATTM9Iqs/hPSDVHrqNvw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.8.0-rc.0.tgz", + "integrity": "sha512-Xz7LGdotdyApJxeEmEU8OiHImS3/4yLEIhD0yjAO1F2i33/9pu6KUmloCq0cYO+3RhbQcdcsmrd+zjQutwBHHg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.7.0.tgz", - "integrity": "sha512-BBWJ62UH1dmcHvZ3H0fRCnM9c+ebQMNaZlGDDWP5lPfv+2KjXXkLRuj6tPUthHa53e5Rf6AAKjKsjRssM4dsLQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.8.0-rc.0.tgz", + "integrity": "sha512-EIS73DSOpbYmpkI1IibbO/cuhZPQulweXy2wfXq1gmeux8rr+frXZtZ+6dsvgpdBIx9K/+WoGPEzpyFg08EYOw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-card-block-type": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.7.0.tgz", - "integrity": "sha512-SrLgooo2imluSV8S3bp+0kA2K7zuMDAXZTuzQJRf2hzq208In65D5rBxn8OcEJsGD3lHMp6+w8rg8Ol5NlEbXA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.8.0-rc.0.tgz", + "integrity": "sha512-KGODyaGfbJiK8YQczU6yvpW/PFKzu1iKCnURogMsb0qOZHyKUJyddRm1fgFpX+i7RpyR4Cjbmw/Vmnt/oeNenQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.7.0.tgz", - "integrity": "sha512-wkb9BaUfuZkrMczsm1q4vuP0zSOp0gfiiiXCxFRDNmWJc3jKiL3zF619PzviEZrz10/f7WRnA7MLfDgsAmQpAQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.8.0-rc.0.tgz", + "integrity": "sha512-uHo3WY/cAsi87sa0QIR2sUFzUggtM31xKmoLCMm3bUMiDW0Y2lDfwb6mZU6yhykjczhcHuPSxwK1SgsI8bJsPg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.7.0.tgz", - "integrity": "sha512-Jwli2j//U1v4zG5fvkrekduf3qCa5w0RNP28RBxeqqQKzO8B5UpWqIP86/qaV7hvlp/ZuTCYrdkeWLgUV85tBg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.8.0-rc.0.tgz", + "integrity": "sha512-ISc540E2PZCBkJQLfRL9d2tMjP6GdLsP9+VihVgAKLSkG9+T/dMkbtTWlGX5ehmfaDzDmxXS9XUh8MCkplrRPw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0", - "@umbraco-ui/uui-symbol-file": "1.7.0", - "@umbraco-ui/uui-symbol-folder": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.7.0.tgz", - "integrity": "sha512-4fBXEICxi4ICAM2wn40DrUV1pPGSDFJmzacOA1PXxb1pzQjxw/hb/hnu96xqjHscX+bUAWnWHkb60RnrWmmcsg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.8.0-rc.0.tgz", + "integrity": "sha512-VIOGZnhvDO38e4RmQAxWVZFmiuT1FVIdA/DPNmrOiTJte2sWhwYb6mZWihiP1M09ChkhqviwZSkmt+xo2A80ng==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.7.0.tgz", - "integrity": "sha512-sVWUQGaLCAwhFH5mmE83+cwDjTyZamRWHgmVakTac2L9qYkwhTwzRgIol1t4i0DQMDFd4oLZ1zq+ysWvAOCmmQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.8.0-rc.0.tgz", + "integrity": "sha512-9Ko0NUorE4k3Iv49gJjVnSxiHJKUE3ImrgkPxI3GhNw5eUagpOecyl3MKlI/twpkHfY1CCeq7ngUV9+3E2uIiw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.7.0.tgz", - "integrity": "sha512-7bY8FgSEscGtMYf0EtvmU4XuchV8bdjs+gwBKCVYogAELDdKbCTxWI6/HRqR6wDUOltpP1okFYN6rISugkUKtw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.8.0-rc.0.tgz", + "integrity": "sha512-zOc35YNojxC1iqezOPnf3vL/WBMhdVPkXUUvVGrWCNMBsTy42JZUt8EDOgiRJu0j1yIrPuQy4NbQJ5NPQCRuLQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.7.0.tgz", - "integrity": "sha512-7FashEB3hoh9p833gEhseq1t2mICVzb5zRe+FJ+vKFnTI2uuIRLjwD0pqSwmVAxoFCPgb81B6V5yH/pSrrzZEQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.8.0-rc.0.tgz", + "integrity": "sha512-xj9uAsh1SPdxmsGeS+k/hM5sFwXA9XuBwgZwvXSGluiOEranTxmGW2Gq9p+dng1CQEyvvRbQ+R12R40wghpPUA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.7.0.tgz", - "integrity": "sha512-9JYlgg6i/gxwTIYsCJ8QnSjhZzZjJBiu2HZwDJ/2rm8uy/jNmbCf5aK+WHR7RbwMGNrF4/X/58t5woBzwSMUIA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.8.0-rc.0.tgz", + "integrity": "sha512-l5d8Ar9+z4K3GWrD3w2qn5ChnAhFmBcbJglgaKbJ78BFFccB+HYjYB2znMYPyi57+UVxcQPvr6jAz5i8BSisZg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.7.0.tgz", - "integrity": "sha512-DVyYeZsBG35430Cay6Dv8oO7dvi+aow6fVAJDHA4+CXdOSet4RTLO3oc1i51JwDmBiBhtLKGfo/wflrFxyfr0w==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-eh8XtPthXxl0z0FbyXA4epjiB18ZDnCMJJQ8w5br6d4tQicBPgJhWZQKBrZ1bNRpPaiHTxaA7kJ+mBz1l/DiUA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.7.0.tgz", - "integrity": "sha512-hp4Oicv7eLMvSn6jUerjDkYY6R/8JCRxbXabfbfZOZ/YwocSLN6DBc0nxlb/W8IETy26VCEFXH+tYKvZbsAB2Q==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.8.0-rc.0.tgz", + "integrity": "sha512-BdP1GYu8imhrO1KRpputsItIEGzSH44mWG3dRZakrOCyJt6V/nLGpHRymEuh2B0qcd7nDmyfN3mhtRRQ3N328w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.7.0.tgz", - "integrity": "sha512-XIPP4BhaRB6nL3HAt2KRsEeslq/I2hMl8eQzgbz8y9V6yf7uq8q0OCMqQy2XB6bQ48N+sOqXfjKLPIT4yTIH7A==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.8.0-rc.0.tgz", + "integrity": "sha512-HrRS9QZKEinHoiFUfmYNs430OrkkB55r3gDgsVn+LWuiKiYDR3pXO6wYrtvq4+RiviGPMLPEzuInd3GvDI+vlA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-color-swatch": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.7.1.tgz", - "integrity": "sha512-4nbsRyqJO+rifoug+1PlWA8oI1L6f3aj7P/p9UT4pgcT8mpJ5Fv70XaFXMPEaCWh8HgZLsvMKDClXNzHXlvcLA==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.8.0-rc.2.tgz", + "integrity": "sha512-71AbVcHweB36g3jUCur/PKIKbpSHMvJq2iQou84NgVtO+hBM0PxH2JOsLRCMFG76D8fjIUd03tNp6szBHH1RMQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-combobox-list": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-popover-container": "1.7.0", - "@umbraco-ui/uui-scroll-container": "1.7.0", - "@umbraco-ui/uui-symbol-expand": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.7.0.tgz", - "integrity": "sha512-vRMz1eDqogVqsuRlzzwq+F2SoXxUoquQ9DqBJPif1LO1LgRUZ3G/j1XyOR+CaMRiPEbu0olyNBHOt15dFbgqhA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.8.0-rc.0.tgz", + "integrity": "sha512-UTxJvlhS4zf4XXh4j9FeTEzdLs0U9cuiBFDlNQ5F0gF2LvA9LK/bCszA1iQhKx6umyWv0U+04hXgLTY/MT1Ymg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-css": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.7.2.tgz", - "integrity": "sha512-KNxz0T9D1/9GAVaE6/ms76LkzWLPyfuhmqF/dCQotnZAQxwDJ7m0XLEf5/+qULRrNTqNQtluuFX/qIlmqD1xLQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.8.0-rc.0.tgz", + "integrity": "sha512-trwLCgJtT91iP2b20QlHWjuj44AF4lWCg4CqBZoT2Z8a5IedqflnQstXCZRYm/F5Re32YGTwlR9lF1rAXqq4gg==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.7.2.tgz", - "integrity": "sha512-9T2h5XrY4KI2WLCfW37a6DUhi4cODvvo18m2/NHjzGWAc8I9RIzBD84Yg69XfmveIGHfLv2ytnZCtZvjBpYh3g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.8.0-rc.0.tgz", + "integrity": "sha512-B6HW+2wj17wyt4LGI1Zfs9OmMwK5qzDYmrAtx3uo3L+aieQ3QNpmYLJHP7c7xeU4kO0u+GJgBFt/qFRb/iPM1g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.2" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.7.0.tgz", - "integrity": "sha512-xuRXkAWlqAq2eO8VthT4JfOvVwpLeDwQwPOqwz4K50lR/6QHQAZdObG0g0DJuhlvehMMXPXrRneWZrAOWeIYGw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.8.0-rc.0.tgz", + "integrity": "sha512-uMuLWLQczUWPo5QokKiYJ5CuhVly3T8kYdFaKB+OkVRPIG2GHF1VKvM/JJX6Tx3po1EsehR3wb6JaxY+/BsX0Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.7.0.tgz", - "integrity": "sha512-quMmD9iKg4EqV7JKs7k3pcAnxn/RGQjlXgIMrTAUbZbMclLAtTQrowij7ydX5rAdkPgtpQAWRmRuUTcufse64g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.8.0-rc.0.tgz", + "integrity": "sha512-8JN8nzoIysub+pxvj3gNhvHRrZmui9SflvF6mMTKpk1uwZxE7LI4HZDhjmczKKDX9MChbzn1bSd8JYaxoA4zzQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.7.0.tgz", - "integrity": "sha512-QJg36PvN5LIHcl+fmcuhMFrkrTc5FDuj5L9DRStB/8V//HMhOKwjhOPcmc6xsxXm26R+jnS/7R67r/9PyjjhsQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.8.0-rc.0.tgz", + "integrity": "sha512-1xQ6R6ZoabFpAkkLWMyndR17j2xbgt0tBk59xFipnBeYsPyWkZd94MV7kl6T98YlxgmPY83+uhMI6qFuTPogiw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-symbol-file": "1.7.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.7.0", - "@umbraco-ui/uui-symbol-folder": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-form": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.7.0.tgz", - "integrity": "sha512-gHNCYq/kwa7hXLHLKGBYrub8jTJHup7hf+mBf3g1LjipS+8M2a9tdpoO8yWzyEauzFsS4YJo45XqN6SRC1f2MQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.8.0-rc.0.tgz", + "integrity": "sha512-5NtMr9qfcRNhL+q9UmXjR57/qGxin4x86OFVANb1Y12rx+V2l1MlyTHhGhGyukZX0re3f7DaY8kwg1CvUy9U3w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.7.0.tgz", - "integrity": "sha512-gorUH9jCcCPdlDUy41xD6+4PQyZEL+9H3rnnKGg4xGQRw1+RnLCgmGa7mYiLfj1ycgi8l7MU50zCsQyNvPAPgg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.8.0-rc.0.tgz", + "integrity": "sha512-5q8b0DVhbTUUYUaPWQDdjU7+kzWmns1EESA3dOL/2I4DzejfBgU7eGufdVRjlrvQyhPuHHp0wVs4aAL3jF0CCg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-form-validation-message": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.7.0.tgz", - "integrity": "sha512-CU2ykzuIA3153EYKkRsqZ0SuGDxoy1zrdYVczWZ+sVxggyIWwazLMm5EZvdoiF8s3iP0m/v2LyyUh9GkBZ66LA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.8.0-rc.0.tgz", + "integrity": "sha512-ePlg9BD4PkPvcjD+rCXrkJjAmoctXoVsDnBmhbn0cWbUiSpSX21OVTDiS9XW9Iyb+HOh5Pm0coGGTpF18+yM1A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.7.0.tgz", - "integrity": "sha512-PtOSZkTxWskRrppdhxf17D+d54OylvtjE7muyLb2eJEYoP7KEaWdJ8Lfei5LtaUCRJlstFwQrCh/QbtWhe8Dfw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.8.0-rc.0.tgz", + "integrity": "sha512-qEXgNGhN+hdRRune048zN76EkEpsHrQR3kLW7uYtF0/NSslKQxGLVWhNMK7X2Rw8t9btRmfp9Ib2mwZFNNayQw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.7.0.tgz", - "integrity": "sha512-hG3VlF5VLt2XaNYHRUdqs2m5F4s9FUS4WxMc/TRu9Dzhqtie3A7UZ23qtONAcTCSPUxEXW5t809JUyxFi8kpBg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.8.0-rc.0.tgz", + "integrity": "sha512-amoA60rpXAciPeepYM4G+pwHDG9llqPuQmTOMv7GchFbjghENDOT3dW9kOQZbSEncUEgHWpsf/Nu8zN2aJmiVw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.7.0.tgz", - "integrity": "sha512-zgNKwT5L8Ez1R9WUO+vFRPbaUHHoSc6ohOfLA790WCA+F2krzbc7z3hNk6fHkFTR73K4rCaMu6gRbDX/PvuD8w==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.8.0-rc.0.tgz", + "integrity": "sha512-0X42o/uet3bjL3v/5i2Q5hxgbkWYK9eTUrmDwBq01PIyw7XKW7Z/5C5Ryi292a3cwEGr0cAwawCLAkiTeIQiwg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-input": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.7.0.tgz", - "integrity": "sha512-c99s0hoggDTWFb3cq0uVcZcHCmstK82tVFJ4yPpaTMjJsilVCg9JnXE1B4tHvT25ZyAvN/pjJ/SYvLmKtU/MZA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.8.0-rc.0.tgz", + "integrity": "sha512-SuiTzZP0N1qTpivGKhRzVRKumTe6v6F34KGux303tJws7Nng4AW/KEq+QFpzd1nl0NQGQRQ3JaL+StSmgQFYJA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.7.1.tgz", - "integrity": "sha512-bzakMaaE1iSR7ioIzp2TGoBbwmBM+k712+0x+sK2dnQswRlLHL/Y95e7Byp/Aq6fNPayIwP6FaotB72JADDTig==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.8.0-rc.2.tgz", + "integrity": "sha512-WO4boW7+K4cFF+wo+qunBtiWyfn2XOdd3tl+8M/+lBwmCDIxuLbhrDosZEiUKvhyG4BjZxK1+C5JFqROZSQrkg==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-file-dropzone": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-action-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.7.1.tgz", - "integrity": "sha512-kfHYiX9844/yE2yIwgk/e73BXiFYi5qn/aCJiy9T3lO6DEFaaHOJUccMyWsNIvSiPHYRX/11Mm0sP30jotjgGQ==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.8.0-rc.2.tgz", + "integrity": "sha512-k8Dv83zUuEQvQBOFE+oD6tBNXB+UBd6pnQmoqLvohDobWVmjWo8o0vL2AszroLR9XFPGbPE+UpCNODM7OAEw9A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-input": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.7.0.tgz", - "integrity": "sha512-IU7/obNqFaHfuAyga8/wXC26+nqUEaovw67SeA83+2VUSyE7FeNTwW+AV7WFU7ZxeMYUvdJyxIpY43fClFg97A==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.8.0-rc.0.tgz", + "integrity": "sha512-B867GMgEr9/40tobOaO4rGI8fX7n+OZfizJrkxPNYgq9IHXMzbuHWZNiM/vW+uZNDDHDStZYxMa1L2NEfYOypg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", - "@umbraco-ui/uui-input": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.7.0.tgz", - "integrity": "sha512-PJmHNDCTiif89zkLUbBCdlnjY87TkqDfYQVjmhNwaO0DPxpQDh8gG2TvwD3Wp+aqdoVjR8FPIQH5pst+ulBa4g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.8.0-rc.0.tgz", + "integrity": "sha512-EwGbFA3TGdc9JydR4wmWCwGgMTksH7bjdBUyCR6Ix2nsekBsxNsfc/vcbHkfzw1u12WEqSZU4CzeNb8vYIldbg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.7.0.tgz", - "integrity": "sha512-uk1m3wux4dNb/0AqSGslODLo6yVT9aXKBYcHTsvW2P0NQI8IImiJVWw9TWmNrfuBPACJhEqo3pVvfe/PCfsWzQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.8.0-rc.0.tgz", + "integrity": "sha512-lUYd9vmGulWyF4qeWtX4ZwFaSUwP20KsGoXfJmNJ0EF7gSaYrFPJ0Sax2VSeo8BVFzhd1VtOHmLqL4DcQcOn1w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.7.0.tgz", - "integrity": "sha512-RKKThaEF1jqG+iU/vwH91QfXxaRvO10hABEReUj6IJYiU0sVCHxmZJczXnJFZKbl5pyEycOznV//b66J5kUddw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.8.0-rc.0.tgz", + "integrity": "sha512-S3LZCFrnI/F75I6OUVjXJ3E4jTH9o4b4JzE6Xe0V8u+gUfCU4NaAdoOl0x+u01Qh7NlZc318a+HiURP4W2Zr1g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.7.0.tgz", - "integrity": "sha512-9lDRavgADrcQss5mbdmBrorzgSFNBr4srDA3B6PCya9pFpGdu/NgvQr/SrQzU0U2YSeW4jB88pyHwZaI6PCYug==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-oJdr5vXP+tny6ZaM7VTV0E50MPuHeO7dbbX+hai+A55KOsSF/ZZrQMB1WZtdcyY3pzWA6AKgvTtRFEbU6nHf7w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.7.0.tgz", - "integrity": "sha512-7/FqKCntviNUS8yzKhw4lYCWj598gYbzxBRvGJxVPinMOfAgMa8MAOGKpi7VDFHsqfHASfDCzHkqdywq0ku3nQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.8.0-rc.0.tgz", + "integrity": "sha512-6g0bxqkTnNBAkSdm6EqlMQ0Gm5PDSEBGvGJ1qfyvgr9Rfa1rHR4GpOrz04A+Fobz9dXoCN2xfqNayUDBo4dy2g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.7.0.tgz", - "integrity": "sha512-RTsrBmD1zjcP7XGPIGsxfBfOH+u4k3Jtw1qy/bxD1XLNH3ggOtfpQrpMzn/kxaer/wxYrUnXoDZDRjRuhHwvbg==", + "version": "1.8.0-rc.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.8.0-rc.1.tgz", + "integrity": "sha512-yccczOwXnODykEgILX/wrg+D3i06L2iAEg8uetFp+NQgMPgLz0SIVyJioNHiGkWnNlvwG/wfNOPT5PTY4LrCQA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-loader-bar": "1.7.0", - "@umbraco-ui/uui-symbol-expand": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.7.0.tgz", - "integrity": "sha512-/XTu5kbPAgkbMrm1MISz+hvvEh3d2guBl7bs5EhiLBsq4XqnaDQwh15joS4wub5R2lfaodvJg7Or2VvFV+v5ug==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.8.0-rc.2.tgz", + "integrity": "sha512-ISi2kRV729SHFXgpXnLlIjEJuOSBxo64gg8KMkXdFpUMXgfq6qlIWFrlY9D5L6m3c7mB3QfhDOejp0rwOeHO6A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.7.1.tgz", - "integrity": "sha512-T6oomUkqf6xFc4ZMGX4YHmeBDBLwSfkTz/9sksqTpFpiK86XGJMQ0yOfPhlWNZ9TrC4OJZDurZ/jnY1l97OxcQ==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.8.0-rc.2.tgz", + "integrity": "sha512-T4vw2M5EJliqwy8YI03eA7pg+gcym9fyeO95eGQvriUV6/OB60CrzjEQ2tXREkVQq1oW3RIBEUEikUgRktMpwA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.7.0.tgz", - "integrity": "sha512-aGG2AOXWfiRSo+0HAZkmZkWCXZTWyBB6mQ7+1XVcSHubsGLTimc6jcs+9y8c/OgMlFlm+YhDmp0bVSdmUKmYIg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.8.0-rc.0.tgz", + "integrity": "sha512-cCeDHzwz67ugMJ4tg56dksHvsG1Zye3KlLTROHFt4qeOpnNcGuA8WDQTTxC7KyzGlxEkVWUkpHT1HxLP60FCFg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.7.0.tgz", - "integrity": "sha512-az2Em1ZKaBLbPBKS3SePeCh6dk4NpdqsM+uRC5DFDLc95oAciKnC/gSjjZf1VtlL+hjb907R+nDQmszC9K7qfA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.8.0-rc.0.tgz", + "integrity": "sha512-ErPEkvBvg3AhJnFXn8U32SZG+Tyfq3EyZxEhCwPgv4S7MajOrjz08SLN/2khSqLnqWw5dihRYcBTxcLtw4549g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.7.0.tgz", - "integrity": "sha512-LjoK+DbO6BcNBJXr6ZKUHTfXPf4ZeChCVDEf1YfsiyLGxoKgt605YqJ8t8OWLInlO3m1rZmB7f0Uxc58nnPjxg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-OJI7g8jWB2gT++faIjoyGDLGjfjzTXGg4lfvTt5zNGI8JgEUf1CY0j4C3ANoh+cXMwvxiURRGOX/UmmwZzN/uQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.7.0.tgz", - "integrity": "sha512-dNuBdHKNVJUaeemA87uCNTBIeN6S+dLdgxGI2ayQNzA/71EDSdBlIMrdm8FTJ0H8Un/itvgaujhu7EHbckai3w==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.8.0-rc.0.tgz", + "integrity": "sha512-lIjFN9ykLOaxcE0aHsO4HJ42X6uqX3L7S8juk8BVHKY2WiocYdW5EXKQ3qMjEkjx1rbhTrr/Ok2Pu7L8YeohJA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.7.0.tgz", - "integrity": "sha512-3LV9H0HciGSMEpX1I7zSzmPssGvF+C907bl8hWnlmaVVKGirBjrKPHmeZQW/zpqRCtvDWipFYKOcgbKQzCA2Vw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-NuIOyT4F6pWweZj7VSRFrGnxijGayAIa3BhO5+stsw+Cz1EmESgTgV175buVRRhoqMGOAhky1EGnKkD9YYQ0hg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.7.0.tgz", - "integrity": "sha512-/llhIEmVoJ4gb3LmOH1cfJ5zOSJry7TfJTxzruUpCxi+O68zMscgRZr+eh9DdF+Lz7zMbRxlubbVOZ58HhEPmQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.8.0-rc.0.tgz", + "integrity": "sha512-dxf4h5lfpZYpqANRvVD1eR4LrLOqut2oI8O0gLoUG/crObaU0Yta53T4xTVl2aAL7Wjm4cYkj9iQMd/9MJdo1g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.7.0.tgz", - "integrity": "sha512-BEb878VsSmRJuq1FCtoS9ryBvUErUfK8bQy93ErwgmesdUcuYpBJK1PfSe4x7SiLjD1vDlH9GHaWLyFiSJKfIQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.8.0-rc.0.tgz", + "integrity": "sha512-vdS3OMNX+r1akhUtuFfW2WfWsDflR7kA9QbVy2R0twvxE2JD5xttXlBybtqGljguks0nBuvUrEgcU3s014mPKQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.7.0.tgz", - "integrity": "sha512-yqTS6B3uA0e8g29+nqbUnyPncyRdeYGNR4mjA4gdL4iwPumBvC49tPoWds8Nq0lEyxJg9fLNMezokPOMs2fKvw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.8.0-rc.0.tgz", + "integrity": "sha512-bYoL7u8AixbcA1JRfRJ/l5SfEj0sq9jF8pJzILP5wLpphwthZU8PqUC9jqgvo6RZSOVmtDcVqDsLKpG1t/vT7g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-ref": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-ref": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.7.0.tgz", - "integrity": "sha512-TmnpFGaG1QqUqvwlmXlXzpPZ+tCigqCxv4VVOYA9XwfUeqwoWmziQJ1jJyqdxSrHxRYkgg9Or8ZqObpKZ0HrCg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.8.0-rc.0.tgz", + "integrity": "sha512-zZk1y8aJBcI+jx6JvqxQc9cuWU2cSSIRcfQeM2HGVriyUBNX5oz2dgfkV6hWJK5Ndc/o6ZrXkWL0CT9X16OKxQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.7.0.tgz", - "integrity": "sha512-KiZWbggePxAmHWr31yJzWOrA4DLGMbw8goMSC49zinBX4X2FOqgOTG8dl4dCXMxN114wxcTDRFvdTcWpIOHeEQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.8.0-rc.0.tgz", + "integrity": "sha512-tEBYvuS7XkuRoEMqgJLnMo2BIifivHOrQlyZOyoA4EQsbkQsLPNIYkn+tWDcW/qRK5GSDQGHjRPza0o3E281zA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.7.0.tgz", - "integrity": "sha512-FUZA7jjWOOA8HILRhD30mKO6NX0Hv+wL61gfIbWt95iGsmPwknth550Dm+i1Cc/3L63QmZD0qBQRTKRl7zfynA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.8.0-rc.0.tgz", + "integrity": "sha512-Ua25ZReynmdPqEvF0Sx4JClvWn0i2Y1bTo7KE45zm7M30jzhBjVt1LpAayy7mNK84VJY9lEt1vSt5B3rkug7oA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.7.0.tgz", - "integrity": "sha512-PFXZzlPmJaNLrvCO3p9n5ViIBXfr7nJtm+3WphuUM6KiJMMa0Fv7au1CINv6abu+TzjBh6VcmoNdt8Hu2MfS7g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.8.0-rc.0.tgz", + "integrity": "sha512-6gW4G+kvGenCohf0vzd1heUAX2hI6ZmlSfLttdDGggETChUcYQ91sFDe/8r0pOIPGgE6r46B1WgGmFXNMFxMEA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.7.0.tgz", - "integrity": "sha512-OVvo+YDs0a3jqtm09XwaZdRNFwmDnSIBCTAllG+fLRbYQfwF0pCp96WOmuwQfGjlXhPrIjbhJ6YJH7R8QRUzbw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.8.0-rc.0.tgz", + "integrity": "sha512-aSY1MMoNhZI+firF/UrvXrbR3JSNiOtHtrTDMreZTr85wzC82k6gRXmlz+1xvCKooduab3/e/gM+1yPoha85Ng==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.7.0.tgz", - "integrity": "sha512-Z2qF53n9O7Ft/xgexY/lzUd8xeFusCLSnz7hkqfWgTIbSvdI9FXtMiqCWqD1nWmijIPYBKaqujBfibGtx1DcSg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.8.0-rc.0.tgz", + "integrity": "sha512-0o6eyHFq2WHiEUaE1FgtVxavHLEwuAByYYesnzx4b2zwO1IHVZEjuaSp5nOJ6vyUdq1zK5TZZJa2LvWIT2uMNQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.7.0.tgz", - "integrity": "sha512-W4rETai/KAyXkDRUn6h14S6PLigswzkE45ufHAc7K2QZGUgXikpntbE8UpsEfq1QdMQRTHDmjorGn2qT+C6ULA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.8.0-rc.0.tgz", + "integrity": "sha512-zrq/m7x/4gU8eIZYaIe6ED755sQJTsZGCi3IVUjfjFTnqQs5C4vtXczYcefALgYOXHIzatLxyOfF4nilOvpu1Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-select": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.7.0.tgz", - "integrity": "sha512-pkPWTciiL9hPXpDO26wkkZFLze+jgL/xZkGgtrULrMRS5mJ6gan+8bB14iGtPt/ekFdgDmt6YcKozjp8g15xGg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.8.0-rc.0.tgz", + "integrity": "sha512-Lh4RTjBll7eU/ptCllBWd6XiCEgLNw+rqXwCL4bzEdHLaiZDVaMs9SUWJW8L1eAQcna7aPNewntIrmIv+Z5r0w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.7.0.tgz", - "integrity": "sha512-kP93yvwsvRUEyS4+PhkhwXpkWZUm77sKerB6Dte0Z579WMQclSAivy6va9kkj5zKxZYPcRbJ3H498FvfhxhMkw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-y1tiqp4pGTUReatXkXJcC5TQLQFEiaG9sSxTAbMlKoAgkNuZjM1xhOcJ3mDHqiqaWWznjCFRDlXN62Os8dpdcw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.7.0.tgz", - "integrity": "sha512-Z9bv8uYU2+tQ3UoJM2Ymdpmey73bLBNuaIKJG1AOXi1c2CB1UHaIn0C0Cvj4eHLoIEVp29UZOpQM7ri3/zb7lg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.8.0-rc.0.tgz", + "integrity": "sha512-rGvYaWeSArxubTf6m1S0Xgt4nLDPT0NOJzWgfI2+LqwpSoanH35Mb9+qXror2BLvog1jXfxwTZz1krqwSM3FwQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.7.0.tgz", - "integrity": "sha512-m/vx7WnCbYw0cNqS7TM6JeS7S/AMEQlnVUOWa2w2GDIuKNy6Jb1bk0soW1B3Fi6Hc6Pq+pMeaKgVPIM5F7F4Cg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.8.0-rc.0.tgz", + "integrity": "sha512-urGF7kWtxXxMqbFJkACDs7dPk3o9KfYgLrRSCqUYE8qrz98n0R31BZ9KzrtCma+a2uI17zvFyIuRYd3xvwCilg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.7.0.tgz", - "integrity": "sha512-lyhROAhwbmgK24DerwTiP5iP8GeOiAcgbgkUfHhG8X6hWMx9nV3H1nJHil5jFAeXk9nbAzDw4UfUgQWeKePLTg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.8.0-rc.0.tgz", + "integrity": "sha512-zWwx1jTQ3Ka4HoZ24EaHyJH3I0ez/qALf8qo5r5lLy4vn3UplunGKcNVFfOUsx6H19GlR4rDuPILIqdXJ4C/BQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.7.0.tgz", - "integrity": "sha512-ZyS82vIqgqpPTx1atPaN+bw+Wr5e2lY2G9dpjTVx15PZtlI2Hp9aouiWyDRuCai8cc9Cj7n+7wF/K8QC7J8uCw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.8.0-rc.0.tgz", + "integrity": "sha512-KV0gVKXFkYtJaOgwcma1jNBHMXT/xwDSuio4uamwV9GkdvjS1kFQyAMtXqBArWFisuifcfMcnPyZYxxeKx/CfQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.7.0.tgz", - "integrity": "sha512-0EgbdXHY/aKniF0GZV6q64BWBsHK/dmar2hRNa/CpXHOGr04caY2svs44adWo4AOdGbPy9ayIglEzwSBRV+vXA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.8.0-rc.0.tgz", + "integrity": "sha512-orMaoQIfbhF+gXS5FjW9mujP71GiuePQr/rCNLGWeSJntqudxRp8bjNrcop2kAUoqzK8fAAvaBM7uZTDxVxU5g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.7.0.tgz", - "integrity": "sha512-w+f3jvnVhkETiT3NERIsHJrYDZJC5zfihtW/KRE7isJflF8vrnEyUylv5ZJEih2kj0qCphoCswfMNQjwZbmMFQ==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.8.0-rc.0.tgz", + "integrity": "sha512-IJsTvHRPmG0OHnCgRQD69O7eUTDF8s/sY41uMiO9Mhhwf+CpE5R/LUJkMHvMZMCRkwMrSPCsq9cjCMNpalGepQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.7.0.tgz", - "integrity": "sha512-mYG0BKW3F8quwsBRck3mhINDJrl+bmfTzQsQRBjjCtP/BuIlqb2JSZDn0KBK1Jj7gl2MJINgZSzsL89zjyRVHg==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.8.0-rc.0.tgz", + "integrity": "sha512-ELJpdd5XpzYYMh+ZxlESQhZkvH711UoCgOgP4e5ftU8suWUs1Jb34F/7GzppKkMbSKZlfGw7nCx3pz5n3C5ANg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.7.0.tgz", - "integrity": "sha512-gE8KNPAKZbUkAf+ZYLWe0zK4TC914sNfoCZJY4v8aEJ8xkZ/mYXJ7FxVvE+gvYuZ033VqrO5Ko5AwWEXfw1iIA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.8.0-rc.0.tgz", + "integrity": "sha512-wH6Qyck706HK36mM0d+B1EWs17bM2Qv/V+DybKu/8DD+QNptOnuSzGkcCbRAV6lo36A3t7/NEru2xxvavBjUcw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-table": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.7.0.tgz", - "integrity": "sha512-9t9vdWOQ0NKg6aHTWqoIfAEK0M/DDrGkcn96FGvxxbPd+qkta4XDYCMEfOfMjGnGz+lukWoACectczEHXuI6gA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.8.0-rc.0.tgz", + "integrity": "sha512-TbDlh3qdZDsksjFw18e3emfHeGw8tAApPcPXK78WIN7LNDlKiHDHClan0J/Ul+QLZD4rUDteHJ5C1okYb/jboA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.7.2.tgz", - "integrity": "sha512-IMKJ47xgKSFms56EURQU/Lt31XeP0ukB4TMfPS1bFf57Gmez7REKam9VzAaSPXOyxeU356j5D41Ym7u3eGgFPA==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.8.0-rc.2.tgz", + "integrity": "sha512-MLtDabiXsOEqOxfgEuqU3ji1XTgY9ABbhqOHC23cFaaGBwlqAbUyi9hAMJhfso406vkQa/9t9A7yK8qpMqKdrA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-popover-container": "1.7.0", - "@umbraco-ui/uui-symbol-more": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.7.0.tgz", - "integrity": "sha512-twrXe2U733r92ubBGXxWV9F5QP7SCJhKwYZbC2jbFOGoHpcxCtELvy36vEvgoWUF2BorPLQZSci7RHO0Hbnasw==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.8.0-rc.0.tgz", + "integrity": "sha512-3opqus5jf4Ou8JNnFOZTl64rRD6n6qffKrPn+mEHTMkUhGQ5/wTKvdfWg4G0lD60aEMzKd7L6rojZydPDLEwFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.7.2.tgz", - "integrity": "sha512-JY5qohMuRyAT08Mb4vVP3T8DIW0sug/97/RzhWx5dt04nlMf0LBVv85RHuDj+LVjbxMSLYMblgQGn2M2AGfP7g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.8.0-rc.0.tgz", + "integrity": "sha512-EYOzu5E6BEqacLNoMxYPhFwbjK5xRExI47drDV+LzfyUe3hgFLUCZkIA/Z35vSFN8+HyguT7aaCfpzHhoSbFwA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.7.2.tgz", - "integrity": "sha512-6c1jVHC/zp9dNV9nb0ZvxsqX5lEFPL4zV8JBQHu4EGUG1Ep27uhF0vOVTbaqORErrr9CIsKGMYelCBIC51iR9Q==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.8.0-rc.2.tgz", + "integrity": "sha512-ICvxWZVuDO1X/f1udYgtY1prHYbj26g3ZecKq2V2FVs9Ej5kYNIWU1nVGj6tWkdyKGnVPjoLfYmq/W8i9BJb9g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-css": "1.7.2", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-css": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.7.2.tgz", - "integrity": "sha512-NNlsoQtRMV4Q5J9hB7R4KBbthbgdxsvi5/Pudc4zr/Dh33KVM2SWvzmdjnAR3Z3p9/+xZke8olQIALoQfaoSAw==", + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.8.0-rc.2.tgz", + "integrity": "sha512-iQ1xDQBgKrvTtCAUsT/3DJayCNVPWb+T9B5V+MyfuHnV9qOnmPtchs7l9r8cFwabOO5ZpxMke/tltsgMawwajQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-toast-notification": "1.7.2" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.7.2.tgz", - "integrity": "sha512-YLoS/6dwLdDgtmIoHv5feGbk3hlfYsz48xbaE4mjQPDsl534kytbgSFBzcXQsh0LVuGPLzKmhwMF07yfCbz+hA==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.8.0-rc.0.tgz", + "integrity": "sha512-ouQ1DlBlf0nkZZEsVIe+8Nz6mca1fjyyi0iypzDvwJq+K6tWm64FuxeqPpwp7M4jkNkcgDPOJqaONtPHQJdLKA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.2" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.7.0.tgz", - "integrity": "sha512-1Rz7CyBy38IF926maF1fyNjLG/my/4oWQRl0/22h/Xr6SYj/wWNE/1u4rg2bW1HGSu9mNtiel4wd7tDJ4g30Ew==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.8.0-rc.0.tgz", + "integrity": "sha512-OytTeUPk9X3H4w3vWo1JLG2WK2npoXOUBBKft4WwtN+hUoX9/KquxBrz0qkxdO/jQ4LpSRJopS9SqjNg5mqVug==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.7.0.tgz", - "integrity": "sha512-yPa1Z4S+ItjS+i9xgIobZ5QxfUyLRLguzqX8VARgCCxyoh5yXkoABhI9Fb0siSwc9TOtKuRaB+qQoV5rLnpu/g==", + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.8.0-rc.0.tgz", + "integrity": "sha512-ZawyaL4DJsv0e7pyxiJWB5ogCxkn0mrzMimbajp6ZDDQMvAJDiA/I14hcaBVOudzZyTAzNK5xJlbB3ft2TwFdg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.8.0-rc.0" } }, "node_modules/@ungap/structured-clone": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index e8ea2524c6..4e6a64c7c6 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-beta003", + "version": "14.0.0-beta004", "type": "module", "exports": { ".": null, @@ -170,8 +170,8 @@ "@types/diff": "^5.0.9", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", - "@umbraco-ui/uui": "1.7.2", - "@umbraco-ui/uui-css": "1.7.2", + "@umbraco-ui/uui": "1.8.0-rc.2", + "@umbraco-ui/uui-css": "1.8.0-rc.0", "base64-js": "^1.5.1", "diff": "^5.2.0", "dompurify": "^3.0.9", diff --git a/src/Umbraco.Web.UI.Client/src/external/lit/index.ts b/src/Umbraco.Web.UI.Client/src/external/lit/index.ts index 270a60fa6a..e7c9bc62c3 100644 --- a/src/Umbraco.Web.UI.Client/src/external/lit/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/lit/index.ts @@ -1,5 +1,6 @@ export * from 'lit'; export * from 'lit/decorators.js'; +export { directive, AsyncDirective } from 'lit/async-directive.js'; export * from 'lit/directives/class-map.js'; export * from 'lit/directives/if-defined.js'; export * from 'lit/directives/map.js'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index f49942f71e..e4cbaacc6e 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -170,6 +170,7 @@ export class UmbContextConsumer this.#createConditionController(conditionManifest, conditionConfig)), ); + // If we got destroyed in the mean time, then we don't need to continue: + if (!this.#extensionRegistry) { + newConditionControllers.forEach((controller) => controller?.destroy()); + return; + } + const oldLength = this.#conditionControllers.length; newConditionControllers diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts index 293a91f3d5..b177cd5cc7 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts @@ -186,6 +186,7 @@ export abstract class UmbBaseExtensionsInitializer< hostDisconnected(): void { super.hostDisconnected(); if (this.#changeDebounce) { + cancelAnimationFrame(this.#changeDebounce); this.#notifyChange(); } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts index 68e00ddbd7..2a801af75c 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts @@ -368,3 +368,88 @@ describe('UmbExtensionRegistry with kinds', () => { .unsubscribe(); }); }); + +describe('UmbExtensionRegistry with exclusions', () => { + let extensionRegistry: UmbExtensionRegistry; + let manifests: Array< + ManifestElementWithElementName | TestManifestWithMeta | ManifestKind + >; + + beforeEach(() => { + extensionRegistry = new UmbExtensionRegistry(); + manifests = [ + { + type: 'kind', + alias: 'Umb.Test.Kind', + matchType: 'section', + matchKind: 'test-kind', + manifest: { + type: 'section', + elementName: 'my-kind-element', + meta: { + label: 'my-kind-meta-label', + }, + }, + }, + { + type: 'section', + kind: 'test-kind' as unknown as undefined, // We do not know about this one, so it makes good sense that its not a valid option. + name: 'test-section-1', + alias: 'Umb.Test.Section.1', + weight: 1, + meta: { + pathname: 'test-section-1', + }, + }, + { + type: 'section', + name: 'test-section-2', + alias: 'Umb.Test.Section.2', + weight: 200, + meta: { + label: 'Test Section 2', + pathname: 'test-section-2', + }, + }, + ]; + + manifests.forEach((manifest) => extensionRegistry.register(manifest)); + }); + + it('should have the extensions registered', () => { + expect(extensionRegistry.isRegistered('Umb.Test.Kind')).to.be.true; + expect(extensionRegistry.isRegistered('Umb.Test.Section.1')).to.be.true; + expect(extensionRegistry.isRegistered('Umb.Test.Section.2')).to.be.true; + }); + + it('must not say that Umb.Test.Section.1d is registered, when its added to the exclusion list', () => { + extensionRegistry.exclude('Umb.Test.Section.1'); + expect(extensionRegistry.isRegistered('Umb.Test.Section.1')).to.be.false; + // But check that the other ones are still registered: + expect(extensionRegistry.isRegistered('Umb.Test.Kind')).to.be.true; + expect(extensionRegistry.isRegistered('Umb.Test.Section.2')).to.be.true; + }); + + it('does not affect kinds when a kind-alias is put in the exclusion list', () => { + extensionRegistry.exclude('Umb.Test.Kind'); + // This had no effect, so all of them are still available. + expect(extensionRegistry.isRegistered('Umb.Test.Kind')).to.be.true; + expect(extensionRegistry.isRegistered('Umb.Test.Section.1')).to.be.true; + expect(extensionRegistry.isRegistered('Umb.Test.Section.2')).to.be.true; + }); + + it('prevents late comers from begin registered', () => { + extensionRegistry.exclude('Umb.Test.Section.Late'); + extensionRegistry.register({ + type: 'section', + name: 'test-section-late', + alias: 'Umb.Test.Section.Late', + weight: 200, + meta: { + label: 'Test Section Late', + pathname: 'test-section-Late', + }, + }); + expect(extensionRegistry.isRegistered('Umb.Test.Section.Late')).to.be.false; + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts index 245ddf6667..99449dbf88 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts @@ -80,6 +80,7 @@ export class UmbExtensionRegistry< private _kinds = new UmbBasicState>>([]); public readonly kinds = this._kinds.asObservable(); + #exclusions: Array = []; defineKind(kind: ManifestKind): void { const extensionsValues = this._extensions.getValue(); @@ -105,6 +106,15 @@ export class UmbExtensionRegistry< this._kinds.setValue(nextData); } + exclude(alias: string): void { + this.#exclusions.push(alias); + this._extensions.setValue(this._extensions.getValue().filter(this.#acceptExtension)); + } + + #acceptExtension = (ext: ManifestTypes): boolean => { + return !this.#exclusions.includes(ext.alias); + }; + register(manifest: ManifestTypes | ManifestKind): void { const isValid = this.#checkExtension(manifest); if (!isValid) { @@ -163,6 +173,10 @@ export class UmbExtensionRegistry< return false; } + if (!this.#acceptExtension(manifest as ManifestTypes)) { + return false; + } + const extensionsValues = this._extensions.getValue(); const extension = extensionsValues.find((extension) => extension.alias === (manifest as ManifestTypes).alias); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts index a35f9b763a..8195af02df 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts @@ -49,7 +49,7 @@ export class UmbMockEntityTreeManager { return { ...item, - parentId: destinationId, + parent: destinationId ? { id: destinationId } : null, }; }); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts index c74b54913d..790a686bad 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/index.ts @@ -9,7 +9,7 @@ export const handlers = [ ...treeHandlers, ...itemHandlers, ...folderHandlers, + ...detailHandlers, ...moveHandlers, ...copyHandlers, - ...detailHandlers, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts index bca11683f4..9dc2b49cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts @@ -5,7 +5,7 @@ import type { MoveDataTypeRequestModel } from '@umbraco-cms/backoffice/external/ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const moveHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { + rest.put(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { const id = req.params.id as string; if (!id) return res(ctx.status(400)); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts index 7da4fc8061..ba9f5b71b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts @@ -76,18 +76,27 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement // TODO: Prevent initial notification from these observes: this.observe(this.#context.layouts, (layouts) => { this._value = { ...this._value, layout: { [UMB_BLOCK_GRID_PROPERTY_EDITOR_ALIAS]: layouts } }; - this.dispatchEvent(new UmbPropertyValueChangeEvent()); + this.#fireChangeEvent(); }); this.observe(this.#context.contents, (contents) => { this._value = { ...this._value, contentData: contents }; - this.dispatchEvent(new UmbPropertyValueChangeEvent()); + this.#fireChangeEvent(); }); this.observe(this.#context.settings, (settings) => { this._value = { ...this._value, settingsData: settings }; - this.dispatchEvent(new UmbPropertyValueChangeEvent()); + this.#fireChangeEvent(); }); } + #debounceChangeEvent?: boolean; + #fireChangeEvent = async () => { + if (this.#debounceChangeEvent) return; + this.#debounceChangeEvent = true; + await Promise.resolve(); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); + this.#debounceChangeEvent = false; + }; + protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { super.firstUpdated(_changedProperties); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts index 8c49108813..0ecfd43eff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts @@ -107,7 +107,7 @@ export class UmbBlockGridTypeWorkspaceViewSettingsElement extends UmbLitElement { + this._layouts = layouts; + // Update sorter. + this.#sorter.setModel(layouts); + // Update manager: + this.#managerContext.setLayouts(layouts); + }); // TODO: Prevent initial notification from these observes: this.observe(this.#managerContext.layouts, (layouts) => { @@ -135,26 +144,19 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement //console.log('layout changed', this._value); // TODO: idea: consider inserting an await here, so other changes could appear first? Maybe some mechanism to only fire change event onces? //this.#entriesContext.setLayoutEntries(layouts); - this.dispatchEvent(new UmbChangeEvent()); - }); - this.observe(this.#entriesContext.layoutEntries, (layouts) => { - this._layouts = layouts; - // Update sorter. - this.#sorter.setModel(layouts); - // Update manager: - this.#managerContext.setLayouts(layouts); + this.#fireChangeEvent(); }); this.observe(this.#managerContext.contents, (contents) => { this._value = { ...this._value, contentData: contents }; // Notify that the value has changed. //console.log('content changed', this._value); - this.dispatchEvent(new UmbChangeEvent()); + this.#fireChangeEvent(); }); this.observe(this.#managerContext.settings, (settings) => { this._value = { ...this._value, settingsData: settings }; // Notify that the value has changed. //console.log('settings changed', this._value); - this.dispatchEvent(new UmbChangeEvent()); + this.#fireChangeEvent(); }); this.observe(this.#managerContext.blockTypes, (blockTypes) => { this._blocks = blockTypes; @@ -184,6 +186,15 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement */ } + #debounceChangeEvent?: boolean; + #fireChangeEvent = async () => { + if (this.#debounceChangeEvent) return; + this.#debounceChangeEvent = true; + await Promise.resolve(); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); + this.#debounceChangeEvent = false; + }; + render() { let createPath: string | undefined; if (this._blocks?.length === 1) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts index 9eb8494a17..64a4dd422b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts @@ -119,7 +119,7 @@ export class UmbInputBlockTypeElement< .name=${block.label} .iconColor=${block.iconColor} .backgroundColor=${block.backgroundColor} - .href="${this.workspacePath}/edit/${block.contentElementTypeKey}" + .href="${this.workspacePath}edit/${block.contentElementTypeKey}" .contentElementTypeKey=${block.contentElementTypeKey}> this.#onRequestDelete(block)} label="Remove block"> diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts index 41652aef23..f8c8603de8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts @@ -163,6 +163,7 @@ export class UmbBlockTypeWorkspaceContext boolean) { if (value === this.#filter) return; this.#filter = value; - if (this.#attached) { - this._observeExtensions(); - } + this.#observeExtensions(); } #filter: (manifest: any) => boolean = () => true; @@ -100,11 +96,18 @@ export class UmbExtensionSlotElement extends UmbLitElement { connectedCallback(): void { super.connectedCallback(); - this._observeExtensions(); this.#attached = true; + this.#observeExtensions(); + } + disconnectedCallback(): void { + this.#attached = false; + this.#extensionsController?.destroy(); + this.#extensionsController = undefined; + super.disconnectedCallback(); } - private _observeExtensions(): void { + #observeExtensions(): void { + if (!this.#attached) return; this.#extensionsController?.destroy(); if (this.#type) { this.#extensionsController = new UmbExtensionsElementInitializer( @@ -128,7 +131,7 @@ export class UmbExtensionSlotElement extends UmbLitElement { this._permitted, (ext) => ext.alias, (ext) => (this.renderMethod ? this.renderMethod(ext) : ext.component), - ) + ) : html``; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts index a9ea9b08dd..4a3ef2eccb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts @@ -45,9 +45,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { public set type(value: string | string[] | undefined) { if (value === this.#type) return; this.#type = value; - if (this.#attached) { - this.#observeExtensions(); - } + this.#observeExtensions(); } #type?: string | string[] | undefined; @@ -67,9 +65,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { public set filter(value: (manifest: any) => boolean) { if (value === this.#filter) return; this.#filter = value; - if (this.#attached) { - this.#observeExtensions(); - } + this.#observeExtensions(); } #filter: (manifest: any) => boolean = () => true; @@ -147,11 +143,19 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { connectedCallback(): void { super.connectedCallback(); - this.#observeExtensions(); this.#attached = true; + this.#observeExtensions(); + } + disconnectedCallback(): void { + this.#attached = false; + this.#extensionsController?.destroy(); + this.#extensionsController = undefined; + super.disconnectedCallback(); } #observeExtensions(): void { + // We want to be attached before we start observing extensions, cause first at this point we know that we got the right properties. [NL] + if (!this.#attached) return; this.#extensionsController?.destroy(); if (this.#type) { this.#extensionsController = new UmbExtensionsElementAndApiInitializer( diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/field-dropdown-list/field-dropdown-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/field-dropdown-list/field-dropdown-list.element.ts index 837006de80..01aa08a420 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/field-dropdown-list/field-dropdown-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/field-dropdown-list/field-dropdown-list.element.ts @@ -14,12 +14,8 @@ import { } from '@umbraco-cms/backoffice/external/lit'; import type { UUIComboboxEvent, UUIComboboxElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbMediaTypeDetailRepository } from '@umbraco-cms/backoffice/media-type'; -import { - UMB_MEDIA_TYPE_PICKER_MODAL, - UMB_MODAL_MANAGER_CONTEXT, - type UmbModalManagerContext, -} from '@umbraco-cms/backoffice/modal'; +import { UmbMediaTypeDetailRepository, UMB_MEDIA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/media-type'; +import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; interface FieldPickerValue { alias: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts index 9e27a0707c..250a041229 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts @@ -1,5 +1,5 @@ import { html, customElement, property, css, state, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository'; @@ -13,7 +13,7 @@ import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/mod import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; @customElement('umb-input-collection-configuration') -export class UmbInputCollectionConfigurationElement extends FormControlMixin(UmbLitElement) { +export class UmbInputCollectionConfigurationElement extends UUIFormControlMixin(UmbLitElement, {}) { protected getFormElement() { return undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts index 44b2794d90..b616c98dfd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts @@ -1,5 +1,5 @@ import { html, customElement, property, map, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbSwatchDetails } from '@umbraco-cms/backoffice/models'; @@ -10,7 +10,7 @@ import type { UUIColorSwatchesEvent } from '@umbraco-cms/backoffice/external/uui * @element umb-input-color */ @customElement('umb-input-color') -export class UmbInputColorElement extends FormControlMixin(UmbLitElement) { +export class UmbInputColorElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ type: Boolean }) showLabels = false; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-content-type-property/input-content-type-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-content-type-property/input-content-type-property.element.ts index 5ea836aa88..34f82f10b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-content-type-property/input-content-type-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-content-type-property/input-content-type-property.element.ts @@ -1,11 +1,11 @@ import { html, customElement, property, css } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbChangeEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; -import { UmbMediaTypeDetailRepository } from '@umbraco-cms/backoffice/media-type'; +import { UmbMediaTypeDetailRepository, UMB_MEDIA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/media-type'; import { UMB_DOCUMENT_TYPE_PICKER_MODAL, UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; import { UMB_MEMBER_TYPE_PICKER_MODAL, UmbMemberTypeDetailRepository } from '@umbraco-cms/backoffice/member-type'; -import { UMB_ITEM_PICKER_MODAL, UMB_MEDIA_TYPE_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UMB_ITEM_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; import type { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; import type { UmbItemPickerModel, UmbModalToken, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; @@ -32,7 +32,7 @@ type UmbInputContentTypePropertyConfiguration = { }; @customElement('umb-input-content-type-property') -export class UmbInputContentTypePropertyElement extends FormControlMixin(UmbLitElement) { +export class UmbInputContentTypePropertyElement extends UUIFormControlMixin(UmbLitElement, undefined) { #configuration: UmbInputContentTypePropertyConfiguration = { documentTypes: { item: { @@ -45,13 +45,43 @@ export class UmbInputContentTypePropertyElement extends FormControlMixin(UmbLitE pickableFilter: (docType) => !docType.isElement, repository: () => new UmbDocumentTypeDetailRepository(this), systemProperties: [ - { label: this.localize.term('content_documentType'), description: 'contentTypeAlias', value: 'contentTypeAlias', icon: 'icon-settings' }, - { label: this.localize.term('content_createDate'), description: 'createDate', value: 'createDate', icon: 'icon-settings' }, + { + label: this.localize.term('content_documentType'), + description: 'contentTypeAlias', + value: 'contentTypeAlias', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_createDate'), + description: 'createDate', + value: 'createDate', + icon: 'icon-settings', + }, { label: this.localize.term('content_createBy'), description: 'owner', value: 'owner', icon: 'icon-settings' }, - { label: this.localize.term('content_isPublished'), description: 'published', value: 'published', icon: 'icon-settings' }, - { label: this.localize.term('general_sort'), description: 'sortOrder', value: 'sortOrder', icon: 'icon-settings' }, - { label: this.localize.term('content_updateDate'), description: 'updateDate', value: 'updateDate', icon: 'icon-settings' }, - { label: this.localize.term('content_updatedBy'), description: 'updater', value: 'updater', icon: 'icon-settings' }, + { + label: this.localize.term('content_isPublished'), + description: 'published', + value: 'published', + icon: 'icon-settings', + }, + { + label: this.localize.term('general_sort'), + description: 'sortOrder', + value: 'sortOrder', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_updateDate'), + description: 'updateDate', + value: 'updateDate', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_updatedBy'), + description: 'updater', + value: 'updater', + icon: 'icon-settings', + }, ], }, elementTypes: { @@ -82,12 +112,37 @@ export class UmbInputContentTypePropertyElement extends FormControlMixin(UmbLitE pickerModal: () => UMB_MEDIA_TYPE_PICKER_MODAL, repository: () => new UmbMediaTypeDetailRepository(this), systemProperties: [ - { label: this.localize.term('content_documentType'), description: 'contentTypeAlias', value: 'contentTypeAlias', icon: 'icon-settings' }, - { label: this.localize.term('content_createDate'), description: 'createDate', value: 'createDate', icon: 'icon-settings' }, + { + label: this.localize.term('content_documentType'), + description: 'contentTypeAlias', + value: 'contentTypeAlias', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_createDate'), + description: 'createDate', + value: 'createDate', + icon: 'icon-settings', + }, { label: this.localize.term('content_createBy'), description: 'owner', value: 'owner', icon: 'icon-settings' }, - { label: this.localize.term('general_sort'), description: 'sortOrder', value: 'sortOrder', icon: 'icon-settings' }, - { label: this.localize.term('content_updateDate'), description: 'updateDate', value: 'updateDate', icon: 'icon-settings' }, - { label: this.localize.term('content_updatedBy'), description: 'updater', value: 'updater', icon: 'icon-settings' }, + { + label: this.localize.term('general_sort'), + description: 'sortOrder', + value: 'sortOrder', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_updateDate'), + description: 'updateDate', + value: 'updateDate', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_updatedBy'), + description: 'updater', + value: 'updater', + icon: 'icon-settings', + }, ], }, memberTypes: { @@ -100,11 +155,31 @@ export class UmbInputContentTypePropertyElement extends FormControlMixin(UmbLitE pickerModal: () => UMB_MEMBER_TYPE_PICKER_MODAL, repository: () => new UmbMemberTypeDetailRepository(this), systemProperties: [ - { label: this.localize.term('content_documentType'), description: 'contentTypeAlias', value: 'contentTypeAlias', icon: 'icon-settings' }, - { label: this.localize.term('content_createDate'), description: 'createDate', value: 'createDate', icon: 'icon-settings' }, + { + label: this.localize.term('content_documentType'), + description: 'contentTypeAlias', + value: 'contentTypeAlias', + icon: 'icon-settings', + }, + { + label: this.localize.term('content_createDate'), + description: 'createDate', + value: 'createDate', + icon: 'icon-settings', + }, { label: this.localize.term('general_email'), description: 'email', value: 'email', icon: 'icon-settings' }, - { label: this.localize.term('content_updateDate'), description: 'updateDate', value: 'updateDate', icon: 'icon-settings' }, - { label: this.localize.term('general_username'), description: 'username', value: 'username', icon: 'icon-settings' }, + { + label: this.localize.term('content_updateDate'), + description: 'updateDate', + value: 'updateDate', + icon: 'icon-settings', + }, + { + label: this.localize.term('general_username'), + description: 'username', + value: 'username', + icon: 'icon-settings', + }, ], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts index 9331038dcf..0da0ec53c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts @@ -1,11 +1,11 @@ -import { UmbConfigRepository } from '../../repository/config/config.repository.js'; -import { css, html, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-date') -export class UmbInputDateElement extends FormControlMixin(UmbLitElement) { +export class UmbInputDateElement extends UUIFormControlMixin(UmbLitElement, '') { protected getFormElement() { return undefined; } @@ -22,12 +22,6 @@ export class UmbInputDateElement extends FormControlMixin(UmbLitElement) { @property({ type: String }) displayValue?: string; - @property({ type: Boolean }) - offsetTime = false; - - @state() - private _offsetValue = 0; - @property({ type: String }) min?: string; @@ -37,42 +31,25 @@ export class UmbInputDateElement extends FormControlMixin(UmbLitElement) { @property({ type: Number }) step?: number; - private _configRepository = new UmbConfigRepository(this); - - constructor() { - super(); - } - connectedCallback(): void { super.connectedCallback(); - this.offsetTime ? this.#getOffset() : (this.displayValue = this.#UTCToLocal(this.value as string)); - } - - async #getOffset() { - const data = await this._configRepository.getServertimeOffset(); - if (!data) return; - this._offsetValue = data.offset; if (!this.value) return; - this.displayValue = this.#valueToServerOffset(this.value as string, true); + this.displayValue = this.#UTCToLocal(this.value as string); } - #localToUTC(d: string) { + #localToUTC(date: string) { if (this.type === 'time') { - return new Date(`${new Date().toJSON().slice(0, 10)} ${d}`).toISOString().slice(11, 16); + return new Date(`${new Date().toJSON().slice(0, 10)} ${date}`).toISOString().slice(11, 16); } else { - const date = new Date(d); - const isoDate = date.toISOString(); - return `${isoDate.substring(0, 10)}T${isoDate.substring(11, 19)}Z`; + return new Date(date).toJSON(); } } #UTCToLocal(d: string) { if (this.type === 'time') { const local = new Date(`${new Date().toJSON().slice(0, 10)} ${d}Z`) - .toLocaleTimeString(undefined, { - hourCycle: 'h23', - }) + .toLocaleTimeString(undefined, { hourCycle: 'h23' }) .slice(0, 5); return local; } else { @@ -89,58 +66,25 @@ export class UmbInputDateElement extends FormControlMixin(UmbLitElement) { } } - #dateToString(date: Date) { - return `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}T${( - '0' + date.getHours() - ).slice(-2)}:${('0' + date.getMinutes()).slice(-2)}:${('0' + date.getSeconds()).slice(-2)}`; - } + #onChange(event: UUIInputEvent) { + const newValue = event.target.value as string; + if (!newValue) return; - #valueToServerOffset(d: string, utc = false) { - if (this.type === 'time') { - const newDate = new Date(`${new Date().toJSON().slice(0, 10)} ${d}`); - const dateOffset = new Date( - newDate.setTime(newDate.getTime() + (utc ? this._offsetValue * -1 : this._offsetValue) * 60 * 1000), - ); - const time = dateOffset - .toLocaleTimeString(undefined, { - hourCycle: 'h23', - }) - .slice(0, 5); - return time; - } else { - const newDate = new Date(d.replace('Z', '')); - const dateOffset = new Date( - newDate.setTime(newDate.getTime() + (utc ? this._offsetValue * -1 : this._offsetValue) * 60 * 1000), - ); - return this.type === 'datetime-local' - ? this.#dateToString(dateOffset) - : this.#dateToString(dateOffset).slice(0, 10); - } - } - - #onChange(e: UUIInputEvent) { - e.stopPropagation(); - const picked = e.target.value as string; - if (!picked) { - this.value = ''; - this.displayValue = ''; - return; - } - this.value = this.offsetTime ? this.#valueToServerOffset(picked) : this.#localToUTC(picked); - this.displayValue = picked; - this.dispatchEvent(new CustomEvent('change')); + this.value = this.#localToUTC(newValue); + this.displayValue = newValue; + this.dispatchEvent(new UmbChangeEvent()); } render() { return html` + .min=${this.min} + .max=${this.max} + .step=${this.step} + .type=${this.type} + .value="${this.displayValue?.replace('Z', '')}" + @change=${this.#onChange}> `; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts index ca52c1e656..3fb1592fc6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts @@ -1,11 +1,11 @@ import { css, html, customElement, property, query } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-dropdown-list') -export class UmbInputDropdownListElement extends FormControlMixin(UmbLitElement) { +export class UmbInputDropdownListElement extends UUIFormControlMixin(UmbLitElement, undefined) { @property({ type: Array }) public options?: Array`} + `} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.ts index f606197309..3713da212d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.ts @@ -1,6 +1,6 @@ import { css, html, nothing, customElement, property, query } from '@umbraco-cms/backoffice/external/lit'; import type { UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { UmbChangeEvent, UmbInputEvent, UmbDeleteEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -9,7 +9,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; * @element umb-input-multiple-text-string-item */ @customElement('umb-input-multiple-text-string-item') -export class UmbInputMultipleTextStringItemElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMultipleTextStringItemElement extends UUIFormControlMixin(UmbLitElement, '') { /** * Disables the input * @type {boolean} @@ -101,7 +101,7 @@ export class UmbInputMultipleTextStringItemElement extends FormControlMixin(UmbL ?disabled=${this.disabled} compact> - `} + `} `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string.element.ts index e014cbeba7..06e73c10d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/multiple-text-string-input/input-multiple-text-string.element.ts @@ -1,6 +1,6 @@ import type { UmbInputMultipleTextStringItemElement } from './input-multiple-text-string-item.element.js'; import { css, html, nothing, repeat, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbSorterController } from '@umbraco-cms/backoffice/sorter'; @@ -10,7 +10,7 @@ import type { UmbInputEvent, UmbDeleteEvent } from '@umbraco-cms/backoffice/even * @element umb-input-multiple-text-string */ @customElement('umb-input-multiple-text-string') -export class UmbInputMultipleTextStringElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMultipleTextStringElement extends UUIFormControlMixin(UmbLitElement, '') { #sorter = new UmbSorterController(this, { getUniqueOfElement: (element) => { return element.getAttribute('data-sort-entry-id'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index 43234edd3d..4b7eaa35e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -30,6 +30,7 @@ export interface UmbTableColumn { elementName?: string; width?: string; allowSorting?: boolean; + align?: 'left' | 'center' | 'right'; } export interface UmbTableColumnLayoutElement extends HTMLElement { @@ -176,7 +177,9 @@ export class UmbTableElement extends LitElement { private _renderHeaderCell(column: UmbTableColumn) { return html` - ${column.allowSorting ? html`${this._renderSortingUI(column)}` : column.name} + ${column.allowSorting + ? html`${this._renderSortingUI(column)}` + : html`${column.name}`} `; } @@ -184,9 +187,9 @@ export class UmbTableElement extends LitElement { private _renderSortingUI(column: UmbTableColumn) { return html` @@ -225,23 +228,27 @@ export class UmbTableElement extends LitElement { if (this.config.hideIcon && !this.config.allowSelection) return; return html` - ${when(!this.config.hideIcon, () => html``)} + ${when(!this.config.hideIcon, () => html``)} ${when( this.config.allowSelection, - () => - html` html` + e.stopPropagation()} @change=${(event: Event) => this._handleRowCheckboxChange(event, item)} ?checked="${this._isSelected(item.id)}"> - `, + + `, )} `; } private _renderRowCell(column: UmbTableColumn, item: UmbTableItem) { - return html`${this._renderCellContent(column, item)} + return html` + + ${this._renderCellContent(column, item)} + `; } @@ -280,10 +287,10 @@ export class UmbTableElement extends LitElement { display: none; } - uui-table-row[selectable]:focus uui-icon, - uui-table-row[selectable]:focus-within uui-icon, - uui-table-row[selectable]:hover uui-icon, - uui-table-row[select-only] uui-icon { + uui-table-row[selectable]:focus umb-icon, + uui-table-row[selectable]:focus-within umb-icon, + uui-table-row[selectable]:hover umb-icon, + uui-table-row[select-only] umb-icon { display: none; } @@ -313,8 +320,11 @@ export class UmbTableElement extends LitElement { justify-content: space-between; width: 100%; } + uui-table-head-cell button > span { + flex: 1 0 auto; + } - uui-table-cell uui-icon { + uui-table-cell umb-icon { vertical-align: top; } `, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts index c28a24bcd3..8c045ef7a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.element.ts @@ -8,9 +8,9 @@ import type { } from './property-type-settings-modal.token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIBooleanInputEvent, UUIInputEvent, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; -import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; import { UMB_CONTENT_TYPE_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/content-type'; // TODO: Could base take a token to get its types? [NL] @@ -92,15 +92,6 @@ export class UmbPropertyTypeSettingsModalElement extends UmbModalBaseElement< } } - protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { - super.firstUpdated(_changedProperties); - - // TODO: Make a general way to put focus on a input in a modal. (also make sure it only happens if its the top-most-modal.) [NL] - requestAnimationFrame(() => { - (this.shadowRoot!.querySelector('#name-input') as HTMLElement).focus(); - }); - } - #onSubmit(event: SubmitEvent) { event.preventDefault(); @@ -240,7 +231,8 @@ export class UmbPropertyTypeSettingsModalElement extends UmbModalBaseElement< label="property name (TODO: Localize)" @input=${this.#onNameChange} .value=${this.value.name} - placeholder="Enter a name..."> + placeholder="Enter a name..." + ${umbFocus()}> culture.name === this._value); + this.value = target.value; + const culture = this._cultures.find( + (culture) => culture.name.toLowerCase() === (this.value as string).toLowerCase(), + ); this.selectedCultureName = culture?.englishName; this.dispatchEvent(new UmbChangeEvent()); } @@ -69,7 +71,7 @@ export class UmbInputCultureSelectElement extends FormControlMixin(UmbLitElement } get #fromAvailableCultures() { - return this._cultures.find((culture) => culture.name === this.value); + return this._cultures.find((culture) => culture.name.toLowerCase() === (this.value as string).toLowerCase()); } render() { @@ -94,7 +96,7 @@ export class UmbInputCultureSelectElement extends FormControlMixin(UmbLitElement )} - `} + `} `; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts index 005791ff7b..11a86bfa69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts @@ -1,4 +1,5 @@ export * from './duplicate/duplicate.action.js'; +export * from './move/index.js'; export * from './delete/delete.action.js'; -export * from './move/move.action.js'; +export * from './move/move-to.action.js'; export * from './sort-children-of/sort-children-of.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/index.ts similarity index 72% rename from src/Umbraco.Web.UI.Client/src/packages/core/repository/move/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/index.ts index cefe904535..80364fa0d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/index.ts @@ -1,2 +1,3 @@ export type { UmbMoveDataSource } from './move-data-source.interface.js'; export type { UmbMoveRepository } from './move-repository.interface.js'; +export type { UmbMoveToRequestArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts index c111cc6e3e..d25f71a9d6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/manifests.ts @@ -1,3 +1,3 @@ -import { manifest as moveKindManifest } from './move.action.kind.js'; +import { manifest as moveToKindManifest } from './move-to.action.kind.js'; -export const manifests = [moveKindManifest]; +export const manifests = [moveToKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-data-source.interface.ts new file mode 100644 index 0000000000..61bae326d9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-data-source.interface.ts @@ -0,0 +1,6 @@ +import type { UmbMoveToRequestArgs } from './types.js'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbMoveDataSource { + moveTo(args: UmbMoveToRequestArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-repository.interface.ts new file mode 100644 index 0000000000..4eb344bcd9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-repository.interface.ts @@ -0,0 +1,7 @@ +import type { UmbRepositoryErrorResponse } from '../../../repository/types.js'; +import type { UmbMoveToRequestArgs } from './types.js'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbMoveRepository extends UmbApi { + requestMoveTo(args: UmbMoveToRequestArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.kind.ts similarity index 75% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.kind.ts index 09b3fb9010..79a7cdeae0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.kind.ts @@ -3,22 +3,22 @@ import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extensio export const manifest: UmbBackofficeManifestKind = { type: 'kind', - alias: 'Umb.Kind.EntityAction.Move', - matchKind: 'move', + alias: 'Umb.Kind.EntityAction.MoveTo', + matchKind: 'moveTo', matchType: 'entityAction', manifest: { ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, type: 'entityAction', - kind: 'move', - api: () => import('./move.action.js'), + kind: 'moveTo', + api: () => import('./move-to.action.js'), weight: 700, forEntityTypes: [], meta: { icon: 'icon-enter', label: '#actions_move', - itemRepositoryAlias: '', + treeRepositoryAlias: '', moveRepositoryAlias: '', - pickerModal: '', + treeAlias: '', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.ts new file mode 100644 index 0000000000..a06f2d9bc8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move-to.action.ts @@ -0,0 +1,44 @@ +import { UmbEntityActionBase } from '../../entity-action-base.js'; +import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import type { UmbMoveRepository } from './move-repository.interface.js'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { MetaEntityActionMoveToKind } from '@umbraco-cms/backoffice/extension-registry'; +import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UMB_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/tree'; + +export class UmbMoveToEntityAction extends UmbEntityActionBase { + async execute() { + if (!this.args.unique) throw new Error('Unique is not available'); + if (!this.args.entityType) throw new Error('Entity Type is not available'); + + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, UMB_TREE_PICKER_MODAL, { + data: { treeAlias: this.args.meta.treeAlias }, + }) as any; // TODO: make generic picker interface with selection + const value = await modalContext.onSubmit(); + const destinationUnique = value.selection[0]; + if (destinationUnique === undefined) throw new Error('Destination Unique is not available'); + + const moveRepository = await createExtensionApiByAlias(this, this.args.meta.moveRepositoryAlias); + if (!moveRepository) throw new Error('Move Repository is not available'); + + await moveRepository.requestMoveTo({ unique: this.args.unique, destination: { unique: destinationUnique } }); + + this.#reloadMenu(); + } + + async #reloadMenu() { + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); + + // TODO: Reload destination + } +} + +export default UmbMoveToEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts deleted file mode 100644 index cefe1cc8f8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { UmbEntityActionArgs } from '../../types.js'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { UmbItemRepository, UmbMoveRepository } from '@umbraco-cms/backoffice/repository'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { umbExtensionsRegistry, type MetaEntityActionMoveKind } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; - -export class UmbMoveEntityAction extends UmbEntityActionBase { - // TODO: make base type for item and detail models - #itemRepository?: UmbItemRepository; - #moveRepository?: UmbMoveRepository; - #init: Promise; - - constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { - super(host, args); - - // TODO: We should properly look into how we can simplify the one time usage of a extension api, as its a bit of overkill to take conditions/overwrites and observation of extensions into play here: [NL] - // But since this happens when we execute an action, it does most likely not hurt any users, but it is a bit of a overkill to do this for every action: [NL] - this.#init = Promise.all([ - new UmbExtensionApiInitializer( - this._host, - umbExtensionsRegistry, - this.args.meta.itemRepositoryAlias, - [this._host], - (permitted, ctrl) => { - this.#itemRepository = permitted ? (ctrl.api as UmbItemRepository) : undefined; - }, - ).asPromise(), - - new UmbExtensionApiInitializer( - this._host, - umbExtensionsRegistry, - this.args.meta.moveRepositoryAlias, - [this._host], - (permitted, ctrl) => { - this.#moveRepository = permitted ? (ctrl.api as UmbMoveRepository) : undefined; - }, - ).asPromise(), - ]); - } - - async execute() { - if (!this.args.unique) throw new Error('Unique is not available'); - await this.#init; - - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modalContext = modalManager.open(this, this.args.meta.pickerModal) as any; // TODO: make generic picker interface with selection - const value = await modalContext.onSubmit(); - if (!value) return; - await this.#moveRepository!.move(this.args.unique, value.selection[0]); - } -} - -export default UmbMoveEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/types.ts new file mode 100644 index 0000000000..ec38ab9db3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/types.ts @@ -0,0 +1,6 @@ +export interface UmbMoveToRequestArgs { + unique: string; + destination: { + unique: string | null; + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts index b9c3f9d207..3b06e5b891 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action-list.element.ts @@ -1,5 +1,5 @@ -import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; import type { UmbEntityActionArgs } from './types.js'; +import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestEntityAction, MetaEntityAction } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -17,9 +17,9 @@ export class UmbEntityActionListElement extends UmbLitElement { this.#generateApiArgs(); this.requestUpdate('_props'); // Update filter: - const oldValue = this._filter; + //const oldValue = this._filter; this._filter = (extension: ManifestEntityAction) => extension.forEntityTypes.includes(value); - this.requestUpdate('_filter', oldValue); + //this.requestUpdate('_filter', oldValue); } @state() diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index bbe018524f..d5b95c0fa0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -1,13 +1,13 @@ import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; -import { manifests as moveEntityActionManifests } from './common/move/manifests.js'; +import { manifests as moveToEntityActionManifests } from './common/move/manifests.js'; import { manifests as sortChildrenOfEntityActionManifests } from './common/sort-children-of/manifests.js'; export const manifests = [ ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, - ...moveEntityActionManifests, + ...moveToEntityActionManifests, ...sortChildrenOfEntityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index 68ed28918a..33b6440960 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -125,16 +125,16 @@ export interface MetaEntityActionDuplicateKind extends MetaEntityActionDefaultKi pickerModal: UmbModalToken | string; } -// MOVE -export interface ManifestEntityActionMoveKind extends ManifestEntityAction { +// MOVE TO +export interface ManifestEntityActionMoveToKind extends ManifestEntityAction { type: 'entityAction'; - kind: 'move'; + kind: 'moveTo'; } -export interface MetaEntityActionMoveKind extends MetaEntityActionDefaultKind { +export interface MetaEntityActionMoveToKind extends MetaEntityActionDefaultKind { moveRepositoryAlias: string; - itemRepositoryAlias: string; - pickerModal: UmbModalToken | string; + treeRepositoryAlias: string; + treeAlias: string; } // FOLDER 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 d01657f8ef..c54c52bddb 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 @@ -11,7 +11,7 @@ import type { ManifestEntityActionRenameServerFileKind, ManifestEntityActionReloadTreeItemChildrenKind, ManifestEntityActionDuplicateKind, - ManifestEntityActionMoveKind, + ManifestEntityActionMoveToKind, ManifestEntityActionCreateFolderKind, ManifestEntityActionUpdateFolderKind, ManifestEntityActionDeleteFolderKind, @@ -122,7 +122,7 @@ export type ManifestEntityActions = | ManifestEntityActionDeleteKind | ManifestEntityActionDuplicateKind | ManifestEntityActionEmptyRecycleBinKind - | ManifestEntityActionMoveKind + | ManifestEntityActionMoveToKind | ManifestEntityActionReloadTreeItemChildrenKind | ManifestEntityActionRenameServerFileKind | ManifestEntityActionRestoreFromRecycleBinKind diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts new file mode 100644 index 0000000000..d339d4d3f4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/focus.lit-directive.ts @@ -0,0 +1,44 @@ +import { AsyncDirective, directive, nothing, type ElementPart } from '@umbraco-cms/backoffice/external/lit'; + +/** + * The `focus` directive sets focus on the given element once its connected to the DOM. + */ +class UmbFocusDirective extends AsyncDirective { + private _el?: HTMLElement; + + render() { + return nothing; + } + + override update(part: ElementPart) { + if (this._el !== part.element) { + // This does feel wrong that we need to wait one render. [NL] + // Because even if our elements focus method is implemented so it can be called initially, my research shows that calling the focus method at this point is too early, thought the element is connected to the DOM and the focus method is available. [NL] + // This smells a bit like the DOMPart of which the directive is in is not connected to the main DOM yet, and therefor cant receive focus. [NL] + // Which is why we need to await one render: [NL] + requestAnimationFrame(() => { + (this._el = part.element as HTMLElement).focus(); + }); + } + return nothing; + } + + override disconnected() { + this._el = undefined; + } + + //override reconnected() {} +} + +/** + * @description + * A Lit directive, which sets focus on the element of scope once its connected to the DOM. + * + * @example: + * ```js + * html``; + * ``` + */ +export const umbFocus = directive(UmbFocusDirective); + +//export type { UmbFocusDirective }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts new file mode 100644 index 0000000000..0ccb1bc7eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/directives/index.ts @@ -0,0 +1 @@ +export * from './focus.lit-directive.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts index c0b5f9cb8e..23bedd188b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/lit-element/index.ts @@ -1 +1,2 @@ export * from './lit-element.element.js'; +export * from './directives/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/components/ui-culture-input/ui-culture-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/components/ui-culture-input/ui-culture-input.element.ts index bbed3c9eac..5c46080ee5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/components/ui-culture-input/ui-culture-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/components/ui-culture-input/ui-culture-input.element.ts @@ -1,7 +1,7 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { css, html, customElement, query, state, property } from '@umbraco-cms/backoffice/external/lit'; import type { UUIComboboxElement, UUIComboboxEvent } from '@umbraco-cms/backoffice/external/uui'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { ManifestLocalization } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -12,7 +12,7 @@ interface UmbCultureInputOption { } @customElement('umb-ui-culture-input') -export class UmbUiCultureInputElement extends FormControlMixin(UmbLitElement) { +export class UmbUiCultureInputElement extends UUIFormControlMixin(UmbLitElement, '') { @state() private _options: Array = []; @@ -21,12 +21,12 @@ export class UmbUiCultureInputElement extends FormControlMixin(UmbLitElement) { @property({ type: String }) get value() { - return this._value; + return super.value; } set value(value: FormDataEntryValue | FormData) { if (typeof value === 'string') { - const oldValue = this._value; - this._value = value.toLowerCase(); + const oldValue = super.value; + super.value = value.toLowerCase(); this.requestUpdate('value', oldValue); } } @@ -70,7 +70,7 @@ export class UmbUiCultureInputElement extends FormControlMixin(UmbLitElement) { } render() { - return html` + return html` ${this._options.map( (option) => html`${option.name}`, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts index 91fbb6af8e..6d454f5156 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/icon-picker/icon-picker-modal.element.ts @@ -7,6 +7,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbIconPickerModalData, UmbIconPickerModalValue } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { extractUmbColorVariable, umbracoColors } from '@umbraco-cms/backoffice/resources'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; // TODO: Make use of UmbPickerLayoutBase // TODO: to prevent element extension we need to move the Picker logic into a separate class we can reuse across all pickers @@ -109,7 +110,8 @@ export class UmbIconPickerModalElement extends UmbModalBaseElement + @keyup="${this.#filterIcons}" + ${umbFocus()}> `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts index 579ec7bec7..2903c9be24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/item-picker/item-picker-modal.element.ts @@ -11,6 +11,7 @@ import { import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbItemPickerModalData, UmbItemPickerModel } from '@umbraco-cms/backoffice/modal'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-item-picker-modal') export class UmbItemPickerModalElement extends UmbModalBaseElement { @@ -52,7 +53,11 @@ export class UmbItemPickerModalElement extends UmbModalBaseElement
- +
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 311a146e78..b6c574f8f0 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 @@ -8,8 +8,6 @@ export * from './examine-fields-settings-modal.token.js'; export * from './icon-picker-modal.token.js'; export * from './item-picker-modal.token.js'; export * from './link-picker-modal.token.js'; -export * from './media-tree-picker-modal.token.js'; -export * from './media-type-picker-modal.token.js'; export * from './modal-token.js'; export * from './property-editor-ui-picker-modal.token.js'; export * from './workspace-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-type-picker-modal.token.ts deleted file mode 100644 index 39b54a4817..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-type-picker-modal.token.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { UmbModalToken } from './modal-token.js'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; -import type { UmbUniqueTreeItemModel } from '@umbraco-cms/backoffice/tree'; - -export type UmbMediaTypePickerModalData = UmbTreePickerModalData; -export type UmbMediaTypePickerModalValue = UmbPickerModalValue; - -export const UMB_MEDIA_TYPE_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', - { - modal: { - type: 'sidebar', - size: 'small', - }, - data: { - treeAlias: 'Umb.Tree.MediaType', - }, - }, -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts index 8f42e65ee0..ac1b193cb6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts @@ -7,9 +7,3 @@ export interface UmbPickerModalData { export interface UmbPickerModalValue { selection: Array; } - -export interface UmbTreePickerModalData extends UmbPickerModalData { - treeAlias?: string; -} - -export interface UmbTreePickerModalValue extends UmbPickerModalValue {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.DateTime.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.DateTime.ts index 4bf4469b90..48a98c08a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.DateTime.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.DateTime.ts @@ -1,36 +1,10 @@ import type { ManifestPropertyEditorSchema } from '@umbraco-cms/backoffice/extension-registry'; -// TODO: We won't include momentjs anymore so we need to find a way to handle date formats export const manifest: ManifestPropertyEditorSchema = { type: 'propertyEditorSchema', name: 'Date/Time', alias: 'Umbraco.DateTime', meta: { defaultPropertyEditorUiAlias: 'Umb.PropertyEditorUi.DatePicker', - settings: { - properties: [ - { - alias: 'offsetTime', - label: 'Offset time', - description: - 'When enabled the time displayed will be offset with the servers timezone, this is useful for scenarios like scheduled publishing when an editor is in a different timezone than the hosted server', - propertyEditorUiAlias: 'Umb.PropertyEditorUi.Toggle', - config: [ - { - alias: 'labelOff', - value: 'Adjust to local time', - }, - { - alias: 'labelOn', - value: 'Adjust to local time', - }, - { - alias: 'showLabels', - value: true, - }, - ], - }, - ], - }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/checkbox-list/input-checkbox-list/input-checkbox-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/checkbox-list/input-checkbox-list/input-checkbox-list.element.ts index 9fd855e21f..3952186dac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/checkbox-list/input-checkbox-list/input-checkbox-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/checkbox-list/input-checkbox-list/input-checkbox-list.element.ts @@ -1,11 +1,11 @@ import { css, html, nothing, repeat, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-checkbox-list') -export class UmbInputCheckboxListElement extends FormControlMixin(UmbLitElement) { +export class UmbInputCheckboxListElement extends UUIFormControlMixin(UmbLitElement, '') { // TODO: Could this use a type that we export to ensure TS failure, or hook this up with a type coming from backend? @property({ attribute: false }) public list: Array<{ label: string; value: string; checked: boolean }> = []; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/date-picker/property-editor-ui-date-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/date-picker/property-editor-ui-date-picker.element.ts index ebbbe7daa9..9912586cf8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/date-picker/property-editor-ui-date-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/date-picker/property-editor-ui-date-picker.element.ts @@ -1,43 +1,15 @@ -import type { UmbPropertyEditorConfigCollection } from '../../index.js'; import { UmbPropertyValueChangeEvent } from '../../index.js'; -import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbPropertyEditorConfigCollection } from '../../index.js'; +import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbInputDateElement } from '@umbraco-cms/backoffice/components'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; /** * @element umb-property-editor-ui-date-picker */ @customElement('umb-property-editor-ui-date-picker') export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implements UmbPropertyEditorUiElement { - private _value?: Date; - private _valueString?: string; - - @property() - set value(value: string | undefined) { - if (value) { - const d = new Date(value); - this._value = d; - this._valueString = `${d.getFullYear()}-${ - d.getMonth() + 1 - }-${d.getDate()}T${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`; - } else { - this._value = undefined; - this._valueString = undefined; - } - } - get value() { - return this._valueString; - } - - private _onInput(e: InputEvent) { - const dateField = e.target as HTMLInputElement; - this.value = dateField.value; - this.dispatchEvent(new UmbPropertyValueChangeEvent()); - } - - private _format?: string; - @state() private _inputType: UmbInputDateElement['type'] = 'datetime-local'; @@ -50,29 +22,34 @@ export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implemen @state() private _step?: number; - private _offsetTime?: boolean; + @property() + set value(value: string | undefined) { + if (value) { + // NOTE: If the `value` contains a space, then it doesn't contain the timezone, so may not be parsed as UTC. [LK] + const datetime = !value.includes(' ') ? value : value + ' +00'; + this.#value = new Date(datetime).toJSON(); + } + } + get value() { + return this.#value; + } + #value?: string; public set config(config: UmbPropertyEditorConfigCollection | undefined) { if (!config) return; const oldVal = this._inputType; // Format string prevalue/config - this._format = config.getValueByAlias('format'); - const pickTime = this._format?.includes('H') || this._format?.includes('m'); - if (pickTime) { - this._inputType = 'datetime-local'; - } else { - this._inputType = 'date'; - } + const format = config.getValueByAlias('format'); + const hasTime = format?.includes('H') || format?.includes('m'); + this._inputType = hasTime ? 'datetime-local' : 'date'; // Based on the type of format string change the UUI-input type const timeFormatPattern = /^h{1,2}:m{1,2}(:s{1,2})?\s?a?$/gim; - if (this._format?.toLowerCase().match(timeFormatPattern)) { + if (format?.toLowerCase().match(timeFormatPattern)) { this._inputType = 'time'; } - //TODO: - this._offsetTime = config.getValueByAlias('offsetTime'); this._min = config.getValueByAlias('min'); this._max = config.getValueByAlias('max'); this._step = config.getValueByAlias('step'); @@ -80,16 +57,22 @@ export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implemen this.requestUpdate('_inputType', oldVal); } + #onChange(event: CustomEvent & { target: HTMLInputElement }) { + this.value = event.target.value; + this.dispatchEvent(new UmbPropertyValueChangeEvent()); + } + render() { - return html``; + return html` + + + `; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index 7557680428..3e12caefbd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -5,6 +5,5 @@ export * from './item/index.js'; export * from './detail/index.js'; export type { UmbDataSourceResponse, UmbDataSourceErrorResponse } from './data-source-response.interface.js'; -export type { UmbMoveDataSource, UmbMoveRepository } from './move/index.js'; export type { UmbDuplicateDataSource, UmbDuplicateRepository } from './duplicate/index.js'; export type { UmbPagedModel, UmbRepositoryResponse, UmbRepositoryErrorResponse } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-data-source.interface.ts deleted file mode 100644 index e0ac7ce1d7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-data-source.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; - -export interface UmbMoveDataSource { - move(unique: string, targetUnique: string | null): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts deleted file mode 100644 index 9502e8d409..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { UmbRepositoryErrorResponse } from '../types.js'; - -export interface UmbMoveRepository { - move(unique: string, targetUnique: string): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/components/input-section/input-section.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/components/input-section/input-section.element.ts index 40040eca48..63025e5774 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/components/input-section/input-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/components/input-section/input-section.element.ts @@ -1,12 +1,12 @@ import type { UmbSectionItemModel } from '../../repository/index.js'; import { UmbSectionPickerContext } from './input-section.context.js'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-input-section') -export class UmbInputSectionElement extends FormControlMixin(UmbLitElement) { +export class UmbInputSectionElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.element.ts index 5129eacf48..83ddc09f3c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.element.ts @@ -1,5 +1,5 @@ import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; @@ -9,7 +9,7 @@ import type { UmbReferenceByUniqueAndType } from '@umbraco-cms/backoffice/models import type { UmbTreePickerSource } from '@umbraco-cms/backoffice/components'; @customElement('umb-input-tree') -export class UmbInputTreeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputTreeElement extends UUIFormControlMixin(UmbLitElement, '') { protected getFormElement() { return undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index a4f1071496..f12bb43497 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -13,6 +13,9 @@ export { UmbRequestReloadTreeItemChildrenEvent, } from './reload-tree-item-children/index.js'; +export type { UmbTreePickerModalData, UmbTreePickerModalValue } from './tree-picker/index.js'; +export { UMB_TREE_PICKER_MODAL, UMB_TREE_PICKER_MODAL_ALIAS } from './tree-picker/index.js'; + export * from './types.js'; /* diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 9ed19cce79..3c7a25dfac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -355,6 +355,10 @@ export abstract class UmbTreeItemContextBase extends UmbModalBaseElement< UmbTreePickerModalData, - UmbPickerModalValue + UmbTreePickerModalValue > { @state() _selectionConfiguration: UmbTreeSelectionConfiguration = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.token.ts new file mode 100644 index 0000000000..c0b5daa592 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.token.ts @@ -0,0 +1,19 @@ +import { UMB_TREE_PICKER_MODAL_ALIAS } from './constants.js'; +import type { UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbTreePickerModalData extends UmbPickerModalData { + treeAlias?: string; +} + +export interface UmbTreePickerModalValue extends UmbPickerModalValue {} + +export const UMB_TREE_PICKER_MODAL = new UmbModalToken( + UMB_TREE_PICKER_MODAL_ALIAS, + { + modal: { + type: 'sidebar', + size: 'small', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts index 6342015531..833b115891 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts @@ -7,7 +7,7 @@ import { } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, query } from '@umbraco-cms/backoffice/external/lit'; import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, type ActiveVariant } from '@umbraco-cms/backoffice/workspace'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; @@ -206,6 +206,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { label="Document name (TODO: Localize)" .value=${this._name ?? ''} @input=${this.#handleInput} + ${umbFocus()} > ${ this._variants?.length diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-breadcrumb/workspace-menu-breadcrumb/workspace-menu-breadcrumb.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-breadcrumb/workspace-menu-breadcrumb/workspace-menu-breadcrumb.element.ts index bef6a6a284..7ab9dafbd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-breadcrumb/workspace-menu-breadcrumb/workspace-menu-breadcrumb.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-breadcrumb/workspace-menu-breadcrumb/workspace-menu-breadcrumb.element.ts @@ -1,4 +1,4 @@ -import { html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, ifDefined, map } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @@ -72,10 +72,11 @@ export class UmbWorkspaceBreadcrumbElement extends UmbLitElement { render() { return html` - ${this._structure?.map( + ${map( + this._structure, (structureItem) => - html`${structureItem.name}${this.localize.string(structureItem.name)}`, )} ${this._name} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts index d89712a6da..a899ddbf5a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts @@ -1,7 +1,7 @@ import { UMB_DATATYPE_WORKSPACE_MODAL } from '../../index.js'; import { UMB_DATA_TYPE_PICKER_FLOW_MODAL } from '../../modals/index.js'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @@ -15,7 +15,7 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; * @fires focus - when the input gains focus */ @customElement('umb-data-type-flow-input') -export class UmbInputDataTypeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputDataTypeElement extends UUIFormControlMixin(UmbLitElement, '') { protected getFormElement() { return undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-input/data-type-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-input/data-type-input.element.ts index de989b2070..504d13de9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-input/data-type-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-input/data-type-input.element.ts @@ -1,12 +1,12 @@ import type { UmbDataTypeItemModel } from '../../repository/item/types.js'; import { UmbDataTypePickerContext } from './data-type-input.context.js'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-data-type-input') -export class UmbDataTypeInputElement extends FormControlMixin(UmbLitElement) { +export class UmbDataTypeInputElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts index e75c7625ff..4220e0dea3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/manifests.ts @@ -2,7 +2,7 @@ import { UMB_DATA_TYPE_ENTITY_TYPE } from '../entity.js'; import { UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS } from '../repository/detail/index.js'; import { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../repository/item/manifests.js'; import { manifests as createManifests } from './create/manifests.js'; -import { manifests as moveManifests } from './move/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import { manifests as duplicateManifests } from './duplicate/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/index.ts new file mode 100644 index 0000000000..4d65421fc3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveDataTypeRepository, UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts new file mode 100644 index 0000000000..84363a8f97 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/manifests.ts @@ -0,0 +1,23 @@ +import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_DATA_TYPE_TREE_ALIAS } from '../../tree/manifests.js'; +import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.DataType.MoveTo', + name: 'Move Data Type Entity Action', + forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_DATA_TYPE_TREE_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/constants.ts new file mode 100644 index 0000000000..6b264a17ca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.repository.ts new file mode 100644 index 0000000000..265cef4ccb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveDataTypeServerDataSource } from './data-type-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveDataTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveDataTypeServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.server.data-source.ts new file mode 100644 index 0000000000..4b96fcf784 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/data-type-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move Data Type Server Data Source + * @export + * @class UmbMoveDataTypeServerDataSource + */ +export class UmbMoveDataTypeServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveDataTypeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveDataTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveDataTypeServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + DataTypeService.putDataTypeByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/index.ts similarity index 56% rename from src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/index.ts index dfc6dcb884..6c2a31c2d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/index.ts @@ -1,2 +1,2 @@ export { UmbMoveDataTypeRepository } from './data-type-move.repository.js'; -export { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/manifests.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/manifests.ts index b43eca4387..911c6e83a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move-to/repository/manifests.ts @@ -1,8 +1,7 @@ +import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './constants.js'; import { UmbMoveDataTypeRepository } from './data-type-move.repository.js'; import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Move'; - const moveRepository: ManifestRepository = { type: 'repository', alias: UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts deleted file mode 100644 index 79ef41ec28..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/move/manifests.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DATA_TYPE_PICKER_MODAL } from '../../modals/index.js'; -import { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from '../../repository/move/manifests.js'; -import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; - -const entityActions: Array = [ - { - type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.DataType.Move', - name: 'Move Data Type Entity Action', - forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE], - meta: { - itemRepositoryAlias: UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS, - moveRepositoryAlias: UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS, - pickerModal: UMB_DATA_TYPE_PICKER_MODAL, - }, - }, -]; - -export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/index.ts index b7e28226cd..5c6ce9c6f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/index.ts @@ -6,4 +6,6 @@ export * from './repository/index.js'; export * from './workspace/index.js'; export * from './modals/index.js'; +export { UmbMoveDataTypeRepository, UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './entity-actions/move-to/index.js'; + export type { UmbDataTypeDetailModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index d0d634e4e0..962abe0c73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -14,6 +14,7 @@ import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; interface GroupedItems { [key: string]: Array; @@ -187,7 +188,8 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< id="filter" @input="${this._handleFilterInput}" placeholder="Type to filter..." - label="Type to filter icons"> + label="Type to filter icons" + ${umbFocus()}>
`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-modal.token.ts index 1208d6e2c1..d3b0d87e26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-modal.token.ts @@ -1,12 +1,16 @@ -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + type UmbUniqueTreeItemModel, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbUniqueTreeItemModel } from '@umbraco-cms/backoffice/tree'; export type UmbDataTypePickerModalData = UmbTreePickerModalData; -export type UmbDataTypePickerModalValue = UmbPickerModalValue; +export type UmbDataTypePickerModalValue = UmbTreePickerModalValue; export const UMB_DATA_TYPE_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', + UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts index 938329aea6..7a1894f23f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts @@ -8,6 +8,7 @@ import type { import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; interface GroupedPropertyEditorUIs { [key: string]: Array; @@ -71,7 +72,7 @@ export class UmbPropertyEditorUIPickerModalElement extends UmbModalBaseElement< return ( propertyEditorUI.name.toLowerCase().includes(query) || propertyEditorUI.alias.toLowerCase().includes(query) ); - }); + }); // TODO: groupBy is not known by TS yet // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -104,7 +105,8 @@ export class UmbPropertyEditorUIPickerModalElement extends UmbModalBaseElement< id="filter" @input="${this.#handleFilterInput}" placeholder="Type to filter..." - label="Type to filter icons"> + label="Type to filter icons" + ${umbFocus()}>
`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts index 56c390dd50..b20008a4af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts @@ -5,6 +5,5 @@ export { UMB_DATA_TYPE_DETAIL_STORE_CONTEXT, } from './detail/index.js'; export { UmbDataTypeItemRepository, UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from './item/index.js'; -export { UmbMoveDataTypeRepository, UMB_MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './move/index.js'; export type { UmbDataTypeItemModel } from './item/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/manifests.ts index d2d7f2a1c0..a403530c4c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/manifests.ts @@ -1,6 +1,5 @@ import { manifests as duplicateManifests } from './duplicate/manifests.js'; import { manifests as detailManifests } from './detail/manifests.js'; import { manifests as itemManifests } from './item/manifests.js'; -import { manifests as moveManifests } from './move/manifests.js'; -export const manifests = [...duplicateManifests, ...detailManifests, ...itemManifests, ...moveManifests]; +export const manifests = [...duplicateManifests, ...detailManifests, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts deleted file mode 100644 index 78720534b1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.repository.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { UmbDataTypeTreeStore } from '../../tree/data-type-tree.store.js'; -import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from '../../tree/data-type-tree.store.js'; -import { UmbDataTypeMoveServerDataSource } from './data-type-move.server.data-source.js'; -import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; -import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbMoveDataSource, UmbMoveRepository} from '@umbraco-cms/backoffice/repository'; -import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; - -export class UmbMoveDataTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { - #init: Promise; - #moveSource: UmbMoveDataSource; - #treeStore?: UmbDataTypeTreeStore; - #notificationContext?: UmbNotificationContext; - - constructor(host: UmbControllerHost) { - super(host); - this.#moveSource = new UmbDataTypeMoveServerDataSource(this); - - this.#init = Promise.all([ - this.consumeContext(UMB_DATA_TYPE_TREE_STORE_CONTEXT, (instance) => { - this.#treeStore = instance; - }).asPromise(), - - this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { - this.#notificationContext = instance; - }).asPromise(), - ]); - } - - async move(unique: string, targetUnique: string | null) { - await this.#init; - const { error } = await this.#moveSource.move(unique, targetUnique); - - if (!error) { - // TODO: Be aware about this responsibility. - this.#treeStore!.updateItem(unique, { parentUnique: targetUnique }); - - const notification = { data: { message: `Data type moved` } }; - this.#notificationContext!.peek('positive', notification); - } - - return { error }; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts deleted file mode 100644 index 8152c3e0c5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import type { UmbMoveDataSource } from '@umbraco-cms/backoffice/repository'; - -/** - * A data source for Data Type items that fetches data from the server - * @export - * @class UmbDataTypeMoveServerDataSource - */ -export class UmbDataTypeMoveServerDataSource implements UmbMoveDataSource { - #host: UmbControllerHost; - - /** - * Creates an instance of UmbDataTypeMoveServerDataSource. - * @param {UmbControllerHost} host - * @memberof UmbDataTypeMoveServerDataSource - */ - constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Move an item for the given id to the target unique - * @param {string} unique - * @param {(string | null)} targetUnique - * @return {*} - * @memberof UmbDataTypeMoveServerDataSource - */ - async move(unique: string, targetUnique: string | null) { - if (!unique) throw new Error('Unique is missing'); - if (targetUnique === undefined) throw new Error('Target unique is missing'); - - return tryExecuteAndNotify( - this.#host, - DataTypeService.putDataTypeByIdMove({ - id: unique, - requestBody: { - target: targetUnique ? { id: targetUnique } : null, - }, - }), - ); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts index e854377970..0d57f28704 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts @@ -11,6 +11,7 @@ import type { export const UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DataType.Tree'; export const UMB_DATA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DataType.Tree'; +export const UMB_DATA_TYPE_TREE_ALIAS = 'Umb.Tree.DataType'; const treeRepository: ManifestRepository = { type: 'repository', @@ -29,7 +30,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', kind: 'default', - alias: 'Umb.Tree.DataType', + alias: UMB_DATA_TYPE_TREE_ALIAS, name: 'Data Types Tree', meta: { repositoryAlias: UMB_DATA_TYPE_TREE_REPOSITORY_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts index 45467a2189..db4e305eaa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts @@ -2,7 +2,7 @@ import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from './data-type-workspace.context-t import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; /** * @element umb-data-type-workspace-editor @@ -24,29 +24,10 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (workspaceContext) => { this.#workspaceContext = workspaceContext; this.#workspaceContext.createPropertyDatasetContext(this); - this.#observeIsNew(); this.#observeName(); }); } - // TODO: invent some general way for all workspaces, with a name?, to put focus on the name when new. - #observeIsNew() { - if (!this.#workspaceContext) return; - this.observe( - this.#workspaceContext.isNew, - (isNew) => { - if (isNew) { - // TODO: Make a general way to put focus on a input in a modal. (also make sure it only happens if its the top-most-modal.) - requestAnimationFrame(() => { - (this.shadowRoot!.querySelector('#nameInput') as HTMLElement).focus(); - }); - } - this.removeUmbControllerByAlias('isNewRedirectController'); - }, - '_observeIsNew', - ); - } - #observeName() { if (!this.#workspaceContext) return; this.observe(this.#workspaceContext.name, (dataTypeName) => { @@ -70,7 +51,12 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { render() { return html` - + `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts index e331dd3d01..21697bf0ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts @@ -1,5 +1,6 @@ import { UMB_DICTIONARY_ENTITY_TYPE, UMB_DICTIONARY_ROOT_ENTITY_TYPE } from '../entity.js'; import { UMB_DICTIONARY_DETAIL_REPOSITORY_ALIAS, UMB_DICTIONARY_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -16,16 +17,6 @@ const entityActions: Array = [ label: '#dictionary_createNew', }, }, - { - type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.Dictionary.Move', - name: 'Move Dictionary Entity Action', - forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE], - meta: { - moveRepositoryAlias: UMB_DICTIONARY_ITEM_REPOSITORY_ALIAS, - }, - }, { type: 'entityAction', kind: 'default', @@ -80,4 +71,4 @@ const modals: Array = [ }, ]; -export const manifests = [...entityActions, ...modals]; +export const manifests = [...entityActions, ...modals, ...moveManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/index.ts new file mode 100644 index 0000000000..031cf69f39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveDictionaryRepository, UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/manifests.ts new file mode 100644 index 0000000000..5dd01d2e19 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_DICTIONARY_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DICTIONARY_TREE_ALIAS, UMB_DICTIONARY_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.Dictionary.MoveTo', + name: 'Move Dictionary Entity Action', + forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_DICTIONARY_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS, + treeAlias: UMB_DICTIONARY_TREE_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/constants.ts new file mode 100644 index 0000000000..2ddf48772c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS = 'Umb.Repository.Dictionary.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.repository.ts new file mode 100644 index 0000000000..dbd5979a6e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveDictionaryServerDataSource } from './dictionary-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveDictionaryRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveDictionaryServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.server.data-source.ts new file mode 100644 index 0000000000..c3713c0214 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/dictionary-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { DictionaryService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move Dictionary Server Data Source + * @export + * @class UmbMoveDictionaryServerDataSource + */ +export class UmbMoveDictionaryServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveDictionaryServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveDictionaryServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveDictionaryServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + DictionaryService.putDictionaryByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/index.ts new file mode 100644 index 0000000000..52fc988053 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMoveDictionaryRepository } from './dictionary-move.repository.js'; +export { UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/manifests.ts new file mode 100644 index 0000000000..003a41bed2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/move-to/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS } from './constants.js'; +import { UmbMoveDictionaryRepository } from './dictionary-move.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const moveRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MOVE_DICTIONARY_REPOSITORY_ALIAS, + name: 'Move Dictionary Repository', + api: UmbMoveDictionaryRepository, +}; + +export const manifests = [moveRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/modals/dictionary-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/modals/dictionary-picker-modal.token.ts index 09dd4db6b5..e967c0a391 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/modals/dictionary-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/modals/dictionary-picker-modal.token.ts @@ -1,14 +1,18 @@ import type { UmbUniqueTreeItemModel } from '../../core/tree/types.js'; import { UmbModalToken } from '../../core/modal/token/modal-token.js'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; export type UmbDictionaryPickerModalData = UmbTreePickerModalData; -export type UmbDictionaryPickerModalValue = UmbPickerModalValue; +export type UmbDictionaryPickerModalValue = UmbTreePickerModalValue; export const UMB_DICTIONARY_PICKER_MODAL = new UmbModalToken< UmbDictionaryPickerModalData, UmbDictionaryPickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace-editor.element.ts index b1a2e6eb04..96d7b1aa3d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace-editor.element.ts @@ -2,7 +2,7 @@ import { UMB_DICTIONARY_WORKSPACE_CONTEXT } from './dictionary-workspace.context import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-dictionary-workspace-editor') export class UmbDictionaryWorkspaceEditorElement extends UmbLitElement { @@ -47,7 +47,8 @@ export class UmbDictionaryWorkspaceEditorElement extends UmbLitElement { placeholder=${this.localize.term('placeholders_entername')} .value=${this._name ?? ''} @input="${this.#handleInput}" - label="${this.localize.term('general_dictionary')} ${this.localize.term('general_name')}"> + label="${this.localize.term('general_dictionary')} ${this.localize.term('general_name')}" + ${umbFocus()}>
`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/views/workspace-view-dictionary-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/views/workspace-view-dictionary-editor.element.ts index f977442ca8..b97724eb95 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/views/workspace-view-dictionary-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/views/workspace-view-dictionary-editor.element.ts @@ -58,7 +58,7 @@ export class UmbWorkspaceViewDictionaryEditorElement extends UmbLitElement { #onTextareaChange(e: Event) { if (e instanceof UUITextareaEvent) { const target = e.composedPath()[0] as UUITextareaElement; - const translation = target.value.toString(); + const translation = (target.value as string).toString(); const isoCode = target.getAttribute('name')!; this.#workspaceContext.setPropertyValue(isoCode, translation); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts index d5034e8d25..52ee5e6f76 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL } from './modal/index.js'; +import { UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL } from './modal/index.js'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -12,7 +12,7 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { async execute() { const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modalContext = modalManager.open(this, UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL, { + const modalContext = modalManager.open(this, UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL, { data: { parent: { unique: this.args.unique, @@ -24,10 +24,11 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { await modalContext.onSubmit().catch(() => undefined); const documentTypeUnique = modalContext.getValue().documentTypeUnique; + if (!documentTypeUnique) return; - const url = `section/settings/workspace/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/create/parent/${this.args.entityType}/${ - documentTypeUnique || 'null' - }`; + const url = `section/settings/workspace/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/create/parent/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/${this.args.unique ?? 'null'}/${documentTypeUnique}`; history.pushState(null, '', url); } } + +export default UmbCreateEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts index d9e8cd9a76..8b238686a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -1,12 +1,29 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { - type: 'modal', - alias: 'Umb.Modal.DocumentBlueprintCreateOptions', - name: 'Document Blueprint Create Options Modal', - element: () => import('./modal/document-blueprint-create-options-modal.element.js'), + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.DocumentBlueprint.Create', + name: 'Document Blueprint Options Create Entity Action', + weight: 1200, + api: () => import('./create.action.js'), + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: '#actions_createblueprint', + }, }, ]; -export const manifests = [...entityActions]; +const manifestModals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.DocumentBlueprintOptionsCreate', + name: 'Document Blueprint Options Create Modal', + element: () => import('./modal/document-blueprint-options-create-modal.element.js'), + }, +]; + +export const manifests = [...entityActions, ...manifestModals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts deleted file mode 100644 index ef7e3ac473..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts +++ /dev/null @@ -1,80 +0,0 @@ -import type { - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue, -} from './index.js'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbDocumentTypeStructureRepository } from '@umbraco-cms/backoffice/document-type'; -import { type UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; -import type { UmbTreeElement } from '@umbraco-cms/backoffice/tree'; - -@customElement('umb-document-blueprint-create-options-modal') -export class UmbDocumentBlueprintCreateOptionsModalElement extends UmbModalBaseElement< - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue -> { - @state() - private _documentTypes?: Array; - - #documentTypeRepository = new UmbDocumentTypeStructureRepository(this); - - connectedCallback(): void { - super.connectedCallback(); - } - - async #fetchTypes() { - //const something = await this.#documentTypeRepository. - } - - #onNavigate() { - this._submitModal(); - } - - #onSelected(event: UmbSelectedEvent) { - event.stopPropagation(); - const element = event.target as UmbTreeElement; - this.value = { documentTypeUnique: element.getSelection()[0] }; - this.modalContext?.dispatchEvent(new UmbSelectionChangeEvent()); - this.#onNavigate(); - } - - render() { - return html` - - - Create an item under Content Templates - - Select the Document Type you want to make a content blueprint for - - item.isElement == false, - }} - @selected=${this.#onSelected}> - - - - `; - } - - static styles = [ - UmbTextStyles, - css` - strong { - display: block; - } - `, - ]; -} - -export default UmbDocumentBlueprintCreateOptionsModalElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-document-blueprint-create-options-modal': UmbDocumentBlueprintCreateOptionsModalElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts new file mode 100644 index 0000000000..dda14004e9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.element.ts @@ -0,0 +1,95 @@ +import { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from '../../../tree/folder/manifests.js'; +import type { + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue, +} from './index.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { type UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbCreateFolderEntityAction, type UmbTreeElement } from '@umbraco-cms/backoffice/tree'; + +@customElement('umb-document-blueprint-options-create-modal') +export class UmbDocumentBlueprintOptionsCreateModalElement extends UmbModalBaseElement< + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue +> { + #createFolderAction?: UmbCreateFolderEntityAction; + + connectedCallback(): void { + super.connectedCallback(); + if (!this.data?.parent) throw new Error('A parent is required to create a folder'); + + // TODO: render the info from this instance in the list of actions + this.#createFolderAction = new UmbCreateFolderEntityAction(this, { + unique: this.data.parent.unique, + entityType: this.data.parent.entityType, + meta: { + icon: 'icon-folder', + label: 'New Folder...', + folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + }, + }); + } + + async #onCreateFolderClick(event: PointerEvent) { + event.stopPropagation(); + + try { + await this.#createFolderAction?.execute(); + this._submitModal(); + } catch (error) { + console.error(error); + } + } + + #onSelected(event: UmbSelectedEvent) { + event.stopPropagation(); + const element = event.target as UmbTreeElement; + this.value = { documentTypeUnique: element.getSelection()[0] }; + this.modalContext?.dispatchEvent(new UmbSelectionChangeEvent()); + this._submitModal(); + } + + render() { + return html` + + + + + + + + + Select the Document Type you want to make a content blueprint for + + item.isElement == false, + }} + @selected=${this.#onSelected}> + + + + `; + } + + static styles = [ + UmbTextStyles, + css` + uui-box:first-child { + margin-bottom: var(--uui-size-6); + } + `, + ]; +} + +export default UmbDocumentBlueprintOptionsCreateModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-create-options-modal': UmbDocumentBlueprintOptionsCreateModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts new file mode 100644 index 0000000000..3ca912c321 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-options-create-modal.token.ts @@ -0,0 +1,22 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbDocumentBlueprintOptionsCreateModalData { + parent: { + unique: string | null; + entityType: string; + }; +} + +export interface UmbDocumentBlueprintOptionsCreateModalValue { + documentTypeUnique: string; +} + +export const UMB_DOCUMENT_BLUEPRINT_OPTIONS_CREATE_MODAL = new UmbModalToken< + UmbDocumentBlueprintOptionsCreateModalData, + UmbDocumentBlueprintOptionsCreateModalValue +>('Umb.Modal.DocumentBlueprintOptionsCreate', { + modal: { + type: 'sidebar', + size: 'small', + }, +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts index 98a89164ec..e54c394594 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts @@ -1,22 +1,2 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; - -export interface UmbDocumentBlueprintCreateOptionsModalData { - parent: { - unique: string | null; - entityType: string; - }; -} - -export interface UmbDocumentBlueprintCreateOptionsModalValue { - documentTypeUnique: string; -} - -export const UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL = new UmbModalToken< - UmbDocumentBlueprintCreateOptionsModalData, - UmbDocumentBlueprintCreateOptionsModalValue ->('Umb.Modal.DocumentBlueprintCreateOptions', { - modal: { - type: 'sidebar', - size: 'small', - }, -}); +export * from './document-blueprint-options-create-modal.token.js'; +export * from './document-blueprint-options-create-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index e5c2ec3ba5..5a1d51aaed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -1,25 +1,12 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, } from '../index.js'; import { manifests as createManifests } from './create/manifests.js'; -import { UmbCreateEntityAction } from './create/create.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.DocumentBlueprint.Create', - name: 'Create Document Blueprint Entity Action', - api: UmbCreateEntityAction, - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: 'Create', - }, - }, { type: 'entityAction', kind: 'delete', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts new file mode 100644 index 0000000000..3c28da9db2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.token.ts @@ -0,0 +1,13 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; +import type { UmbDocumentBlueprintPropertyDataContext } from './document-blueprint-property-dataset-context.js'; +import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const IsDocumentBlueprintPropertyDatasetContext = ( + context: UmbPropertyDatasetContext, +): context is UmbDocumentBlueprintPropertyDataContext => context.getEntityType() === UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; + +export const UMB_DOCUMENT_BLUEPRINT_PROPERTY_DATASET_CONTEXT = new UmbContextToken< + UmbPropertyDatasetContext, + UmbDocumentBlueprintPropertyDataContext +>('UmbVariantContext', undefined, IsDocumentBlueprintPropertyDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts new file mode 100644 index 0000000000..2d3836ae46 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/property-dataset-context/document-blueprint-property-dataset-context.ts @@ -0,0 +1,122 @@ +import type { UmbDocumentBlueprintWorkspaceContext } from '../workspace/index.js'; +import type { UmbNameablePropertyDatasetContext, UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { type Observable, map } from '@umbraco-cms/backoffice/external/rxjs'; +import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbVariantModel } from '@umbraco-cms/backoffice/variant'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; + +// TODO: This code can be split into a UmbContentTypePropertyDatasetContext, leaving just the publishing state and methods to this class. +export class UmbDocumentBlueprintPropertyDataContext + extends UmbContextBase + implements UmbPropertyDatasetContext, UmbNameablePropertyDatasetContext +{ + #workspace: UmbDocumentBlueprintWorkspaceContext; + #variantId: UmbVariantId; + public getVariantId() { + return this.#variantId; + } + + #currentVariant = new UmbObjectState(undefined); + currentVariant = this.#currentVariant.asObservable(); + + name = this.#currentVariant.asObservablePart((x) => x?.name); + culture = this.#currentVariant.asObservablePart((x) => x?.culture); + segment = this.#currentVariant.asObservablePart((x) => x?.segment); + + // TODO: Refactor: Make a properties observable. (with such I think i mean a property value object array.. array with object with properties, alias, value, culture and segment) + // TO make such happen I think we need to maintain all properties and their value of this object. + // This will actually make it simpler if multiple are watching the same property. + // But it will also mean that we wil watch all properties and their structure, for variantID, all the time for all of the properties. + + getEntityType(): string { + return this.#workspace.getEntityType(); + } + getUnique(): string | undefined { + return this.#workspace.getUnique(); + } + getName(): string | undefined { + return this.#workspace.getName(this.#variantId); + } + setName(name: string) { + this.#workspace.setName(name, this.#variantId); + } + getVariantInfo() { + return this.#workspace.getVariant(this.#variantId); + } + + constructor(host: UmbControllerHost, workspace: UmbDocumentBlueprintWorkspaceContext, variantId?: UmbVariantId) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + + super(host, UMB_PROPERTY_DATASET_CONTEXT); + this.#workspace = workspace; + this.#variantId = variantId ?? UmbVariantId.CreateInvariant(); + + this.observe( + this.#workspace.variantById(this.#variantId), + async (variantInfo) => { + if (!variantInfo) return; + this.#currentVariant.setValue(variantInfo); + }, + '_observeActiveVariant', + ); + } + + #createPropertyVariantId(property: UmbPropertyTypeModel) { + return UmbVariantId.Create({ + culture: property.variesByCulture ? this.#variantId.culture : null, + segment: property.variesBySegment ? this.#variantId.segment : null, + }); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyVariantId(propertyAlias: string) { + return (await this.#workspace.structure.propertyStructureByAlias(propertyAlias)).pipe( + map((property) => (property ? this.#createPropertyVariantId(property) : undefined)), + ); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use this method, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyValueByAlias( + propertyAlias: string, + ): Promise | undefined> { + await this.#workspace.isLoaded(); + const structure = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if (structure) { + return this.#workspace.propertyValueByAlias(propertyAlias, this.#createPropertyVariantId(structure)); + } + return; + } + + // TODO: Refactor: Not used currently, but should investigate if we can implement this, to spare some energy. + async propertyValueByAliasAndCulture( + propertyAlias: string, + propertyVariantId: UmbVariantId, + ): Promise | undefined> { + return this.#workspace.propertyValueByAlias(propertyAlias, propertyVariantId); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if (property) { + const variantId = this.#createPropertyVariantId(property); + + // This is not reacting to if the property variant settings changes while running. + this.#workspace.setPropertyValue(propertyAlias, value, variantId); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts index 0c619df3a6..088c5db64a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts @@ -2,7 +2,7 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentBlueprintItemModel } from './types.js'; import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; -import type { CancelablePromise, DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { DocumentBlueprintItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -12,7 +12,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; * @implements {DocumentTreeDataSource} */ export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataSourceBase< - DocumentItemResponseModel, + DocumentBlueprintItemResponseModel, UmbDocumentBlueprintItemModel > { /** @@ -29,29 +29,17 @@ export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataS } /* eslint-disable local-rules/no-direct-api-import */ -const getItems = (uniques: Array) => - DocumentBlueprintService.getItemDocumentBlueprint({ id: uniques }) as unknown as CancelablePromise< - DocumentItemResponseModel[] - >; +const getItems = (uniques: Array) => DocumentBlueprintService.getItemDocumentBlueprint({ id: uniques }); -const mapper = (item: DocumentItemResponseModel): UmbDocumentBlueprintItemModel => { +const mapper = (item: DocumentBlueprintItemResponseModel): UmbDocumentBlueprintItemModel => { return { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, unique: item.id, - isTrashed: item.isTrashed, - isProtected: item.isProtected, + name: item.name, documentType: { unique: item.documentType.id, icon: item.documentType.icon, collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, }, - variants: item.variants.map((variant) => { - return { - culture: variant.culture || null, - name: variant.name, - state: variant.state, - }; - }), - name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts index e054aac1d5..4a7a76f916 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts @@ -4,16 +4,13 @@ import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbDocumentBlueprintItemModel { entityType: UmbDocumentBlueprintEntityType; - name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + name: string; unique: string; - isTrashed: boolean; - isProtected: boolean; documentType: { unique: string; icon: string; collection: UmbReferenceByUnique | null; }; - variants: Array; } export interface UmbDocumentBlueprintItemVariantModel { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index 1a7ab6308a..f0bd797c6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -1,17 +1,14 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; +import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; +import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { DocumentBlueprintTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbTreeAncestorsOfRequestArgs, UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs, } from '@umbraco-cms/backoffice/tree'; -import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import type { - DocumentBlueprintTreeItemResponseModel, - DocumentTreeItemResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** * A data source for a data type tree that fetches data from the server @@ -46,29 +43,26 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { - throw new Error('Not implemented'); - /* // eslint-disable-next-line local-rules/no-direct-api-import return DocumentBlueprintService.getTreeDocumentBlueprintChildren({ parentId: args.parentUnique, }); - */ } }; const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { throw new Error('Not implemented'); + /** TODO: Implement when endpoint becomes available... */ }; const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBlueprintTreeItemModel => { - //TODO remove temp hack when api endpoints are fixed - const hack = item as Partial; return { unique: item.id, parentUnique: item.parent?.id || null, - name: hack?.variants?.[0].name ?? '', - entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - isFolder: false, + name: (item as any).variants?.[0].name ?? item.name, + entityType: item.isFolder ? UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE : UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + isFolder: item.isFolder, hasChildren: item.hasChildren, + icon: item.isFolder ? 'icon-folder' : 'icon-blueprint', }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts index 1031ebc6ed..4510666a59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts @@ -1,9 +1,9 @@ -// import { UmbDocumentBlueprintFolderServerDataSource } from './document-blueprint-folder.server.data-source.js'; -// import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -// import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { UmbDocumentBlueprintFolderServerDataSource } from './document-blueprint-folder.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/tree'; -// export class UmbDocumentBlueprintFolderRepository extends UmbFolderRepositoryBase { -// constructor(host: UmbControllerHost) { -// super(host, UmbDocumentBlueprintFolderServerDataSource); -// } -// } +export class UmbDocumentBlueprintFolderRepository extends UmbFolderRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbDocumentBlueprintFolderServerDataSource); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts index e0dce44acd..ef7645c2ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts @@ -1,122 +1,122 @@ -// import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; -// import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; -// import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -// import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; +import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -// /** -// * A data source for a Document Blueprint folder that fetches data from the server -// * @export -// * @class UmbDocumentBlueprintFolderServerDataSource -// * @implements {RepositoryDetailDataSource} -// */ -// export class UmbDocumentBlueprintFolderServerDataSource implements UmbFolderDataSource { -// #host: UmbControllerHost; +/** + * A data source for a Document Blueprint folder that fetches data from the server + * @export + * @class UmbDocumentBlueprintFolderServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentBlueprintFolderServerDataSource implements UmbFolderDataSource { + #host: UmbControllerHost; -// /** -// * Creates an instance of UmbDocumentBlueprintFolderServerDataSource. -// * @param {UmbControllerHost} host -// * @memberof UmbDocumentBlueprintFolderServerDataSource -// */ -// constructor(host: UmbControllerHost) { -// this.#host = host; -// } + /** + * Creates an instance of UmbDocumentBlueprintFolderServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } -// /** -// * Fetches a Document Blueprint folder from the server -// * @param {string} unique -// * @return {*} -// * @memberof UmbDocumentBlueprintFolderServerDataSource -// */ -// async read(unique: string) { -// if (!unique) throw new Error('Unique is missing'); + /** + * Fetches a Document Blueprint folder from the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async read(unique: string) { + if (!unique) throw new Error('Unique is missing'); -// const { data, error } = await tryExecuteAndNotify( -// this.#host, -// DocumentBlueprintService.getDocumentBlueprintFolderById({ -// id: unique, -// }), -// ); + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintService.getDocumentBlueprintFolderById({ + id: unique, + }), + ); -// if (data) { -// const mappedData = { -// unique: data.id, -// name: data.name, -// }; + if (data) { + const mappedData = { + unique: data.id, + name: data.name, + }; -// return { data: mappedData }; -// } + return { data: mappedData }; + } -// return { error }; -// } + return { error }; + } -// /** -// * Creates a Document Blueprint folder on the server -// * @param {UmbCreateFolderModel} args -// * @return {*} -// * @memberof UmbDocumentBlueprintFolderServerDataSource -// */ -// async create(args: UmbCreateFolderModel) { -// if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); -// if (!args.name) throw new Error('Name is missing'); + /** + * Creates a Document Blueprint folder on the server + * @param {UmbCreateFolderModel} args + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async create(args: UmbCreateFolderModel) { + if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); + if (!args.name) throw new Error('Name is missing'); -// const requestBody = { -// id: args.unique, -// parent: args.parentUnique ? { id: args.parentUnique } : null, -// name: args.name, -// }; + const requestBody = { + id: args.unique, + parent: args.parentUnique ? { id: args.parentUnique } : null, + name: args.name, + }; -// const { error } = await tryExecuteAndNotify( -// this.#host, -// DocumentBlueprintService.postDocumentBlueprintFolder({ -// requestBody, -// }), -// ); + const { error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintService.postDocumentBlueprintFolder({ + requestBody, + }), + ); -// if (!error) { -// return this.read(args.unique); -// } + if (!error) { + return this.read(args.unique); + } -// return { error }; -// } + return { error }; + } -// /** -// * Updates a Document Blueprint folder on the server -// * @param {UmbUpdateFolderModel} args -// * @return {*} -// * @memberof UmbDocumentBlueprintFolderServerDataSource -// */ -// async update(args: UmbUpdateFolderModel) { -// if (!args.unique) throw new Error('Unique is missing'); -// if (!args.name) throw new Error('Folder name is missing'); + /** + * Updates a Document Blueprint folder on the server + * @param {UmbUpdateFolderModel} args + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async update(args: UmbUpdateFolderModel) { + if (!args.unique) throw new Error('Unique is missing'); + if (!args.name) throw new Error('Folder name is missing'); -// const { error } = await tryExecuteAndNotify( -// this.#host, -// DocumentBlueprintService.putDocumentBlueprintFolderById({ -// id: args.unique, -// requestBody: { name: args.name }, -// }), -// ); + const { error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintService.putDocumentBlueprintFolderById({ + id: args.unique, + requestBody: { name: args.name }, + }), + ); -// if (!error) { -// return this.read(args.unique); -// } + if (!error) { + return this.read(args.unique); + } -// return { error }; -// } + return { error }; + } -// /** -// * Deletes a Document Blueprint folder on the server -// * @param {string} unique -// * @return {*} -// * @memberof UmbDocumentBlueprintServerDataSource -// */ -// async delete(unique: string) { -// if (!unique) throw new Error('Unique is missing'); -// return tryExecuteAndNotify( -// this.#host, -// DocumentBlueprintService.deleteDocumentBlueprintFolderById({ -// id: unique, -// }), -// ); -// } -// } + /** + * Deletes a Document Blueprint folder on the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async delete(unique: string) { + if (!unique) throw new Error('Unique is missing'); + return tryExecuteAndNotify( + this.#host, + DocumentBlueprintService.deleteDocumentBlueprintFolderById({ + id: unique, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts index c0cde243d3..29904de469 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts @@ -1,2 +1,2 @@ -// export { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; -// export { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from './manifests.js'; +export { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +export { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts index 90635572ee..9eef583220 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts @@ -1,37 +1,37 @@ -// import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; -// import { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; -// import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -// export const UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Folder'; +export const UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Folder'; -// const folderRepository: ManifestRepository = { -// type: 'repository', -// alias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, -// name: 'Document Blueprint Folder Repository', -// api: UmbDocumentBlueprintFolderRepository, -// }; +const folderRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + name: 'Document Blueprint Folder Repository', + api: UmbDocumentBlueprintFolderRepository, +}; -// const entityActions: Array = [ -// { -// type: 'entityAction', -// kind: 'folderUpdate', -// alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Rename', -// name: 'Rename Document Blueprint Folder Entity Action', -// forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], -// meta: { -// folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, -// }, -// }, -// { -// type: 'entityAction', -// kind: 'folderDelete', -// alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Delete', -// name: 'Delete Document Blueprint Folder Entity Action', -// forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], -// meta: { -// folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, -// }, -// }, -// ]; +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'folderUpdate', + alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Rename', + name: 'Rename Document Blueprint Folder Entity Action', + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'folderDelete', + alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Delete', + name: 'Delete Document Blueprint Folder Entity Action', + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + }, + }, +]; -// export const manifests = [folderRepository, ...entityActions]; +export const manifests = [folderRepository, ...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts index e29ea4ff3b..dd70703d94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts @@ -1,6 +1,6 @@ -// import type { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; -// import type { UmbDocumentBlueprintTreeItemModel } from '../types.js'; +import type { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import type { UmbDocumentBlueprintTreeItemModel } from '../types.js'; -// export interface UmbDocumentBlueprintFolderTreeItemModel extends UmbDocumentBlueprintTreeItemModel { -// entityType: typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; -// } +export interface UmbDocumentBlueprintFolderTreeItemModel extends UmbDocumentBlueprintTreeItemModel { + entityType: typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts index 9f2a67da2f..f098c0956c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts @@ -1,2 +1,2 @@ export { UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT } from './document-blueprint-tree.store.js'; -//export * from './folder/index.js'; +export * from './folder/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts index 1a085f7d96..f7c4a07d3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; -//import { manifests as folderManifests } from './folder/manifests.js'; +import { manifests as folderManifests } from './folder/manifests.js'; import { manifests as reloadManifests } from './reload-tree-item-children/manifests.js'; import { UmbDocumentBlueprintTreeRepository } from './document-blueprint-tree.repository.js'; import { UmbDocumentBlueprintTreeStore } from './document-blueprint-tree.store.js'; @@ -46,5 +46,4 @@ const treeItem: ManifestTreeItem = { forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], }; -export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadManifests]; -//...folderManifests, +export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadManifests, ...folderManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts index a2595863dd..876fb1d3e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts @@ -1,10 +1,11 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-document-blueprint-root-workspace') export class UmbDocumentBlueprintRootWorkspaceElement extends UmbLitElement { render() { - return html` + return html`

diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index 9387350ca2..927a0bc4d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -19,8 +19,6 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - console.log('editor'); - this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.#observeVariants(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts index 77cc3b90b3..0744a49972 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; @@ -14,7 +15,6 @@ export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement constructor() { super(); - // TODO: Refactor: use a split view workspace context token: this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (context) => { this._workspaceContext = context; @@ -42,14 +42,14 @@ export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, (view) => html` `, )}

- ` + ` : nothing; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 49024a6b9a..c1b7161e4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -1,3 +1,4 @@ +import { UmbDocumentBlueprintPropertyDataContext } from '../property-dataset-context/document-blueprint-property-dataset-context.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbDocumentBlueprintDetailRepository } from '../repository/index.js'; import type { @@ -5,7 +6,7 @@ import type { UmbDocumentBlueprintVariantModel, UmbDocumentBlueprintVariantOptionModel, } from '../types.js'; -import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS } from './manifests.js'; import { appendToFrozenArray, mergeObservables, @@ -28,7 +29,6 @@ import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/var import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; type EntityType = UmbDocumentBlueprintDetailModel; @@ -47,12 +47,16 @@ export class UmbDocumentBlueprintWorkspaceContext #persistedData = new UmbObjectState(undefined); #currentData = new UmbObjectState(undefined); - - // TODo: Optimize this so it uses either a App Language Context? [NL] + #getDataPromise?: Promise; + // TODO: Optimize this so it uses either a App Language Context? [NL] #languageRepository = new UmbLanguageCollectionRepository(this); #languages = new UmbArrayState([], (x) => x.unique); public readonly languages = this.#languages.asObservable(); + public isLoaded() { + return this.#getDataPromise; + } + readonly unique = this.#currentData.asObservablePart((data) => data?.unique); readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.documentType.unique); @@ -105,7 +109,7 @@ export class UmbDocumentBlueprintWorkspaceContext ); constructor(host: UmbControllerHost) { - super(host, 'Umb.Workspace.DocumentBlueprint'); + super(host, UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS); this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); this.observe(this.varies, (varies) => (this.#varies = varies)); @@ -159,7 +163,7 @@ export class UmbDocumentBlueprintWorkspaceContext async load(unique: string) { this.resetState(); - + this.#getDataPromise = this.repository.requestByUnique(unique); const { data, asObservable } = await this.repository.requestByUnique(unique); if (data) { @@ -429,10 +433,14 @@ export class UmbDocumentBlueprintWorkspaceContext } */ - public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + /*public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { // TODO: [LK] Temporary workaround/hack to get the workspace to load. const docCxt = new UmbDocumentWorkspaceContext(host); return new UmbDocumentPropertyDataContext(host, docCxt, variantId); + }*/ + + public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + return new UmbDocumentBlueprintPropertyDataContext(host, this, variantId); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts index 22a5c8eeab..0848864a8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts @@ -1 +1,2 @@ export * from './document-blueprint-workspace.context-token.js'; +export * from './document-blueprint-workspace.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 9427a1084f..b0061305da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,6 +1,10 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; -import type { ManifestWorkspace, ManifestWorkspaceActions } from '@umbraco-cms/backoffice/extension-registry'; +import type { + ManifestWorkspace, + ManifestWorkspaceActions, + ManifestWorkspaceView, +} from '@umbraco-cms/backoffice/extension-registry'; export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint'; @@ -15,6 +19,27 @@ const workspace: ManifestWorkspace = { }, }; +const workspaceViews: Array = [ + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.DocumentBlueprint.Edit', + name: 'Document Blueprint Workspace Edit View', + element: () => import('./views/edit/document-blueprint-workspace-view-edit.element.js'), + weight: 200, + meta: { + label: '#general_content', + pathname: 'content', + icon: 'document', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: workspace.alias, + }, + ], + }, +]; + const workspaceActions: Array = [ { type: 'workspaceAction', @@ -37,4 +62,4 @@ const workspaceActions: Array = [ }, ]; -export const manifests = [workspace, ...workspaceActions]; +export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts new file mode 100644 index 0000000000..ebabfa0fe7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-properties.element.ts @@ -0,0 +1,71 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypePropertyStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; + +@customElement('umb-document-blueprint-workspace-view-edit-properties') +export class UmbDocumentBlueprintWorkspaceViewEditPropertiesElement extends UmbLitElement { + @property({ type: String, attribute: 'container-id', reflect: false }) + public get containerId(): string | null | undefined { + return this.#propertyStructureHelper.getContainerId(); + } + public set containerId(value: string | null | undefined) { + this.#propertyStructureHelper.setContainerId(value); + } + + #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); + + @state() + _propertyStructure?: Array; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#propertyStructureHelper.setStructureManager(workspaceContext.structure); + }); + this.observe( + this.#propertyStructureHelper.propertyStructure, + (propertyStructure) => { + this._propertyStructure = propertyStructure; + }, + null, + ); + } + + render() { + return this._propertyStructure + ? repeat( + this._propertyStructure, + (property) => property.alias, + (property) => + html` `, + ) + : ''; + } + + static styles = [ + UmbTextStyles, + css` + .property { + border-bottom: 1px solid var(--uui-color-divider); + } + .property:last-child { + border-bottom: 0; + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditPropertiesElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit-properties': UmbDocumentBlueprintWorkspaceViewEditPropertiesElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts new file mode 100644 index 0000000000..ed60a266fc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit-tab.element.ts @@ -0,0 +1,88 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +import './document-blueprint-workspace-view-edit-properties.element.js'; + +@customElement('umb-document-blueprint-workspace-view-edit-tab') +export class UmbDocumentBlueprintWorkspaceViewEditTabElement extends UmbLitElement { + @property({ type: String }) + public get containerId(): string | null | undefined { + return this._containerId; + } + public set containerId(value: string | null | undefined) { + this._containerId = value; + this.#groupStructureHelper.setContainerId(value); + } + @state() + private _containerId?: string | null; + + #groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + @state() + _groups: Array = []; + + @state() + _hasProperties = false; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#groupStructureHelper.setStructureManager(workspaceContext.structure); + }); + this.observe(this.#groupStructureHelper.mergedContainers, (groups) => { + this._groups = groups; + }); + this.observe(this.#groupStructureHelper.hasProperties, (hasProperties) => { + this._hasProperties = hasProperties; + }); + } + + render() { + return html` + ${this._hasProperties + ? html` + + + + ` + : ''} + ${repeat( + this._groups, + (group) => group.id, + (group) => + html` + + `, + )} + `; + } + + static styles = [ + UmbTextStyles, + css` + uui-box { + --uui-box-default-padding: 0 var(--uui-size-space-5); + } + uui-box:not(:first-child) { + margin-top: var(--uui-size-layout-1); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditTabElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit-tab': UmbDocumentBlueprintWorkspaceViewEditTabElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts new file mode 100644 index 0000000000..9f897c0e3b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/views/edit/document-blueprint-workspace-view-edit.element.ts @@ -0,0 +1,169 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from '../../document-blueprint-workspace.context-token.js'; +import type { UmbDocumentBlueprintWorkspaceViewEditTabElement } from './document-blueprint-workspace-view-edit-tab.element.js'; +import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; +import { encodeFolderName } from '@umbraco-cms/backoffice/router'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; + +@customElement('umb-document-blueprint-workspace-view-edit') +export class UmbDocumentBlueprintWorkspaceViewEditElement extends UmbLitElement implements UmbWorkspaceViewElement { + //@state() + //private _hasRootProperties = false; + + @state() + private _hasRootGroups = false; + + @state() + private _routes: UmbRoute[] = []; + + @state() + private _tabs?: Array; + + @state() + private _routerPath?: string; + + @state() + private _activePath = ''; + + private _workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; + + private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + constructor() { + super(); + + this._tabsStructureHelper.setIsRoot(true); + this._tabsStructureHelper.setContainerChildType('Tab'); + this.observe( + this._tabsStructureHelper.mergedContainers, + (tabs) => { + this._tabs = tabs; + this._createRoutes(); + }, + null, + ); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext; + this._tabsStructureHelper.setStructureManager(workspaceContext.structure); + this._observeRootGroups(); + }); + } + + private _observeRootGroups() { + if (!this._workspaceContext) return; + + this.observe( + this._workspaceContext.structure.hasRootContainers('Group'), + (hasRootGroups) => { + this._hasRootGroups = hasRootGroups; + this._createRoutes(); + }, + '_observeGroups', + ); + } + + private _createRoutes() { + if (!this._tabs || !this._workspaceContext) return; + const routes: UmbRoute[] = []; + + if (this._tabs.length > 0) { + this._tabs?.forEach((tab) => { + const tabName = tab.name ?? ''; + routes.push({ + path: `tab/${encodeFolderName(tabName).toString()}`, + component: () => import('./document-blueprint-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbDocumentBlueprintWorkspaceViewEditTabElement).containerId = tab.id; + }, + }); + }); + } + + if (this._hasRootGroups) { + routes.push({ + path: '', + component: () => import('./document-blueprint-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbDocumentBlueprintWorkspaceViewEditTabElement).containerId = null; + }, + }); + } + + if (routes.length !== 0) { + routes.push({ + path: '', + redirectTo: routes[0]?.path, + }); + } + + this._routes = routes; + } + + render() { + if (!this._routes || !this._tabs) return; + return html` + + ${this._routerPath && (this._tabs.length > 1 || (this._tabs.length === 1 && this._hasRootGroups)) + ? html` + ${this._hasRootGroups && this._tabs.length > 0 + ? html` + Content + ` + : ''} + ${repeat( + this._tabs, + (tab) => tab.name, + (tab) => { + const path = this._routerPath + '/tab/' + encodeFolderName(tab.name || ''); + return html`${tab.name}`; + }, + )} + ` + : ''} + + { + this._routerPath = event.target.absoluteRouterPath; + }} + @change=${(event: UmbRouterSlotChangeEvent) => { + this._activePath = event.target.absoluteActiveViewPath || ''; + }}> + + + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + height: 100%; + --uui-tab-background: var(--uui-color-surface); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceViewEditElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-view-edit': UmbDocumentBlueprintWorkspaceViewEditElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts index c022d1000d..86fa8b08ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts @@ -10,13 +10,13 @@ import { repeat, nothing, } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; @customElement('umb-input-document-type') -export class UmbInputDocumentTypeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputDocumentTypeElement extends UUIFormControlMixin(UmbLitElement, '') { /** * Limits to only select Element Types * @type {boolean} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts index ce0e502d8b..0c300d0386 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts @@ -1,40 +1,28 @@ +import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../entity.js'; import { DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; import { manifests as createManifests } from './create/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import { UMB_DOCUMENT_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/document-type'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -const entityType = 'document-type'; - const entityActions: Array = [ { type: 'entityAction', kind: 'delete', alias: 'Umb.EntityAction.DocumentType.Delete', name: 'Delete Document-Type Entity Action', - forEntityTypes: [entityType], + forEntityTypes: [UMB_DOCUMENT_TYPE_ENTITY_TYPE], meta: { itemRepositoryAlias: DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, detailRepositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, }, }, - { - type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.DocumentType.Move', - name: 'Move Document Type Entity Action', - forEntityTypes: [entityType], - meta: { - itemRepositoryAlias: DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, - moveRepositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, - pickerModal: UMB_DOCUMENT_TYPE_PICKER_MODAL, - }, - }, { type: 'entityAction', kind: 'duplicate', alias: 'Umb.EntityAction.DocumentType.Duplicate', name: 'Duplicate Document Type Entity Action', - forEntityTypes: [entityType], + forEntityTypes: [UMB_DOCUMENT_TYPE_ENTITY_TYPE], meta: { itemRepositoryAlias: DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, duplicateRepositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, @@ -43,4 +31,4 @@ const entityActions: Array = [ }, ]; -export const manifests = [...entityActions, ...createManifests]; +export const manifests = [...entityActions, ...createManifests, ...moveManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/index.ts new file mode 100644 index 0000000000..6452336803 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveDocumentTypeRepository, UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/manifests.ts new file mode 100644 index 0000000000..0258c013f1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/manifests.ts @@ -0,0 +1,23 @@ +import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_TYPE_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_DOCUMENT_TYPE_TREE_ALIAS } from '../../tree/manifests.js'; +import { UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.DocumentType.MoveTo', + name: 'Move Document Type Entity Action', + forEntityTypes: [UMB_DOCUMENT_TYPE_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_DOCUMENT_TYPE_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_DOCUMENT_TYPE_TREE_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/constants.ts new file mode 100644 index 0000000000..aedccd9db2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.repository.ts new file mode 100644 index 0000000000..ed5b207812 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveDocumentTypeServerDataSource } from './document-type-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveDocumentTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveDocumentTypeServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.server.data-source.ts new file mode 100644 index 0000000000..4b82d9e18d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move DocumentType Server Data Source + * @export + * @class UmbMoveDocumentTypeServerDataSource + */ +export class UmbMoveDocumentTypeServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveDocumentTypeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveDocumentTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveDocumentTypeServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + DocumentTypeService.putDocumentTypeByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/index.ts new file mode 100644 index 0000000000..d9cadf133f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMoveDocumentTypeRepository } from './document-type-move.repository.js'; +export { UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/manifests.ts new file mode 100644 index 0000000000..e4e3226bb9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/move-to/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS } from './constants.js'; +import { UmbMoveDocumentTypeRepository } from './document-type-move.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const moveRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MOVE_DOCUMENT_TYPE_REPOSITORY_ALIAS, + name: 'Move Document Type Repository', + api: UmbMoveDocumentTypeRepository, +}; + +export const manifests = [moveRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/modals/document-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/modals/document-type-picker-modal.token.ts index b607f833ea..b9ff521986 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/modals/document-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/modals/document-type-picker-modal.token.ts @@ -1,14 +1,18 @@ -import { UmbModalToken } from '../../../core/modal/token/modal-token.js'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentTypeTreeItemModel } from '@umbraco-cms/backoffice/document-type'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; export type UmbDocumentTypePickerModalData = UmbTreePickerModalData; -export type UmbDocumentTypePickerModalValue = UmbPickerModalValue; +export type UmbDocumentTypePickerModalValue = UmbTreePickerModalValue; export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< UmbDocumentTypePickerModalData, UmbDocumentTypePickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts index 1cbcd24750..6782b20ccd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts @@ -1,8 +1,8 @@ import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from './document-type-workspace.context-token.js'; +import { umbFocus, UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; @customElement('umb-document-type-workspace-editor') @@ -35,18 +35,6 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { this.observe(this.#workspaceContext.name, (name) => (this._name = name), '_observeName'); this.observe(this.#workspaceContext.alias, (alias) => (this._alias = alias), '_observeAlias'); this.observe(this.#workspaceContext.icon, (icon) => (this._icon = icon), '_observeIcon'); - - this.observe( - this.#workspaceContext.isNew, - (isNew) => { - if (isNew) { - // TODO: Would be good with a more general way to bring focus to the name input. - (this.shadowRoot?.querySelector('#name') as HTMLElement)?.focus(); - } - this.removeUmbControllerByAlias('isNewRedirectController'); - }, - '_observeIsNew', - ); } // TODO. find a way where we don't have to do this for all workspaces. @@ -113,7 +101,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { - + (this, { getUniqueOfElement: (element) => { return element.getAttribute('detail'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts index 6bf9bec25d..b2aaded766 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts @@ -1,23 +1,30 @@ +import { UmbDocumentCreateBlueprintRepository } from './repository/document-create-blueprint.repository.js'; import { UMB_CREATE_BLUEPRINT_MODAL } from './modal/create-blueprint-modal.token.js'; -import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { - #repository = new UmbDocumentBlueprintDetailRepository(this); + #repository = new UmbDocumentCreateBlueprintRepository(this); constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { super(host, args); } async execute() { + if (!this.args.unique) throw new Error('Unique is required'); + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const modalContext = modalManager.open(this, UMB_CREATE_BLUEPRINT_MODAL, { data: { unique: this.args.unique }, }); await modalContext.onSubmit().catch(() => undefined); + + const { name, parent } = modalContext.getValue(); + if (!name) return; + + await this.#repository.create({ name, parent, document: { id: this.args.unique } }); } } export default UmbCreateDocumentBlueprintEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts index 28d9f38fba..e130217e61 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts @@ -1 +1,2 @@ export * from './modal/index.js'; +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts index b099cb20af..8b7aa230a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts @@ -1,19 +1,16 @@ import { UmbDocumentDetailRepository } from '../../../repository/index.js'; -import type { UmbCreateBlueprintModalData } from './create-blueprint-modal.token.js'; +import type { UmbCreateBlueprintModalData, UmbCreateBlueprintModalValue } from './create-blueprint-modal.token.js'; import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentDetailModel } from '@umbraco-cms/backoffice/document'; -import { - type UmbDocumentBlueprintDetailModel, - UmbDocumentBlueprintDetailRepository, -} from '@umbraco-cms/backoffice/document-blueprint'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { UmbId } from '@umbraco-cms/backoffice/id'; @customElement('umb-create-blueprint-modal') -export class UmbCreateBlueprintModalElement extends UmbModalBaseElement { - #blueprintRepository = new UmbDocumentBlueprintDetailRepository(this); +export class UmbCreateBlueprintModalElement extends UmbModalBaseElement< + UmbCreateBlueprintModalData, + UmbCreateBlueprintModalValue +> { #documentRepository = new UmbDocumentDetailRepository(this); #documentUnique = ''; @@ -39,24 +36,8 @@ export class UmbCreateBlueprintModalElement extends UmbModalBaseElement ({ ...variant, name: this._blueprintName })); - const model: UmbDocumentBlueprintDetailModel = { - ...this.#document, - entityType: 'document-blueprint', - variants, - unique: UmbId.new(), - }; - - return model; - } - async #handleSave() { - const model = this.#mapDocumentToBlueprintModel(); - if (!model) return; - const { error } = await this.#blueprintRepository.create(model, null); - console.log('error', error); + this.value = { name: this._blueprintName, parent: null }; this.modalContext?.submit(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts index dbd009afca..2001558eb1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts @@ -1,10 +1,16 @@ +import type { ReferenceByIdModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbCreateBlueprintModalData { unique: string | null; } -export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( +export interface UmbCreateBlueprintModalValue { + name: string; + parent: ReferenceByIdModel | null; +} + +export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( 'Umb.Modal.CreateBlueprint', { modal: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts new file mode 100644 index 0000000000..99ca0352ff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts @@ -0,0 +1,32 @@ +import { UmbDocumentCreateBlueprintServerDataSource } from './document-create-blueprint.server.data-source.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { CreateDocumentBlueprintFromDocumentRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbDocumentCreateBlueprintRepository extends UmbControllerBase implements UmbApi { + #dataSource = new UmbDocumentCreateBlueprintServerDataSource(this); + + #notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE; + + constructor(host: UmbControllerHost) { + super(host); + + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { + this.#notificationContext = instance; + }); + } + + async create(requestBody: CreateDocumentBlueprintFromDocumentRequestModel) { + const { data, error } = await this.#dataSource.create(requestBody); + if (!error) { + const notification = { data: { message: `Document Blueprint created` } }; + this.#notificationContext!.peek('positive', notification); + + return { data }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts new file mode 100644 index 0000000000..e0551eb81b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts @@ -0,0 +1,32 @@ +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { CreateDocumentBlueprintFromDocumentRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * A data source for the Document Create Blueprint that fetches data from the server + * @export + * @class UmbDocumentCreateBlueprintServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentCreateBlueprintServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentCreateBlueprintServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentCreateBlueprintServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the Culture and Hostnames for the given Document unique + * @param {string} unique + * @memberof UmbDocumentCreateBlueprintServerDataSource + */ + async create(requestBody: CreateDocumentBlueprintFromDocumentRequestModel) { + return tryExecuteAndNotify(this.#host, DocumentBlueprintService.postDocumentBlueprintFromDocument({ requestBody })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts new file mode 100644 index 0000000000..7e8dcb93a2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentCreateBlueprintRepository } from './document-create-blueprint.repository.js'; +export { UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts new file mode 100644 index 0000000000..f5635547e6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbDocumentCreateBlueprintRepository } from './document-create-blueprint.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS = 'Umb.Repository.Document.CreateBlueprint'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS, + name: 'Document Create Blueprint Repository', + api: UmbDocumentCreateBlueprintRepository, +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/document-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/document-create-options-modal.element.ts index 6f0a2d5e7b..eb4361a1ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/document-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/document-create-options-modal.element.ts @@ -3,13 +3,17 @@ import type { UmbDocumentCreateOptionsModalData, UmbDocumentCreateOptionsModalValue, } from './document-create-options-modal.token.js'; -import { html, nothing, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { html, nothing, customElement, state, ifDefined, repeat, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbDocumentTypeStructureRepository, type UmbAllowedDocumentTypeModel, } from '@umbraco-cms/backoffice/document-type'; +import { + type UmbDocumentBlueprintItemModel, + UmbDocumentBlueprintItemRepository, +} from '@umbraco-cms/backoffice/document-blueprint'; @customElement('umb-document-create-options-modal') export class UmbDocumentCreateOptionsModalElement extends UmbModalBaseElement< @@ -18,12 +22,20 @@ export class UmbDocumentCreateOptionsModalElement extends UmbModalBaseElement< > { #documentTypeStructureRepository = new UmbDocumentTypeStructureRepository(this); #documentItemRepository = new UmbDocumentItemRepository(this); + #documentBlueprintItemRepository = new UmbDocumentBlueprintItemRepository(this); + + #documentTypeUnique = ''; + #documentTypeIcon = ''; @state() private _allowedDocumentTypes: UmbAllowedDocumentTypeModel[] = []; @state() - private _headline: string = 'Create'; + private _headline: string = + `${this.localize.term('create_createUnder')} ${this.localize.term('actionCategories_content')}`; + + @state() + private _availableBlueprints: Array = []; async firstUpdated() { const parentUnique = this.data?.parent.unique; @@ -50,40 +62,100 @@ export class UmbDocumentCreateOptionsModalElement extends UmbModalBaseElement< const { data } = await this.#documentItemRepository.requestItems([parentUnique]); if (data) { // TODO: we need to get the correct variant context here - this._headline = `Create at ${data[0].variants?.[0].name}`; + this._headline = `${this.localize.term('create_createUnder')} ${data[0].variants?.[0].name ?? this.localize.term('actionCategories_content')}`; } } // close the modal when navigating to data type - #onNavigate() { + #onNavigate(documentTypeUnique: string, blueprintUnique?: string) { + if (!blueprintUnique) { + history.pushState( + null, + '', + `section/content/workspace/document/create/parent/${this.data?.parent.entityType}/${this.data?.parent.unique ?? 'null'}/${documentTypeUnique}`, + ); + } else { + history.pushState( + null, + '', + `section/content/workspace/document/create/parent/${this.data?.parent.entityType}/${this.data?.parent.unique ?? 'null'}/${documentTypeUnique}/${blueprintUnique}`, + ); + } this._submitModal(); } + async #onSelectDocumentType(documentTypeUnique: string) { + this.#documentTypeUnique = documentTypeUnique; + this.#documentTypeIcon = this._allowedDocumentTypes.find((dt) => dt.unique === documentTypeUnique)?.icon ?? ''; + + /** TODO: Fix this to use the correct endpoint when it becomes available */ + const { data } = await this.#documentBlueprintItemRepository.requestItems([]); + if (!data?.length) return; + + this._availableBlueprints = data.filter((blueprint) => blueprint.documentType.unique === documentTypeUnique); + + if (!this._availableBlueprints.length) { + this.#onNavigate(documentTypeUnique); + return; + } + } + render() { return html` - - - ${this._allowedDocumentTypes.length === 0 ? html`

No allowed types

` : nothing} - ${this._allowedDocumentTypes.map( - (documentType) => html` - - > ${documentType.icon ? html`` : nothing} - - `, - )} -
+ + ${this._availableBlueprints.length && this.#documentTypeUnique + ? this.#renderBlueprints() + : this.#renderDocumentTypes()} `; } - static styles = [UmbTextStyles]; + #renderDocumentTypes() { + return html` + ${this._allowedDocumentTypes.length === 0 ? html`

No allowed types

` : nothing} + ${this._allowedDocumentTypes.map( + (documentType) => html` + this.#onSelectDocumentType(documentType.unique)}> + + + `, + )} +
`; + } + + #renderBlueprints() { + return html` + this.#onNavigate(this.#documentTypeUnique)}> + + + ${repeat( + this._availableBlueprints, + (blueprint) => blueprint.unique, + (blueprint) => + html` this.#onNavigate(this.#documentTypeUnique, blueprint.unique)}> + + `, + )} `; + } + + static styles = [ + UmbTextStyles, + css` + #blank { + border-bottom: 1px solid var(--uui-color-border); + } + `, + ]; } export default UmbDocumentCreateOptionsModalElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 8d0ab6f62c..7c40e92a1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -4,7 +4,6 @@ import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; import { UMB_USER_PERMISSION_DOCUMENT_DELETE, UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, - UMB_USER_PERMISSION_DOCUMENT_MOVE, UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, UMB_USER_PERMISSION_DOCUMENT_PUBLISH, @@ -15,6 +14,7 @@ import { manifests as createBlueprintManifests } from './create-blueprint/manife import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -35,25 +35,6 @@ const entityActions: Array = [ }, ], }, - { - type: 'entityAction', - alias: 'Umb.EntityAction.Document.Move', - name: 'Move Document Entity Action ', - kind: 'move', - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - weight: 900, - meta: { - moveRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - pickerModelAlias: UMB_DOCUMENT_PICKER_MODAL, - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], - }, - ], - }, { type: 'entityAction', kind: 'duplicate', @@ -157,5 +138,6 @@ export const manifests = [ ...publicAccessManifests, ...cultureAndHostnamesManifests, ...sortChildrenOfManifests, + ...moveManifests, ...entityActions, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/index.ts new file mode 100644 index 0000000000..6a8cb43962 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveDocumentRepository, UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/manifests.ts new file mode 100644 index 0000000000..fd970dc6ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_TREE_ALIAS, UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_USER_PERMISSION_DOCUMENT_MOVE } from '../../user-permissions/constants.js'; +import { UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.Document.MoveTo', + name: 'Move Document Entity Action', + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_DOCUMENT_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS, + treeAlias: UMB_DOCUMENT_TREE_ALIAS, + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], + }, + ], + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/constants.ts new file mode 100644 index 0000000000..a3f4f36752 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS = 'Umb.Repository.Document.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.repository.ts new file mode 100644 index 0000000000..4248878930 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveDocumentServerDataSource } from './document-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveDocumentRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveDocumentServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.server.data-source.ts new file mode 100644 index 0000000000..e59c817d23 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/document-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move Document Server Data Source + * @export + * @class UmbMoveDocumentServerDataSource + */ +export class UmbMoveDocumentServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveDocumentServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveDocumentServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveDocumentServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + DocumentService.putDocumentByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/index.ts new file mode 100644 index 0000000000..3b95bc5269 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMoveDocumentRepository } from './document-move.repository.js'; +export { UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/manifests.ts new file mode 100644 index 0000000000..3258fe31a1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/move-to/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS } from './constants.js'; +import { UmbMoveDocumentRepository } from './document-move.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const moveRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS, + name: 'Move Document Repository', + api: UmbMoveDocumentRepository, +}; + +export const manifests = [moveRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts index a509f88957..0c6940f22b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts @@ -82,7 +82,7 @@ export const manifests: Array = [ { type: 'entityBulkAction', kind: 'default', - alias: 'Umb.EntityBulkAction.Document.Move', + alias: 'Umb.EntityBulkAction.Document.MoveTo', name: 'Move Document Entity Bulk Action', weight: 20, api: UmbMoveDocumentEntityBulkAction, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/document-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/document-picker-modal.token.ts index 9e04756f58..b244d4093a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/document-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/document-picker-modal.token.ts @@ -1,12 +1,16 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; import type { UmbDocumentItemModel } from '@umbraco-cms/backoffice/document'; export type UmbDocumentPickerModalData = UmbTreePickerModalData; -export type UmbDocumentPickerModalValue = UmbPickerModalValue; +export type UmbDocumentPickerModalValue = UmbTreePickerModalValue; export const UMB_DOCUMENT_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', + UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index 8c43e9af9c..e3d553111f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -9,10 +9,10 @@ import type { UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-document-granular-user-permission') -export class UmbInputDocumentGranularUserPermissionElement extends FormControlMixin(UmbLitElement) { +export class UmbInputDocumentGranularUserPermissionElement extends UUIFormControlMixin(UmbLitElement, '') { _permissions: Array = []; public get permissions(): Array { return this._permissions; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 1ab4c387a1..25d4dc6469 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -48,6 +48,7 @@ import { UmbRequestReloadTreeItemChildrenEvent } from '@umbraco-cms/backoffice/t import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; +import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; type EntityType = UmbDocumentDetailModel; export class UmbDocumentWorkspaceContext @@ -75,6 +76,10 @@ export class UmbDocumentWorkspaceContext #languages = new UmbArrayState([], (x) => x.unique); public readonly languages = this.#languages.asObservable(); + #blueprintRepository = new UmbDocumentBlueprintDetailRepository(this); + /*#blueprint = new UmbObjectState(undefined); + public readonly blueprint = this.#blueprint.asObservable();*/ + public isLoaded() { return this.#getDataPromise; } @@ -145,6 +150,24 @@ export class UmbDocumentWorkspaceContext this.loadLanguages(); this.routes.setRoutes([ + { + path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique/:blueprintUnique', + component: () => import('./document-workspace-editor.element.js'), + setup: async (_component, info) => { + const parentEntityType = info.match.params.entityType; + const parentUnique: string | null = + info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; + const documentTypeUnique = info.match.params.documentTypeUnique; + const blueprintUnique = info.match.params.blueprintUnique; + + this.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique, blueprintUnique); + new UmbWorkspaceIsNewRedirectController( + this, + this, + this.getHostElement().shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, { path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', component: () => import('./document-workspace-editor.element.js'), @@ -208,15 +231,32 @@ export class UmbDocumentWorkspaceContext } } - async create(parent: { entityType: string; unique: string | null }, documentTypeUnique: string) { + async create( + parent: { entityType: string; unique: string | null }, + documentTypeUnique: string, + blueprintUnique?: string, + ) { this.resetState(); this.#parent.setValue(parent); - this.#getDataPromise = this.repository.createScaffold({ - documentType: { - unique: documentTypeUnique, - collection: null, - }, - }); + + /**TODO Explore bug: A way to make blueprintUnique undefined/null when no unique is given, rather than setting it to invariant */ + if (blueprintUnique && blueprintUnique.toLowerCase() !== 'invariant') { + const { data } = await this.#blueprintRepository.requestByUnique(blueprintUnique); + console.log(data); + this.#getDataPromise = this.repository.createScaffold({ + documentType: data?.documentType, + values: data?.values, + variants: data?.variants as Array, + }); + } else { + this.#getDataPromise = this.repository.createScaffold({ + documentType: { + unique: documentTypeUnique, + collection: null, + }, + }); + } + const { data } = await this.#getDataPromise; if (!data) return undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/components/input-language/input-language.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/components/input-language/input-language.element.ts index 7da3256813..69d0f4a540 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/components/input-language/input-language.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/components/input-language/input-language.element.ts @@ -1,12 +1,12 @@ import type { UmbLanguageItemModel } from '../../repository/index.js'; import { UmbLanguagePickerContext } from './input-language.context.js'; import { css, html, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-input-language') -export class UmbInputLanguageElement extends FormControlMixin(UmbLitElement) { +export class UmbInputLanguageElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace-editor.element.ts index 2648fd0d73..fa5bc5f053 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace-editor.element.ts @@ -3,7 +3,7 @@ import { UMB_LANGUAGE_WORKSPACE_CONTEXT } from './language-workspace.context-tok import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-language-workspace-editor') export class UmbLanguageWorkspaceEditorElement extends UmbLitElement { @@ -55,7 +55,8 @@ export class UmbLanguageWorkspaceEditorElement extends UmbLitElement { : html``} + @input="${this.#handleInput}" + ${umbFocus()}>
`}
`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts index 259a7751b4..634a3a87e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts @@ -10,6 +10,7 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import '@umbraco-cms/backoffice/culture'; @customElement('umb-language-details-workspace-view') export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement implements UmbWorkspaceViewElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/components/input-markdown-editor/input-markdown.element.ts b/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/components/input-markdown-editor/input-markdown.element.ts index 665ab2e9e6..e525c752b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/components/input-markdown-editor/input-markdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/components/input-markdown-editor/input-markdown.element.ts @@ -4,17 +4,14 @@ import { monaco } from '@umbraco-cms/backoffice/external/monaco-editor'; import type { UmbCodeEditorController, UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { css, html, customElement, query, property, unsafeHTML, when } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, type UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin, type UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { - UMB_LINK_PICKER_MODAL, - UMB_MEDIA_TREE_PICKER_MODAL, - UMB_MODAL_MANAGER_CONTEXT, -} from '@umbraco-cms/backoffice/modal'; +import { UMB_LINK_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/media'; /** * @element umb-input-markdown @@ -22,7 +19,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; */ @customElement('umb-input-markdown') -export class UmbInputMarkdownElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMarkdownElement extends UUIFormControlMixin(UmbLitElement, '') { protected getFormElement() { return this._codeEditor; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.context.ts index 403e692a92..dfe3fea1f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.context.ts @@ -1,8 +1,8 @@ import type { UmbMediaTypeItemModel } from '../../repository/index.js'; import { UMB_MEDIA_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_MEDIA_TYPE_PICKER_MODAL } from '../../tree/media-type-picker-modal.token.js'; import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UMB_MEDIA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbMediaTypePickerContext extends UmbPickerInputContext { constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.element.ts index 37f18447f0..6201d1da8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/components/input-media-type/input-media-type.element.ts @@ -1,12 +1,12 @@ import type { UmbMediaTypeItemModel } from '../../repository/index.js'; import { UmbMediaTypePickerContext } from './input-media-type.context.js'; import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-input-media-type') -export class UmbInputMediaTypeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMediaTypeElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts index c80d3fead0..f6eda92df5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/manifests.ts @@ -1,22 +1,11 @@ import { UMB_MEDIA_TYPE_ENTITY_TYPE } from '../entity.js'; import { UMB_MEDIA_TYPE_DETAIL_REPOSITORY_ALIAS, UMB_MEDIA_TYPE_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_MEDIA_TYPE_PICKER_MODAL } from '../tree/index.js'; import { manifests as createManifests } from './create/manifests.js'; -import { UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { manifests as moveManifests } from './move-to/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ - { - type: 'entityAction', - kind: 'move', - alias: 'Umb.EntityAction.MediaType.Move', - name: 'Move Media Type Entity Action', - forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE], - meta: { - moveRepositoryAlias: UMB_MEDIA_TYPE_DETAIL_REPOSITORY_ALIAS, - itemRepositoryAlias: UMB_MEDIA_TYPE_ITEM_REPOSITORY_ALIAS, - pickerModal: UMB_MEDIA_TREE_PICKER_MODAL, - }, - }, { type: 'entityAction', kind: 'duplicate', @@ -26,7 +15,7 @@ const entityActions: Array = [ meta: { duplicateRepositoryAlias: UMB_MEDIA_TYPE_DETAIL_REPOSITORY_ALIAS, itemRepositoryAlias: UMB_MEDIA_TYPE_ITEM_REPOSITORY_ALIAS, - pickerModal: UMB_MEDIA_TREE_PICKER_MODAL, + pickerModal: UMB_MEDIA_TYPE_PICKER_MODAL, }, }, { @@ -42,4 +31,4 @@ const entityActions: Array = [ }, ]; -export const manifests = [...entityActions, ...createManifests]; +export const manifests = [...entityActions, ...createManifests, ...moveManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/index.ts new file mode 100644 index 0000000000..e16847c20f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveMediaTypeRepository, UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/manifests.ts new file mode 100644 index 0000000000..7446965839 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_MEDIA_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEDIA_TYPE_TREE_REPOSITORY_ALIAS, UMB_MEDIA_TYPE_TREE_ALIAS } from '../../tree/index.js'; +import { UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.MediaType.MoveTo', + name: 'Move Media Type Entity Action', + forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_MEDIA_TYPE_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS, + treeAlias: UMB_MEDIA_TYPE_TREE_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/constants.ts new file mode 100644 index 0000000000..0b1e0108cc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MediaType.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/index.ts new file mode 100644 index 0000000000..d073d1bc98 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMoveMediaTypeRepository } from './media-type-move.repository.js'; +export { UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/manifests.ts new file mode 100644 index 0000000000..6c9199a10e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS } from './constants.js'; +import { UmbMoveMediaTypeRepository } from './media-type-move.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const moveRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MOVE_MEDIA_TYPE_REPOSITORY_ALIAS, + name: 'Move Media Type Repository', + api: UmbMoveMediaTypeRepository, +}; + +export const manifests = [moveRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.repository.ts new file mode 100644 index 0000000000..62d92043f2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveMediaTypeServerDataSource } from './media-type-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveMediaTypeRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveMediaTypeServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.server.data-source.ts new file mode 100644 index 0000000000..5177c9bde2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/move-to/repository/media-type-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move Media Type Server Data Source + * @export + * @class UmbMoveMediaTypeServerDataSource + */ +export class UmbMoveMediaTypeServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveMediaTypeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveMediaTypeServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveMediaTypeServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + MediaTypeService.putMediaTypeByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/index.ts index 60142d5186..e746aa874e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/index.ts @@ -8,3 +8,5 @@ export * from './tree/types.js'; export * from './types.js'; export * from './utils/index.js'; + +export { UMB_MEDIA_TYPE_PICKER_MODAL } from './tree/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/index.ts index 8f6cd31496..c3e4fe6987 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/index.ts @@ -4,8 +4,8 @@ export { UMB_MEDIA_TYPE_TREE_REPOSITORY_ALIAS, } from './manifests.js'; export * from './folder/index.js'; - export { UmbMediaTypeTreeRepository } from './media-type-tree.repository.js'; export { UMB_MEDIA_TYPE_TREE_STORE_CONTEXT } from './media-type-tree.store.js'; +export { UMB_MEDIA_TYPE_PICKER_MODAL } from './media-type-picker-modal.token.js'; export type { UmbMediaTypeTreeItemModel, UmbMediaTypeTreeRootModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-picker-modal.token.ts new file mode 100644 index 0000000000..c6ecbe0509 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-picker-modal.token.ts @@ -0,0 +1,23 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + type UmbUniqueTreeItemModel, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; + +export type UmbMediaTypePickerModalData = UmbTreePickerModalData; +export type UmbMediaTypePickerModalValue = UmbTreePickerModalValue; + +export const UMB_MEDIA_TYPE_PICKER_MODAL = new UmbModalToken( + UMB_TREE_PICKER_MODAL_ALIAS, + { + modal: { + type: 'sidebar', + size: 'small', + }, + data: { + treeAlias: 'Umb.Tree.MediaType', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts index 4fee493db8..66c3009968 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts @@ -3,7 +3,7 @@ import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from './media-type-workspace.context import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UMB_ICON_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; @@ -37,18 +37,6 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { this.observe(this.#workspaceContext.name, (name) => (this._name = name), '_observeName'); this.observe(this.#workspaceContext.alias, (alias) => (this._alias = alias), '_observeAlias'); this.observe(this.#workspaceContext.icon, (icon) => (this._icon = icon), '_observeIcon'); - - this.observe( - this.#workspaceContext.isNew, - (isNew) => { - if (isNew) { - // TODO: Would be good with a more general way to bring focus to the name input. - (this.shadowRoot?.querySelector('#name') as HTMLElement)?.focus(); - } - this.removeUmbControllerByAlias('isNewRedirectController'); - }, - '_observeIsNew', - ); } // TODO: find a way where we don't have to do this for all workspaces. @@ -115,7 +103,7 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { - + { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts index 1367987c5f..1cbc5b8da1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts @@ -1,7 +1,7 @@ import type { UmbMediaItemModel } from '../../repository/index.js'; import { UmbMediaPickerContext } from './input-media.context.js'; import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { type UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; @@ -20,7 +20,7 @@ const SORTER_CONFIG: UmbSorterConfig = { }; @customElement('umb-input-media') -export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMediaElement extends UUIFormControlMixin(UmbLitElement, '') { #sorter = new UmbSorterController(this, { ...SORTER_CONFIG, onChange: ({ model }) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts index 3e355e7e9f..5964af777b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts @@ -1,5 +1,7 @@ import { UMB_MEDIA_DETAIL_REPOSITORY_ALIAS, UMB_MEDIA_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; import { manifests as createManifests } from './create/manifests.js'; +import { manifests as moveManifests } from './move-to/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -9,7 +11,7 @@ const entityActions: Array = [ alias: 'Umb.EntityAction.Media.Delete', name: 'Delete Media Entity Action ', kind: 'delete', - forEntityTypes: ['media'], + forEntityTypes: [UMB_MEDIA_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, detailRepositoryAlias: UMB_MEDIA_DETAIL_REPOSITORY_ALIAS, @@ -17,4 +19,4 @@ const entityActions: Array = [ }, ]; -export const manifests = [...entityActions]; +export const manifests = [...entityActions, ...moveManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/index.ts new file mode 100644 index 0000000000..13b4fb73ad --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/index.ts @@ -0,0 +1 @@ +export { UmbMoveMediaRepository, UMB_MOVE_MEDIA_REPOSITORY_ALIAS } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/manifests.ts new file mode 100644 index 0000000000..b97ac60e72 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEDIA_TREE_REPOSITORY_ALIAS, UMB_MEDIA_TREE_ALIAS } from '../../tree/index.js'; +import { UMB_MOVE_MEDIA_REPOSITORY_ALIAS } from './repository/index.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'moveTo', + alias: 'Umb.EntityAction.Media.MoveTo', + name: 'Move Media Entity Action', + forEntityTypes: [UMB_MEDIA_ENTITY_TYPE], + meta: { + treeRepositoryAlias: UMB_MEDIA_TREE_REPOSITORY_ALIAS, + moveRepositoryAlias: UMB_MOVE_MEDIA_REPOSITORY_ALIAS, + treeAlias: UMB_MEDIA_TREE_ALIAS, + }, + }, +]; + +export const manifests = [...entityActions, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/constants.ts new file mode 100644 index 0000000000..8aab22c289 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MOVE_MEDIA_REPOSITORY_ALIAS = 'Umb.Repository.Media.Move'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/index.ts new file mode 100644 index 0000000000..c37fac09be --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMoveMediaRepository } from './media-move.repository.js'; +export { UMB_MOVE_MEDIA_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/manifests.ts new file mode 100644 index 0000000000..699791550f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MOVE_MEDIA_REPOSITORY_ALIAS } from './constants.js'; +import { UmbMoveMediaRepository } from './media-move.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const moveRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MOVE_MEDIA_REPOSITORY_ALIAS, + name: 'Move Media Repository', + api: UmbMoveMediaRepository, +}; + +export const manifests = [moveRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.repository.ts new file mode 100644 index 0000000000..16fbdec5f0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.repository.ts @@ -0,0 +1,20 @@ +import { UmbMoveMediaServerDataSource } from './media-move.server.data-source.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbMoveRepository, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbMoveMediaRepository extends UmbRepositoryBase implements UmbMoveRepository { + #moveSource = new UmbMoveMediaServerDataSource(this); + + async requestMoveTo(args: UmbMoveToRequestArgs) { + const { error } = await this.#moveSource.moveTo(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Moved` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.server.data-source.ts new file mode 100644 index 0000000000..faf84e11c5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/move-to/repository/media-move.server.data-source.ts @@ -0,0 +1,44 @@ +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbMoveDataSource, UmbMoveToRequestArgs } from '@umbraco-cms/backoffice/entity-action'; + +/** + * Move Media Server Data Source + * @export + * @class UmbMoveMediaServerDataSource + */ +export class UmbMoveMediaServerDataSource implements UmbMoveDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMoveMediaServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMoveMediaServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Move an item for the given id to the target unique + * @param {string} unique + * @param {(string | null)} targetUnique + * @return {*} + * @memberof UmbMoveMediaServerDataSource + */ + async moveTo(args: UmbMoveToRequestArgs) { + if (!args.unique) throw new Error('Unique is missing'); + if (args.destination.unique === undefined) throw new Error('Destination unique is missing'); + + return tryExecuteAndNotify( + this.#host, + MediaService.putMediaByIdMove({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/manifests.ts index dc643b3063..d7ea05ed49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/manifests.ts @@ -32,7 +32,7 @@ export const manifests: Array = [ }, { type: 'entityBulkAction', - alias: 'Umb.EntityBulkAction.Media.Move', + alias: 'Umb.EntityBulkAction.Media.MoveTo', name: 'Move Media Entity Bulk Action', weight: 20, api: UmbMediaMoveEntityBulkAction, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts index 69dfbb5926..d22ef9c539 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts @@ -1,5 +1,6 @@ +import { UMB_MEDIA_TREE_PICKER_MODAL } from '../../tree/index.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; -import { UMB_MODAL_MANAGER_CONTEXT, UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbMediaMoveEntityBulkAction extends UmbEntityBulkActionBase { async execute() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts index a475f13f31..774113923c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts @@ -7,7 +7,7 @@ export * from './components/index.js'; export * from './entity.js'; export * from './utils/index.js'; -export { UMB_MEDIA_TREE_ALIAS } from './tree/index.js'; +export { UMB_MEDIA_TREE_ALIAS, UMB_MEDIA_TREE_PICKER_MODAL } from './tree/index.js'; export { UMB_MEDIA_COLLECTION_ALIAS } from './collection/index.js'; export { UMB_MEDIA_MENU_ALIAS } from './menu/manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts index d3631a29c6..f587d2449d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts @@ -2,7 +2,7 @@ import { UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; import { UMB_MEDIA_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; -import { UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { UMB_MEDIA_TREE_PICKER_MODAL } from '../../tree/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/index.ts index 2b2581f649..9e0f66f683 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/index.ts @@ -1,5 +1,6 @@ export { UmbMediaTreeRepository } from './media-tree.repository.js'; export { UMB_MEDIA_TREE_REPOSITORY_ALIAS, UMB_MEDIA_TREE_STORE_ALIAS, UMB_MEDIA_TREE_ALIAS } from './manifests.js'; export { UMB_MEDIA_TREE_STORE_CONTEXT } from './media-tree.store.js'; +export { UMB_MEDIA_TREE_PICKER_MODAL } from './media-tree-picker-modal.token.js'; export { type UmbMediaTreeStore } from './media-tree.store.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-tree-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree-picker-modal.token.ts similarity index 57% rename from src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-tree-picker-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree-picker-modal.token.ts index e7be987ac8..2ba9bba5cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/media-tree-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree-picker-modal.token.ts @@ -1,12 +1,16 @@ -import { UmbModalToken } from './modal-token.js'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; import type { UmbMediaTreeItemModel } from '@umbraco-cms/backoffice/media'; export type UmbMediaTreePickerModalData = UmbTreePickerModalData; -export type UmbMediaTreePickerModalValue = UmbPickerModalValue; +export type UmbMediaTreePickerModalValue = UmbTreePickerModalValue; export const UMB_MEDIA_TREE_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', + UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/components/input-member-group/input-member-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/components/input-member-group/input-member-group.element.ts index c0fc8a2ae8..565e13a28e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/components/input-member-group/input-member-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/components/input-member-group/input-member-group.element.ts @@ -1,7 +1,7 @@ import type { UmbMemberGroupItemModel } from '../../repository/index.js'; import { UmbMemberPickerContext } from './input-member-group.context.js'; import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { MemberItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @@ -21,7 +21,7 @@ const SORTER_CONFIG: UmbSorterConfig = { }; @customElement('umb-input-member-group') -export class UmbInputMemberGroupElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMemberGroupElement extends UUIFormControlMixin(UmbLitElement, '') { #sorter = new UmbSorterController(this, { ...SORTER_CONFIG, onChange: ({ model }) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace-editor.element.ts index 65180d682c..a2f5f27ac4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace-editor.element.ts @@ -1,7 +1,7 @@ import { UMB_MEMBER_GROUP_WORKSPACE_CONTEXT } from './member-group-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, property, state, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; @@ -62,7 +62,7 @@ export class UmbMemberGroupWorkspaceEditorElement extends UmbLitElement { ${this.#renderActions()} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/components/input-member-type/input-member-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/components/input-member-type/input-member-type.element.ts index c42c94ae53..cdb1f7d6e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/components/input-member-type/input-member-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/components/input-member-type/input-member-type.element.ts @@ -1,12 +1,12 @@ import { UmbMemberTypePickerContext } from './input-member-type.context.js'; import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { MemberTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-input-member-type') -export class UmbInputMemberTypeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMemberTypeElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/modal/member-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/modal/member-type-picker-modal.token.ts index 22546423bb..dd858eadab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/modal/member-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/modal/member-type-picker-modal.token.ts @@ -1,14 +1,18 @@ import { UmbModalToken } from '../../../core/modal/token/modal-token.js'; -import type { UmbUniqueTreeItemModel } from '@umbraco-cms/backoffice/tree'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { UMB_TREE_PICKER_MODAL_ALIAS } from '@umbraco-cms/backoffice/tree'; +import type { + UmbTreePickerModalValue, + UmbTreePickerModalData, + UmbUniqueTreeItemModel, +} from '@umbraco-cms/backoffice/tree'; export type UmbMemberTypePickerModalData = UmbTreePickerModalData; -export type UmbMemberTypePickerModalValue = UmbPickerModalValue; +export type UmbMemberTypePickerModalValue = UmbTreePickerModalValue; export const UMB_MEMBER_TYPE_PICKER_MODAL = new UmbModalToken< UmbMemberTypePickerModalData, UmbMemberTypePickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts index 10cac1e6a0..37f3e59b7b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts @@ -1,6 +1,6 @@ import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from './member-type-workspace.context-token.js'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { UMB_ICON_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @@ -118,7 +118,7 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { - + = { }; @customElement('umb-input-member') -export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) { +export class UmbInputMemberElement extends UUIFormControlMixin(UmbLitElement, '') { #sorter = new UmbSorterController(this, { ...SORTER_CONFIG, onChange: ({ model }) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/object-type/input-object-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/object-type/input-object-type.element.ts index 585089555c..3db8e11954 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/object-type/input-object-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/object-type/input-object-type.element.ts @@ -1,11 +1,11 @@ import { UmbObjectTypeRepository } from './object-type.repository.js'; import { html, customElement, property, query, state } from '@umbraco-cms/backoffice/external/lit'; import type { UUISelectElement } from '@umbraco-cms/backoffice/external/uui'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-input-object-type') -export class UmbInputObjectTypeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputObjectTypeElement extends UUIFormControlMixin(UmbLitElement, '') { @query('uui-select') private select!: UUISelectElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-builder/workspace/workspace-package-builder.element.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-builder/workspace/workspace-package-builder.element.ts index aebb374368..2abb1e6b0b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-builder/workspace/workspace-package-builder.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-builder/workspace/workspace-package-builder.element.ts @@ -20,7 +20,7 @@ import { ifDefined, } from '@umbraco-cms/backoffice/external/lit'; import { blobDownload } from '@umbraco-cms/backoffice/utils'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/server-file-system'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; @@ -68,7 +68,6 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { connectedCallback(): void { super.connectedCallback(); this.#getPackageCreated(); - requestAnimationFrame(() => this._packageNameInput?.focus()); } async #getPackageCreated() { @@ -147,6 +146,7 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { required label="Name of the package" placeholder=${this.localize.term('placeholders_entername')} + ${umbFocus()} .value=${this._package?.name ?? ''} @input=${(e: UUIInputEvent) => (this._package!.name = e.target.value as string)}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts index 05d8649b00..a37110ec08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts @@ -3,7 +3,7 @@ import { css, html, nothing, customElement, state, query, property } from '@umbr import { UMB_MODAL_MANAGER_CONTEXT, UMB_EXAMINE_FIELDS_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; import type { SearchResultResponseModel, FieldPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import { SearcherService } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import './modal-views/fields-viewer.element.js'; @@ -112,7 +112,8 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { id="search-input" placeholder="Type to filter..." label="Type to filter" - @keypress=${this._onKeyPress}> + @keypress=${this._onKeyPress} + ${umbFocus()}> Search diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/components/input-static-file/input-static-file.element.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/components/input-static-file/input-static-file.element.ts index 941e03254b..9d8b20f381 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/components/input-static-file/input-static-file.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/components/input-static-file/input-static-file.element.ts @@ -1,12 +1,12 @@ import type { UmbStaticFileItemModel } from '../../repository/item/types.js'; import { UmbStaticFilePickerContext } from './input-static-file.context.js'; import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-input-static-file') -export class UmbInputStaticFileElement extends FormControlMixin(UmbLitElement) { +export class UmbInputStaticFileElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected files in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/modals/static-file-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/modals/static-file-picker-modal.token.ts index 2209fd678f..4b891f639f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/modals/static-file-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/modals/static-file-picker-modal.token.ts @@ -1,15 +1,19 @@ import { UMB_STATIC_FILE_TREE_ALIAS } from '../tree/manifests.js'; import type { StaticFileItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export type UmbStaticFilePickerModalData = UmbTreePickerModalData; -export type UmbStaticFilePickerModalValue = UmbPickerModalValue; +export type UmbStaticFilePickerModalValue = UmbTreePickerModalValue; export const UMB_STATIC_FILE_PICKER_MODAL = new UmbModalToken< UmbStaticFilePickerModalData, UmbStaticFilePickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tags/components/tags-input/tags-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tags/components/tags-input/tags-input.element.ts index 3a2d40e448..f135e7fbda 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tags/components/tags-input/tags-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tags/components/tags-input/tags-input.element.ts @@ -11,12 +11,12 @@ import { repeat, } from '@umbraco-cms/backoffice/external/lit'; import type { UUIInputElement, UUIInputEvent, UUITagElement } from '@umbraco-cms/backoffice/external/uui'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { TagResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @customElement('umb-tags-input') -export class UmbTagsInputElement extends FormControlMixin(UmbLitElement) { +export class UmbTagsInputElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ type: String }) group?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/modals/partial-view-picker/partial-view-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/modals/partial-view-picker/partial-view-picker-modal.token.ts index cf2f080421..99e245951c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/modals/partial-view-picker/partial-view-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/modals/partial-view-picker/partial-view-picker-modal.token.ts @@ -1,15 +1,16 @@ import { UMB_PARTIAL_VIEW_TREE_ALIAS } from '../../partial-views/tree/manifests.js'; import type { UmbPartialViewTreeItemModel } from '../../partial-views/tree/index.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import type { UmbTreePickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/tree'; +import { UMB_TREE_PICKER_MODAL_ALIAS } from '@umbraco-cms/backoffice/tree'; export type UmbPartialViewPickerModalData = UmbTreePickerModalData; -export type UmbPartialViewPickerModalValue = UmbPickerModalValue; +export type UmbPartialViewPickerModalValue = UmbTreePickerModalValue; export const UMB_PARTIAL_VIEW_PICKER_MODAL = new UmbModalToken< UmbPartialViewPickerModalData, UmbPartialViewPickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-editor.element.ts index 1b1ca191e7..980775ae3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-editor.element.ts @@ -4,8 +4,8 @@ import { UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT } from './partial-view-workspace.con import { UMB_TEMPLATE_QUERY_BUILDER_MODAL } from '@umbraco-cms/backoffice/template'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { css, html, customElement, query, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @customElement('umb-partial-view-workspace-editor') @@ -20,7 +20,7 @@ export class UmbPartialViewWorkspaceEditorElement extends UmbLitElement { private _ready: boolean = false; @state() - private _isNew?: boolean = false; + private _isNew?: boolean; @query('umb-code-editor') private _codeEditor?: UmbCodeEditorElement; @@ -89,29 +89,36 @@ export class UmbPartialViewWorkspaceEditorElement extends UmbLitElement { } render() { - return html` -
- -
- -
- - - Query builder - -
- ${this._ready - ? this.#renderCodeEditor() - : html`
- -
`} -
-
`; + return this._isNew !== undefined + ? html` +
+ +
+ +
+ + + Query builder + +
+ ${this._ready + ? this.#renderCodeEditor() + : html`
+ +
`} +
+
` + : nothing; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/modals/script-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/modals/script-picker-modal.token.ts index bd27809539..fff219026b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/modals/script-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/modals/script-picker-modal.token.ts @@ -1,12 +1,16 @@ import type { UmbScriptTreeItemModel } from '../tree/index.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; export type UmbScriptPickerModalData = UmbTreePickerModalData; -export type UmbScriptPickerModalValue = UmbPickerModalValue; +export type UmbScriptPickerModalValue = UmbTreePickerModalValue; export const UMB_SCRIPT_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', + UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts index a8ba2ef651..54b9155946 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts @@ -1,8 +1,8 @@ import { UMB_SCRIPT_WORKSPACE_CONTEXT } from './script-workspace.context-token.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-script-workspace-editor') @@ -17,7 +17,7 @@ export class UmbScriptWorkspaceEditorElement extends UmbLitElement { private _ready?: boolean = false; @state() - private _isNew?: boolean = false; + private _isNew?: boolean; #context?: typeof UMB_SCRIPT_WORKSPACE_CONTEXT.TYPE; @@ -66,25 +66,28 @@ export class UmbScriptWorkspaceEditorElement extends UmbLitElement { } render() { - return html` -
- -
- - -
- ${this._ready - ? this.#renderCodeEditor() - : html`
- -
`} -
-
`; + return this._isNew !== undefined + ? html` +
+ +
+ + +
+ ${this._ready + ? this.#renderCodeEditor() + : html`
+ +
`} +
+
` + : nothing; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-input.element.ts index 5dca0d4509..8829b3c654 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-input.element.ts @@ -1,12 +1,12 @@ import type { UmbStylesheetItemModel } from '../../types.js'; import { UmbStylesheetPickerContext } from './stylesheet-input.context.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-stylesheet-input') -export class UmbStylesheetInputElement extends FormControlMixin(UmbLitElement) { +export class UmbStylesheetInputElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-picker-modal.token.ts index 619999fd74..ccc7cac44c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-input/stylesheet-picker-modal.token.ts @@ -1,14 +1,18 @@ import type { UmbStylesheetTreeItemModel } from '../../tree/types.js'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { + type UmbTreePickerModalValue, + type UmbTreePickerModalData, + UMB_TREE_PICKER_MODAL_ALIAS, +} from '@umbraco-cms/backoffice/tree'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export type UmbStylesheetPickerModalData = UmbTreePickerModalData; -export type UmbStylesheetPickerModalValue = UmbPickerModalValue; +export type UmbStylesheetPickerModalValue = UmbTreePickerModalValue; export const UMB_STYLESHEET_PICKER_MODAL = new UmbModalToken< UmbStylesheetPickerModalData, UmbStylesheetPickerModalValue ->('Umb.Modal.TreePicker', { +>(UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', size: 'small', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-rule-input/stylesheet-rule-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-rule-input/stylesheet-rule-input.element.ts index 6e473a408b..0aebf5c162 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-rule-input/stylesheet-rule-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/components/stylesheet-rule-input/stylesheet-rule-input.element.ts @@ -2,14 +2,14 @@ import type { UmbStylesheetRule } from '../../types.js'; import { UMB_STYLESHEET_RULE_SETTINGS_MODAL } from './stylesheet-rule-settings-modal.token.js'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { css, html, customElement, repeat, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; // TODO: add sorting when we have a generic sorting component/functionality for ref lists @customElement('umb-stylesheet-rule-input') -export class UmbStylesheetRuleInputElement extends FormControlMixin(UmbLitElement) { +export class UmbStylesheetRuleInputElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ type: Array, attribute: false }) rules: UmbStylesheetRule[] = []; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts index 3adf3431dd..3535ee5154 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts @@ -1,13 +1,13 @@ import { UMB_STYLESHEET_WORKSPACE_CONTEXT } from './stylesheet-workspace.context-token.js'; import type { UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-stylesheet-workspace-editor') export class UmbStylesheetWorkspaceEditorElement extends UmbLitElement { @state() - private _isNew?: boolean = false; + private _isNew?: boolean; @state() private _name?: string; @@ -35,20 +35,23 @@ export class UmbStylesheetWorkspaceEditorElement extends UmbLitElement { } render() { - return html` - - - - `; + return this._isNew !== undefined + ? html` + + + + ` + : nothing; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/input-template/input-template.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/input-template/input-template.element.ts index 52fda1981e..49326ca55a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/input-template/input-template.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/input-template/input-template.element.ts @@ -4,7 +4,7 @@ import type { UmbTemplateItemModel } from '../../repository/item/index.js'; import { UmbTemplateItemRepository } from '../../repository/item/index.js'; import { UMB_TEMPLATE_PICKER_MODAL } from '../../modals/index.js'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_WORKSPACE_MODAL, @@ -14,7 +14,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-input-template') -export class UmbInputTemplateElement extends FormControlMixin(UmbLitElement) { +export class UmbInputTemplateElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/template-card/template-card.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/template-card/template-card.element.ts index cc4a841859..5cb2490b8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/template-card/template-card.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/template-card/template-card.element.ts @@ -1,5 +1,5 @@ import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; /** @@ -11,7 +11,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; // TODO: This should extends the UUICardElement, and the visual look of this should be like the UserCard or similarly. // TOOD: Consider if this should be select in the 'persisted'-select style when it is selected as a default. (But its should not use the runtime-selection style) @customElement('umb-template-card') -export class UmbTemplateCardElement extends FormControlMixin(UmbLitElement) { +export class UmbTemplateCardElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ type: String }) name = ''; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder-modal.element.ts index da0bdc9672..6e1973c023 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/query-builder-modal.element.ts @@ -234,7 +234,7 @@ export default class UmbTemplateQueryBuilderModalElement extends UmbModalBaseEle ${sort.direction ?? this._defaultSortDirection} - ` + ` : ''}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/template-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/template-picker-modal.token.ts index 7778661df7..a832fdbd2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/template-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/template-picker-modal.token.ts @@ -1,12 +1,13 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { UMB_TREE_PICKER_MODAL_ALIAS } from '@umbraco-cms/backoffice/tree'; +import type { UmbTreePickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/tree'; import type { UmbTemplateTreeItemModel } from '@umbraco-cms/backoffice/template'; export type UmbTemplatePickerModalData = UmbTreePickerModalData; -export type UmbTemplatePickerModalValue = UmbPickerModalValue; +export type UmbTemplatePickerModalValue = UmbTreePickerModalValue; export const UMB_TEMPLATE_PICKER_MODAL = new UmbModalToken( - 'Umb.Modal.TreePicker', + UMB_TREE_PICKER_MODAL_ALIAS, { modal: { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts index 7b886c2723..94887ad0fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts @@ -10,7 +10,7 @@ import { css, html, customElement, query, state, nothing, ifDefined } from '@umb import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_TEMPLATE_PICKER_MODAL } from '@umbraco-cms/backoffice/template'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; @customElement('umb-template-workspace-editor') @@ -195,7 +195,8 @@ export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { slot="header" .value=${this._name} @input=${this.#onNameInput} - label=${this.localize.term('template_template')}> + label=${this.localize.term('template_template')} + ${umbFocus()}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts index 4c85e03a05..e6b3714ae5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts @@ -5,7 +5,7 @@ import { availableLanguages } from './input-tiny-mce.languages.js'; import { uriAttributeSanitizer } from './input-tiny-mce.sanitizer.js'; import type { TinyMcePluginArguments, UmbTinyMcePluginBase } from './tiny-mce-plugin.js'; import { getProcessedImageUrl } from '@umbraco-cms/backoffice/utils'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import type { EditorEvent, Editor, RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce'; import { type ManifestTinyMcePlugin, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, customElement, html, property, query, state } from '@umbraco-cms/backoffice/external/lit'; @@ -44,7 +44,7 @@ async function onResize( } @customElement('umb-input-tiny-mce') -export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { +export class UmbInputTinyMceElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ attribute: false }) configuration?: UmbPropertyEditorConfigCollection; diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/plugins/tiny-mce-mediapicker.plugin.ts b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/plugins/tiny-mce-mediapicker.plugin.ts index 8bae4b1abc..3451e0a5bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/plugins/tiny-mce-mediapicker.plugin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/plugins/tiny-mce-mediapicker.plugin.ts @@ -1,11 +1,11 @@ import { UMB_MEDIA_CAPTION_ALT_TEXT_MODAL } from '../modals/media-caption-alt-text/media-caption-alt-text-modal.token.js'; import { type TinyMcePluginArguments, UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js'; -import { UMB_MEDIA_TREE_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import type { UMB_CURRENT_USER_CONTEXT, UmbCurrentUserModel } from '@umbraco-cms/backoffice/current-user'; import type { RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce'; import { UmbTemporaryFileRepository } from '@umbraco-cms/backoffice/temporary-file'; import { UmbId } from '@umbraco-cms/backoffice/id'; -import { sizeImageInEditor, uploadBlobImages } from '@umbraco-cms/backoffice/media'; +import { sizeImageInEditor, uploadBlobImages, UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/media'; interface MediaPickerTargetData { altText?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/history/current-user-history-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/history/current-user-history-user-profile-app.element.ts index c2b58fac26..11c997ad26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/history/current-user-history-user-profile-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/history/current-user-history-user-profile-app.element.ts @@ -1,8 +1,8 @@ import type { UmbCurrentUserHistoryItem, UmbCurrentUserHistoryStore } from './current-user-history.store.js'; import { UMB_CURRENT_USER_HISTORY_STORE_CONTEXT } from './current-user-history.store.js'; -import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, state, map, ifDefined, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-current-user-history-user-profile-app') export class UmbCurrentUserHistoryUserProfileAppElement extends UmbLitElement { @@ -25,85 +25,49 @@ export class UmbCurrentUserHistoryUserProfileAppElement extends UmbLitElement { this.observe( this.#currentUserHistoryStore.latestHistory, (history) => { - this._history = history; + this._history = history.reverse(); }, 'umbCurrentUserHistoryObserver', ); } } + #truncate(input: string, length: number, separator = '...'): string { + if (input.length <= length) return input; + + const separatorLength = separator.length; + const charsToShow = length - separatorLength; + const frontChars = Math.ceil(charsToShow / 2); + const backChars = Math.floor(charsToShow / 2); + + return input.substring(9, frontChars) + separator + input.substring(input.length - backChars); + } + render() { return html` - - Recent History -
- ${this._history.reverse().map((item) => html` ${this.#renderHistoryItem(item)} `)} -
+ + ${map(this._history, (item) => html` ${this.#renderItem(item)} `)} `; } - #renderHistoryItem(item: UmbCurrentUserHistoryItem) { + #renderItem(item: UmbCurrentUserHistoryItem) { + const label = Array.isArray(item.label) ? item.label[0] : item.label; + const detail = Array.isArray(item.label) ? item.label.join(' > ') : this.#truncate(item.path, 50); + return html` - - -
- ${Array.isArray(item.label) ? item.label[0] : item.label} - - ${Array.isArray(item.label) - ? item.label.map((label, index) => { - if (index === 0) return; - return html` - ${label} - ${index !== item.label.length - 1 ? html`${'>'}` : nothing} - `; - }) - : nothing} - -
-
+ + + `; } static styles = [ UmbTextStyles, css` - #recent-history { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-3); - } - #recent-history-items { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-4); - } - .history-item { - display: grid; - grid-template-columns: 32px 1fr; - grid-template-rows: 1fr; - color: var(--uui-color-interactive); - text-decoration: none; - } - .history-item uui-icon { - margin-top: var(--uui-size-space-1); - } - .history-item:hover { - color: var(--uui-color-interactive-emphasis); - } - .history-item > div { - color: inherit; - text-decoration: none; - display: flex; - flex-direction: column; - line-height: 1.4em; - } - .history-item > div > span { - font-size: var(--uui-size-4); - opacity: 0.5; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; + uui-ref-node { + padding-left: 0; + padding-right: 0; } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts index e0342b556b..289c946cae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts @@ -1,12 +1,12 @@ import type { UmbUserGroupItemModel } from '../../repository/index.js'; import { UmbUserGroupPickerContext } from './user-group-input.context.js'; import { css, html, customElement, property, state, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-user-group-input') -export class UmbUserGroupInputElement extends FormControlMixin(UmbLitElement) { +export class UmbUserGroupInputElement extends UUIFormControlMixin(UmbLitElement, '') { /** * This is a minimum amount of selected items in this input. * @type {number} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts index a7b1b2e669..f9a1da1ee5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts @@ -4,7 +4,7 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; import type { UmbInputSectionElement } from '@umbraco-cms/backoffice/section'; @@ -82,7 +82,8 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { id="name" label=${this.localize.term('general_name')} .value=${this._userGroup?.name ?? ''} - @input="${this.#onNameChange}"> + @input="${this.#onNameChange}" + ${umbFocus()}>
`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts index 5b19e06dd3..00ae1f1204 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts @@ -5,10 +5,10 @@ import { html, customElement, property, state, nothing, ifDefined } from '@umbra import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import type { UmbUserPermissionVerbElement } from '@umbraco-cms/backoffice/user'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-entity-user-permission') -export class UmbInputEntityUserPermissionElement extends FormControlMixin(UmbLitElement) { +export class UmbInputEntityUserPermissionElement extends UUIFormControlMixin(UmbLitElement, '') { @property({ type: String, attribute: 'entity-type' }) public get entityType(): string { return this._entityType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.element.ts index dd6846ac76..f7918ae903 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.element.ts @@ -1,12 +1,12 @@ import type { UmbUserItemModel } from '../../repository/index.js'; import { UmbUserPickerContext } from './user-input.context.js'; import { css, html, customElement, property, state, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-user-input') -export class UmbUserInputElement extends FormControlMixin(UmbLitElement) { +export class UmbUserInputElement extends UUIFormControlMixin(UmbLitElement, '') { // TODO: [LK] Add sorting! /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts index d3a169032e..0740cef2dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts @@ -5,7 +5,7 @@ import { UMB_USER_WORKSPACE_CONTEXT } from './user-workspace.context-token.js'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; // import local components. Theses are not meant to be used outside of this component. @@ -66,7 +66,7 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { - + `; } @@ -81,7 +81,7 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { } #renderRightColumn() { - if (!this._user || !this.#workspaceContext) return nothing; + if (!this._user) return nothing; return html`