From 62a028dff93f900f42ceac204df7f31e3e8a0205 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:22:34 +0200 Subject: [PATCH 001/323] initial work to log in without losing context --- .../src/apps/app/app-auth.controller.ts | 15 ++-- .../src/apps/app/app.element.ts | 14 ++++ .../src/packages/core/auth/auth-flow.ts | 31 +++++++- .../src/packages/core/auth/auth.context.ts | 4 + .../auth/modals/umb-app-auth-modal.element.ts | 74 +++++++++++++++++-- .../auth/modals/umb-app-auth-modal.token.ts | 10 +-- .../umbraco-news-dashboard.element.ts | 58 +++++---------- 7 files changed, 145 insertions(+), 61 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 78f61dd40b..d30e2e3cf0 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -85,7 +85,14 @@ export class UmbAppAuthController extends UmbControllerBase { throw new Error('[Fatal] No auth providers available'); } - if (availableProviders.length === 1) { + // Show the provider selection screen + const selected = await this.#showLoginModal(userLoginState); + + if (!selected) { + return false; + } + + /*if (availableProviders.length === 1) { // One provider available (most likely the Umbraco provider), so initiate the authorization request to the default provider this.#authContext.makeAuthorizationRequest(); } else { @@ -103,7 +110,7 @@ export class UmbAppAuthController extends UmbControllerBase { return false; } } - } + }*/ return this.#updateState(); } @@ -129,12 +136,10 @@ export class UmbAppAuthController extends UmbControllerBase { .onSubmit() .catch(() => undefined); - if (!selected?.providerName) { + if (!selected) { return false; } - this.#authContext.makeAuthorizationRequest(selected.providerName, selected.loginHint); - return true; } diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index e5a2a100ab..a6813a6310 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -51,6 +51,17 @@ export class UmbAppElement extends UmbLitElement { path: 'install', component: () => import('../installer/installer.element.js'), }, + { + path: 'oauth_complete', + resolve: () => { + // Complete oauth + console.log('congrats you hit the oauth complete'); + this.#authContext?.completeAuthorizationRequest(); + + // Let the opener know that we are done + window.opener?.postMessage('oauth_complete', '*'); + }, + }, { path: 'upgrade', component: () => import('../upgrader/upgrader.element.js'), @@ -152,6 +163,9 @@ export class UmbAppElement extends UmbLitElement { const queryParams = new URLSearchParams(window.location.search); if (queryParams.has('code')) { this.#authContext?.completeAuthorizationRequest(); + + // Let the opener know that we are done + window.opener?.postMessage('oauth_complete', '*'); return; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts index 01b20582f9..06bed95bdb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts @@ -13,6 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_STORAGE_REDIRECT_URL, UMB_STORAGE_TOKEN_RESPONSE_NAME } from './auth.context.token.js'; import type { LocationLike, StringMap } from '@umbraco-cms/backoffice/external/openid'; import { @@ -30,6 +31,7 @@ import { TokenRequest, TokenResponse, } from '@umbraco-cms/backoffice/external/openid'; +import { UmbStringState } from '@umbraco-cms/backoffice/observable-api'; const requestor = new FetchRequestor(); @@ -42,6 +44,22 @@ class UmbNoHashQueryStringUtils extends BasicQueryStringUtils { } } +class UmbLocationInterceptor implements LocationLike { + public redirect = new UmbStringState(undefined); + hash = ''; + host = ''; + origin = ''; + hostname = ''; + pathname = ''; + port = ''; + protocol = ''; + search = ''; + + assign(url: string | URL): void { + this.redirect.setValue(url.toString()); + } +} + /** * This class is used to handle the auth flow through any backend supporting OpenID Connect. * It needs to know the server url, the client id, the redirect uri and the scope. @@ -95,6 +113,7 @@ export class UmbAuthFlow { // tokens #refreshToken: string | undefined; #accessTokenResponse: TokenResponse | undefined; + #locationInterceptor = new UmbLocationInterceptor(); constructor( openIdConnectUrl: string, @@ -119,7 +138,7 @@ export class UmbAuthFlow { this.#authorizationHandler = new RedirectRequestHandler( this.#storageBackend, new UmbNoHashQueryStringUtils(), - window.location, + this.#locationInterceptor, ); // set notifier to deliver responses @@ -149,11 +168,15 @@ export class UmbAuthFlow { sessionStorage.removeItem(UMB_STORAGE_REDIRECT_URL); currentRoute = savedRoute; } - history.replaceState(null, '', currentRoute); + //history.replaceState(null, '', currentRoute); } }); } + authRedirect() { + return this.#locationInterceptor.redirect.asObservable(); + } + /** * This method will initialize all the state needed for the auth flow. * @@ -193,7 +216,7 @@ export class UmbAuthFlow { * @param identityProvider The identity provider to use for the authorization request. * @param usernameHint (Optional) The username to use for the authorization request. It will be provided to the OpenID server as a hint. */ - makeAuthorizationRequest(identityProvider: string, usernameHint?: string): void { + makeAuthorizationRequest(identityProvider: string, usernameHint?: string) { const extras: StringMap = { prompt: 'consent', access_type: 'offline' }; // If the identity provider is not 'Umbraco', we will add it to the extras. @@ -221,6 +244,8 @@ export class UmbAuthFlow { ); this.#authorizationHandler.performAuthorizationRequest(this.#configuration, request); + + return this.#locationInterceptor.redirect.asObservable(); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index cf99b23c35..328a8bbd18 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -15,6 +15,10 @@ export class UmbAuthContext extends UmbContextBase { #isInitialized = new ReplaySubject(1); readonly isInitialized = this.#isInitialized.asObservable().pipe(filter((isInitialized) => isInitialized)); + get authRedirect() { + return this.#authFlow.authRedirect(); + } + #isBypassed = false; #serverUrl; #backofficePath; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 9fb5122908..8a0caf8a3c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -1,14 +1,18 @@ import { UmbModalBaseElement } from '../../modal/index.js'; +import { UMB_AUTH_CONTEXT } from '../auth.context.token.js'; import type { UmbModalAppAuthConfig, UmbModalAppAuthValue } from './umb-app-auth-modal.token.js'; -import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-app-auth-modal') export class UmbAppAuthModalElement extends UmbModalBaseElement { + @state() + private _error?: string; + get props() { return { userLoginState: this.data?.userLoginState ?? 'loggingIn', - onSubmit: this.onSubmit, + onSubmit: this.onSubmit.bind(this), }; } @@ -27,6 +31,35 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement { + this.#authContext = authContext; + + // Observe the auth redirects + this.observe( + authContext.authRedirect, + (url) => { + if (url) { + this.#openWindow = window.open(url, '_blank'); + } + }, + '_redirect', + ); + }); + } + + disconnectedCallback(): void { + super.disconnectedCallback(); + window.removeEventListener('message', this.#onMessage); + } render() { return html` @@ -35,6 +68,7 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement${this.localize.term('login_timeout')}

` : ''} + ${this._error ? html`

${this._error}

` : ''} { - this.value = { providerName }; - this._submitModal(); + private onSubmit = async (providerName: string) => { + const authContext = await this.getContext(UMB_AUTH_CONTEXT); + const redirect = authContext.makeAuthorizationRequest(providerName); + + this.observe( + redirect, + (url) => { + if (url) { + this.#openWindow = window.open(url, '_blank'); + } + }, + '_redirect', + ); }; + async #onMessage(evt: MessageEvent) { + if (evt.data === 'oauth_complete') { + if (this.#openWindow) { + this.#openWindow.close(); + } + + // Refresh the state + await this.#authContext?.setInitialState(); + + // Test if we are authorized + const isAuthed = this.#authContext?.getIsAuthorized(); + this.value = { success: isAuthed }; + if (isAuthed) { + this._submitModal(); + } else { + this._error = 'Failed to authenticate'; + } + } + } + static styles = [ UmbTextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts index 97dd990b68..c51eacd4bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts @@ -7,16 +7,10 @@ export type UmbModalAppAuthConfig = { export type UmbModalAppAuthValue = { /** - * The name of the provider that the user has selected to authenticate with. + * An indicator of whether the authentication was successful. * @required */ - providerName?: string; - - /** - * The login hint that the user has provided to the provider. - * @optional - */ - loginHint?: string; + success?: boolean; }; export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts index d9a5135dbb..3f605ebf38 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts @@ -1,61 +1,39 @@ -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_AUTH_CONTEXT } from '../core/auth/auth.context.token.js'; +import { tryExecuteAndNotify } from '../core/resources/tryExecuteAndNotify.function.js'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UserGroupResource, type UserGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @customElement('umb-umbraco-news-dashboard') export class UmbUmbracoNewsDashboardElement extends UmbLitElement { - #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; - @state() - private _name = ''; + _groups: UserGroupResponseModel[] = []; - constructor() { - super(); - this.consumeContext(UMB_CURRENT_USER_CONTEXT, (instance) => { - this.#currentUserContext = instance; - this.#observeCurrentUser(); - }); + async clearToken() { + const authContext = await this.getContext(UMB_AUTH_CONTEXT); + authContext.clearTokenStorage(); } - #observeCurrentUser(): void { - if (!this.#currentUserContext) return; - this.observe(this.#currentUserContext.currentUser, (user) => { - this._name = user?.name ?? ''; - }); + async makeAuthorizedRequest() { + const { data } = await tryExecuteAndNotify(this, UserGroupResource.getUserGroup({ skip: 0, take: 10 })); + + if (data) { + this._groups = data.items; + } } render() { return html` -

- Welcome, ${this._name} -

-

- This is the beta version of Umbraco 14, where you can have a first-hand look at the new Backoffice. -

- Please refer to the - documentation to learn - more about what is possible. Here you will find excellent tutorials, guides, and references to help you get - started extending the Backoffice. + Clear all tokens + Make authorized request + + ${this._groups.map((group) => html`

${group.name}

`)}

`; } - - static styles = [ - UmbTextStyles, - css` - :host { - display: block; - padding: var(--uui-size-layout-1); - } - p { - position: relative; - } - `, - ]; } export default UmbUmbracoNewsDashboardElement; From 86c357630e60ad53ed4fcf6d7d5ec14f9f7d48e1 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:45:51 +0200 Subject: [PATCH 002/323] redesign --- .../search-modal/search-modal.element.ts | 216 +++++++++--------- 1 file changed, 112 insertions(+), 104 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 98a0c11f88..a87ef068bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -14,7 +14,6 @@ export type SearchItem = { name: string; icon?: string; href: string; - parent: string; url?: string; }; export type SearchGroupItem = { @@ -30,7 +29,20 @@ export class UmbSearchModalElement extends LitElement { private _search = ''; @state() - private _groups: Array = []; + private _searchResults: Array = []; + + @state() + private searchTags: Array = [ + 'Data Type', + 'Document', + 'Document Type', + 'Media', + 'Media Type', + 'Member', + 'Member Type', + 'Users', + 'User Group', + ]; connectedCallback() { super.connectedCallback(); @@ -44,35 +56,24 @@ export class UmbSearchModalElement extends LitElement { const target = event.target as HTMLInputElement; this._search = target.value; - this.#updateGroups(); + this.#updateSearchResults(); } #onClearSearch() { this._search = ''; this._input.value = ''; this._input.focus(); - this.#updateGroups(); + this.#updateSearchResults(); } - #updateGroups() { - const filtered = this.#mockData.filter((item) => { - return item.name.toLowerCase().includes(this._search.toLowerCase()); - }); - - const grouped: Array = filtered.reduce((acc, item) => { - const group = acc.find((group) => group.name === item.parent); - if (group) { - group.items.push(item); - } else { - acc.push({ - name: item.parent, - items: [item], - }); - } - return acc; - }, [] as Array); - - this._groups = grouped; + #updateSearchResults() { + if (this._search) { + this._searchResults = this.#mockApi.getDocuments.filter((item) => + item.name.toLowerCase().includes(this._search.toLowerCase()), + ); + } else { + this._searchResults = []; + } } render() { @@ -87,31 +88,38 @@ export class UmbSearchModalElement extends LitElement { type="text" placeholder="Search..." autocomplete="off" /> -
+
+ + ${this.#renderSearchTags()} ${this._search - ? html`
- ${this._groups.length > 0 - ? repeat( - this._groups, - (group) => group.name, - (group) => this.#renderGroup(group.name, group.items), - ) - : html`
Only mock data for now Search for blog
`} -
` + ? html`
${this._searchResults.length > 0 ? this.#renderResults() : this.#renderNoResults()}
` : nothing} `; } - #renderGroup(name: string, items: Array) { - return html` -
-
${name}
-
${repeat(items, (item) => item.name, this.#renderItem.bind(this))}
-
- `; + #renderSearchTags() { + return html`
+ ${repeat( + this.searchTags, + (provider) => provider, + (provider) => html`
${provider}
`, + )} +
`; + } + + #renderResults() { + return repeat( + this._searchResults, + (item) => item.name, + (item) => this.#renderItem(item), + ); + } + + #renderNoResults() { + return html`
Only mock data for now Search for blog
`; } #renderItem(item: SearchItem) { @@ -139,63 +147,77 @@ export class UmbSearchModalElement extends LitElement { `; } - #mockData: Array = [ - { - name: 'Blog', - href: '#', - icon: 'icon-thumbnail-list', - parent: 'Content', - url: '/blog/', - }, - { - name: 'Popular blogs', - href: '#', - icon: 'icon-article', - parent: 'Content', - url: '/blog/popular-blogs/', - }, - { - name: 'How to write a blog', - href: '#', - icon: 'icon-article', - parent: 'Content', - url: '/blog/how-to-write-a-blog/', - }, - { - name: 'Blog hero', - href: '#', - icon: 'icon-picture', - parent: 'Media', - }, - { - name: 'Contact form for blog', - href: '#', - parent: 'Document Types', - }, - { - name: 'Blog', - href: '#', - parent: 'Document Types', - }, - { - name: 'Blog link item', - href: '#', - parent: 'Document Types', - }, - ]; + #mockApi = { + getDocuments: [ + { + name: 'Blog', + href: '#', + icon: 'icon-thumbnail-list', + url: '/blog/', + }, + { + name: 'Popular blogs', + href: '#', + icon: 'icon-article', + url: '/blog/popular-blogs/', + }, + { + name: 'How to write a blog', + href: '#', + icon: 'icon-article', + url: '/blog/how-to-write-a-blog/', + }, + ], + getMedia: [ + { + name: 'Blog hero', + href: '#', + icon: 'icon-picture', + }, + ], + getDocumentTypes: [ + { + name: 'Contact form for blog', + href: '#', + }, + { + name: 'Blog', + href: '#', + }, + { + name: 'Blog link item', + href: '#', + }, + ], + }; static styles = [ UmbTextStyles, css` + #search-tags { + display: flex; + flex-wrap: wrap; + gap: var(--uui-size-space-2); + padding: 0 var(--uui-size-space-5); + padding-bottom: var(--uui-size-space-2); + } + .search-tag { + padding: var(--uui-size-space-3) var(--uui-size-space-4); + background: var(--uui-color-surface-alt); + line-height: 1; + white-space: nowrap; + border-radius: var(--uui-border-radius); + } :host { display: flex; flex-direction: column; - width: min(500px, 100vw); + width: min(600px, 100vw); height: 100%; - background-color: var(--uui-color-background); + background-color: var(--uui-color-surface); box-sizing: border-box; color: var(--uui-color-text); font-size: 1rem; + padding-bottom: var(--uui-size-space-2); } input { all: unset; @@ -236,31 +258,16 @@ export class UmbSearchModalElement extends LitElement { #main { display: flex; flex-direction: column; - padding: 0px var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-6); + /* padding: 0px var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-6); */ height: 100%; - border-top: 1px solid var(--uui-color-border); - } - .group { - margin-top: var(--uui-size-space-4); - } - .group-name { - font-weight: 600; - margin-bottom: var(--uui-size-space-1); - } - .group-items { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-3); } .item { background: var(--uui-color-surface); - border: 1px solid var(--uui-color-border); - padding: var(--uui-size-space-3) var(--uui-size-space-4); + padding: var(--uui-size-space-3) var(--uui-size-space-5); border-radius: var(--uui-border-radius); color: var(--uui-color-interactive); display: grid; grid-template-columns: var(--uui-size-space-6) 1fr var(--uui-size-space-5); - height: min-content; align-items: center; } .item:hover { @@ -309,6 +316,7 @@ export class UmbSearchModalElement extends LitElement { width: 100%; margin-top: var(--uui-size-space-5); color: var(--uui-color-text-alt); + margin: var(--uui-size-space-5) 0; } `, ]; From 66db0d876167a236b0bfb815882241ea224ebffa Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:25:10 +0200 Subject: [PATCH 003/323] designing --- .../search-modal/search-modal.element.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index a87ef068bf..f1aeb80b7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -44,6 +44,9 @@ export class UmbSearchModalElement extends LitElement { 'User Group', ]; + @state() + private _activeSearchTag = 'Document'; + connectedCallback() { super.connectedCallback(); @@ -104,8 +107,9 @@ export class UmbSearchModalElement extends LitElement { return html`
${repeat( this.searchTags, - (provider) => provider, - (provider) => html`
${provider}
`, + (searchTag) => searchTag, + (provider) => + html`
${provider}
`, )}
`; } @@ -207,6 +211,16 @@ export class UmbSearchModalElement extends LitElement { line-height: 1; white-space: nowrap; border-radius: var(--uui-border-radius); + color: var(--uui-color-interactive); + cursor: pointer; + } + .search-tag:hover { + background: var(--uui-color-surface-emphasis); + color: var(--uui-color-interactive-emphasis); + } + .search-tag.active { + background: var(--uui-color-surface-emphasis); + color: var(--uui-color-interactive-emphasis); } :host { display: flex; From da046825977a03af91b57739858f525a8a9fc678 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 09:58:08 +0200 Subject: [PATCH 004/323] init manifest --- .../core/extension-registry/models/index.ts | 21 +++++++++++-------- .../models/search-provider.model.ts | 17 +++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-provider.model.ts 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 5729a909c2..60c14d9ae9 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 @@ -61,6 +61,7 @@ import type { ManifestEntityUserPermission } from './entity-user-permission.mode import type { ManifestGranularUserPermission } from './user-granular-permission.model.js'; import type { ManifestCollectionAction } from './collection-action.model.js'; import type { ManifestMfaLoginProvider } from './mfa-login-provider.model.js'; +import type { ManifestSearchProvider } from './search-provider.model.js'; import type { ManifestBase, ManifestBundle, @@ -70,15 +71,16 @@ import type { export type * from './auth-provider.model.js'; export type * from './block-editor-custom-view.model.js'; -export type * from './collection.models.js'; export type * from './collection-action.model.js'; export type * from './collection-view.model.js'; +export type * from './collection.models.js'; export type * from './current-user-action.model.js'; export type * from './dashboard-collection.model.js'; export type * from './dashboard.model.js'; export type * from './dynamic-root.model.js'; export type * from './entity-action.model.js'; export type * from './entity-bulk-action.model.js'; +export type * from './entity-user-permission.model.js'; export type * from './external-login-provider.model.js'; export type * from './global-context.model.js'; export type * from './header-app.model.js'; @@ -92,6 +94,7 @@ export type * from './package-view.model.js'; export type * from './property-action.model.js'; export type * from './property-editor.model.js'; export type * from './repository.model.js'; +export type * from './search-provider.model.js'; export type * from './section-sidebar-app.model.js'; export type * from './section-view.model.js'; export type * from './section.model.js'; @@ -101,10 +104,9 @@ export type * from './tinymce-plugin.model.js'; export type * from './tree-item.model.js'; export type * from './tree.model.js'; export type * from './user-granular-permission.model.js'; -export type * from './entity-user-permission.model.js'; export type * from './user-profile-app.model.js'; -export type * from './workspace-action.model.js'; export type * from './workspace-action-menu-item.model.js'; +export type * from './workspace-action.model.js'; export type * from './workspace-context.model.js'; export type * from './workspace-footer-app.model.js'; export type * from './workspace-view.model.js'; @@ -140,27 +142,30 @@ export type ManifestWorkspaceViews = ManifestWorkspaceView | ManifestWorkspaceVi export type ManifestTypes = | ManifestAuthProvider - | ManifestBundle | ManifestBlockEditorCustomView + | ManifestBundle | ManifestCollection - | ManifestCollectionView | ManifestCollectionAction + | ManifestCollectionView + | ManifestCondition | ManifestCurrentUserAction | ManifestCurrentUserActionDefaultKind - | ManifestCondition | ManifestDashboard | ManifestDashboardCollection | ManifestDynamicRootOrigin | ManifestDynamicRootQueryStep | ManifestEntityActions | ManifestEntityBulkAction + | ManifestEntityUserPermission | ManifestEntryPoint | ManifestExternalLoginProvider | ManifestGlobalContext + | ManifestGranularUserPermission | ManifestHeaderApp | ManifestHeaderAppButtonKind | ManifestHealthCheck | ManifestItemStore + | ManifestLocalization | ManifestMenu | ManifestMenuItem | ManifestMenuItemTreeKind @@ -171,6 +176,7 @@ export type ManifestTypes = | ManifestPropertyEditorSchema | ManifestPropertyEditorUi | ManifestRepository + | ManifestSearchProvider | ManifestSection | ManifestSectionSidebarApp | ManifestSectionSidebarAppMenuKind @@ -178,7 +184,6 @@ export type ManifestTypes = | ManifestStore | ManifestTheme | ManifestTinyMcePlugin - | ManifestLocalization | ManifestTree | ManifestTreeItem | ManifestTreeStore @@ -189,6 +194,4 @@ export type ManifestTypes = | ManifestWorkspaceFooterApps | ManifestWorkspaces | ManifestWorkspaceViews - | ManifestEntityUserPermission - | ManifestGranularUserPermission | ManifestBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-provider.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-provider.model.ts new file mode 100644 index 0000000000..c59704ef48 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-provider.model.ts @@ -0,0 +1,17 @@ +import type { ManifestApi } from '@umbraco-cms/backoffice/extension-api'; + +/** + * Represents an search provider that can be used to search. + */ +export interface ManifestSearchProvider extends ManifestApi { + type: 'searchProvider'; + + meta?: MetaSearchProvider; +} + +export interface MetaSearchProvider { + /** + * The label of the provider that is shown to the user. + */ + label?: string; +} From 9fcb5e5e315383a7432323e6919ac6d79a1ab3df Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 09:58:18 +0200 Subject: [PATCH 005/323] work --- .../search-modal/search-modal.element.ts | 48 +++++++------------ 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index f1aeb80b7d..b764ed2d4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -62,11 +62,8 @@ export class UmbSearchModalElement extends LitElement { this.#updateSearchResults(); } - #onClearSearch() { - this._search = ''; - this._input.value = ''; - this._input.focus(); - this.#updateSearchResults(); + #onSearchTagClick(tag: string) { + this._activeSearchTag = tag; } #updateSearchResults() { @@ -91,9 +88,6 @@ export class UmbSearchModalElement extends LitElement { type="text" placeholder="Search..." autocomplete="off" /> - ${this.#renderSearchTags()} @@ -108,8 +102,13 @@ export class UmbSearchModalElement extends LitElement { ${repeat( this.searchTags, (searchTag) => searchTag, - (provider) => - html`
${provider}
`, + (searchTag) => + html``, )} `; } @@ -213,6 +212,7 @@ export class UmbSearchModalElement extends LitElement { border-radius: var(--uui-border-radius); color: var(--uui-color-interactive); cursor: pointer; + border: 2px solid transparent; } .search-tag:hover { background: var(--uui-color-surface-emphasis); @@ -221,6 +221,7 @@ export class UmbSearchModalElement extends LitElement { .search-tag.active { background: var(--uui-color-surface-emphasis); color: var(--uui-color-interactive-emphasis); + border-color: var(--uui-color-focus); } :host { display: flex; @@ -238,32 +239,18 @@ export class UmbSearchModalElement extends LitElement { height: 100%; width: 100%; } - #search-icon, - #close-icon { + button { + font-family: unset; + font-size: unset; + cursor: pointer; + } + #search-icon { display: flex; align-items: center; justify-content: center; aspect-ratio: 1; height: 100%; } - #close-icon { - padding: 0 var(--uui-size-space-4); - } - #close-icon > button { - background: var(--uui-color-surface-alt); - border: 1px solid var(--uui-color-border); - padding: 3px 6px 4px 6px; - line-height: 1; - border-radius: 3px; - color: var(--uui-color-text-alt); - font-weight: 800; - font-size: 12px; - cursor: pointer; - } - #close-icon > button:hover { - border-color: var(--uui-color-focus); - color: var(--uui-color-focus); - } #top { background-color: var(--uui-color-surface); display: flex; @@ -272,7 +259,6 @@ export class UmbSearchModalElement extends LitElement { #main { display: flex; flex-direction: column; - /* padding: 0px var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-6); */ height: 100%; } .item { From 31648ac5d8e5f9191b1793c122bf632f02307bf3 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:24:31 +0200 Subject: [PATCH 006/323] manifests --- .../src/packages/data-type/manifests.ts | 14 +++++++------ .../search/data-type.search-provider.ts | 11 ++++++++++ .../packages/data-type/search/manifests.ts | 14 +++++++++++++ .../packages/documents/documents/manifests.ts | 10 ++++++---- .../search/document.search-provider.ts | 11 ++++++++++ .../documents/documents/search/manifests.ts | 14 +++++++++++++ .../search-modal/search-modal.element.ts | 20 ++++++++++++++++++- 7 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/data-type/search/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/manifests.ts index 907c67310c..06dbf00ad2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/manifests.ts @@ -1,17 +1,19 @@ +import { manifests as collectionManifests } from './collection/manifests.js'; import { manifests as entityActions } from './entity-actions/manifests.js'; -import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as menuManifests } from './menu/manifests.js'; +import { manifests as modalManifests } from './modals/manifests.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as searchProviderManifests } from './search/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; -import { manifests as modalManifests } from './modals/manifests.js'; -import { manifests as collectionManifests } from './collection/manifests.js'; export const manifests = [ + ...collectionManifests, ...entityActions, - ...repositoryManifests, ...menuManifests, + ...modalManifests, + ...repositoryManifests, + ...searchProviderManifests, ...treeManifests, ...workspaceManifests, - ...modalManifests, - ...collectionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts new file mode 100644 index 0000000000..e29aed4eff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts @@ -0,0 +1,11 @@ +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDataTypeSearchProvider implements UmbApi { + constructor() { + console.log('UmbDataTypeSearchProvider hello world'); + } + + destroy(): void { + throw new Error('Method not implemented.'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/manifests.ts new file mode 100644 index 0000000000..3b79a769dc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/manifests.ts @@ -0,0 +1,14 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + name: 'Data Type Search Provider', + alias: 'Umb.SearchProvider.DataType', + type: 'searchProvider', + api: () => import('./data-type.search-provider.js'), + weight: 900, + meta: { + label: 'Data Types', + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts index 1d2db8ffa2..2718c6c38e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts @@ -1,29 +1,31 @@ import { manifests as collectionManifests } from './collection/manifests.js'; import { manifests as entityActionManifests } from './entity-actions/manifests.js'; import { manifests as entityBulkActionManifests } from './entity-bulk-actions/manifests.js'; -import { manifests as modalManifests } from './modals/manifests.js'; +import { manifests as globalContextManifests } from './global-contexts/manifests.js'; import { manifests as menuManifests } from './menu/manifests.js'; +import { manifests as modalManifests } from './modals/manifests.js'; import { manifests as propertyEditorManifests } from './property-editors/manifests.js'; import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as searchProviderManifests } from './search/manifests.js'; import { manifests as trackedReferenceManifests } from './reference/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as userPermissionManifests } from './user-permissions/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; -import { manifests as globalContextManifests } from './global-contexts/manifests.js'; export const manifests = [ ...collectionManifests, ...entityActionManifests, ...entityBulkActionManifests, - ...modalManifests, + ...globalContextManifests, ...menuManifests, + ...modalManifests, ...propertyEditorManifests, ...recycleBinManifests, ...repositoryManifests, + ...searchProviderManifests, ...trackedReferenceManifests, ...treeManifests, ...userPermissionManifests, ...workspaceManifests, - ...globalContextManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts new file mode 100644 index 0000000000..23bbc2ab10 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts @@ -0,0 +1,11 @@ +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDocumentSearchProvider implements UmbApi { + constructor() { + console.log('UmbDocumentSearchProvider hello world'); + } + + destroy(): void { + throw new Error('Method not implemented.'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts new file mode 100644 index 0000000000..3aea6f690d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts @@ -0,0 +1,14 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + name: 'Document Search Provider', + alias: 'Umb.SearchProvider.Document', + type: 'searchProvider', + api: () => import('./document.search-provider.js'), + weight: 1000, + meta: { + label: 'Documents', + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index b764ed2d4b..85d7dbff70 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -9,6 +9,9 @@ import { query, state, } from '@umbraco-cms/backoffice/external/lit'; +import { ManifestSearchProvider, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; export type SearchItem = { name: string; @@ -21,7 +24,7 @@ export type SearchGroupItem = { items: Array; }; @customElement('umb-search-modal') -export class UmbSearchModalElement extends LitElement { +export class UmbSearchModalElement extends UmbLitElement { @query('input') private _input!: HTMLInputElement; @@ -47,6 +50,21 @@ export class UmbSearchModalElement extends LitElement { @state() private _activeSearchTag = 'Document'; + /** + * + */ + constructor() { + super(); + + this.#observeViews(); + } + + #observeViews() { + return new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'searchProvider', null, (providers) => { + this.searchTags = providers.map((provider) => provider.manifest.meta?.label || provider.manifest.name); + }); + } + connectedCallback() { super.connectedCallback(); From 2972cb82098bd930a58a12af002fb738f7aac141 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:04:15 +0200 Subject: [PATCH 007/323] search provider extension --- .../search/data-type.search-provider.ts | 6 +++ .../search/document-search.repository.ts | 19 +++++++ .../search/document.search-provider.ts | 13 +++-- .../documents/documents/search/manifests.ts | 9 ++++ .../search/rollback.server.data-source.ts | 37 ++++++++++++++ .../documents/documents/search/types.ts | 3 ++ .../search-modal/search-modal.element.ts | 50 +++++++++++++------ 7 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts index e29aed4eff..4a13750fd6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts @@ -5,7 +5,13 @@ export class UmbDataTypeSearchProvider implements UmbApi { console.log('UmbDataTypeSearchProvider hello world'); } + search(): void { + alert('search'); + } + destroy(): void { throw new Error('Method not implemented.'); } } + +export { UmbDataTypeSearchProvider as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts new file mode 100644 index 0000000000..8d4c9e4d53 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts @@ -0,0 +1,19 @@ +import { UmbDocumentSearchServerDataSource } from './rollback.server.data-source.js'; +import type { UmbSearchRequestArgs } from './types.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDocumentSearchRepository extends UmbControllerBase implements UmbApi { + #dataSource: UmbDocumentSearchServerDataSource; + + constructor(host: UmbControllerHost) { + super(host); + + this.#dataSource = new UmbDocumentSearchServerDataSource(this); + } + + async search(args: UmbSearchRequestArgs) { + return await this.#dataSource.search(args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts index 23bbc2ab10..4072442ab3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts @@ -1,11 +1,18 @@ +import { UmbDocumentSearchRepository } from './document-search.repository.js'; +import type { UmbSearchRequestArgs } from './types.js'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export class UmbDocumentSearchProvider implements UmbApi { - constructor() { - console.log('UmbDocumentSearchProvider hello world'); +export class UmbDocumentSearchProvider extends UmbControllerBase implements UmbApi { + #repository = new UmbDocumentSearchRepository(this); + + search(args: UmbSearchRequestArgs) { + return this.#repository.search(args); } destroy(): void { throw new Error('Method not implemented.'); } } + +export { UmbDocumentSearchProvider as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts index 3aea6f690d..e138c643cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts @@ -11,4 +11,13 @@ export const manifests: Array = [ label: 'Documents', }, }, + { + name: 'Document Search Result Item ', + alias: 'Umb.SearchResultItem.Document', + type: 'searchResultItem', + element: () => import('./document-search-result-item.element.js'), + meta: { + label: 'Documents', + }, + }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts new file mode 100644 index 0000000000..05e7649eed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts @@ -0,0 +1,37 @@ +import type { UmbSearchRequestArgs } from './types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Rollback that fetches data from the server + * @export + * @class UmbDocumentSearchServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentSearchServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentSearchServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentSearchServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get a list of versions for a document + * @return {*} + * @memberof UmbDocumentSearchServerDataSource + */ + search(args: UmbSearchRequestArgs) { + return tryExecuteAndNotify( + this.#host, + DocumentService.getItemDocumentSearch({ + query: args.query, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/types.ts new file mode 100644 index 0000000000..20267d66ab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/types.ts @@ -0,0 +1,3 @@ +export type UmbSearchRequestArgs = { + query: string; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 85d7dbff70..6c8b403142 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -11,7 +11,7 @@ import { } from '@umbraco-cms/backoffice/external/lit'; import { ManifestSearchProvider, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; export type SearchItem = { name: string; @@ -50,6 +50,15 @@ export class UmbSearchModalElement extends UmbLitElement { @state() private _activeSearchTag = 'Document'; + @state() + private _searchProviders: Array<{ + name: string; + providerPromise: any; + alias: string; + }> = []; + + #currentProvider: any; + /** * */ @@ -60,8 +69,12 @@ export class UmbSearchModalElement extends UmbLitElement { } #observeViews() { - return new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'searchProvider', null, (providers) => { - this.searchTags = providers.map((provider) => provider.manifest.meta?.label || provider.manifest.name); + new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'searchProvider', null, (providers) => { + this._searchProviders = providers.map((provider) => ({ + name: provider.manifest.meta?.label || provider.manifest.name, + providerPromise: createExtensionApi(this, provider.manifest), + alias: provider.alias, + })); }); } @@ -80,15 +93,24 @@ export class UmbSearchModalElement extends UmbLitElement { this.#updateSearchResults(); } - #onSearchTagClick(tag: string) { - this._activeSearchTag = tag; + async #onSearchTagClick(searchProvider: any) { + console.log(searchProvider); + const api = await searchProvider.providerPromise; + + this.#currentProvider = api; + this._activeSearchTag = searchProvider.alias; } #updateSearchResults() { if (this._search) { - this._searchResults = this.#mockApi.getDocuments.filter((item) => - item.name.toLowerCase().includes(this._search.toLowerCase()), - ); + const { data, error } = this.#currentProvider.search({ + query: this._search, + }); + + console.log(data, error); + // this._searchResults = this.#mockApi.getDocuments.filter((item) => + // item.name.toLowerCase().includes(this._search.toLowerCase()), + // ); } else { this._searchResults = []; } @@ -118,14 +140,14 @@ export class UmbSearchModalElement extends UmbLitElement { #renderSearchTags() { return html`
${repeat( - this.searchTags, - (searchTag) => searchTag, - (searchTag) => + this._searchProviders, + (searchProvider) => searchProvider, + (searchProvider) => html``, )}
`; From a27ff6ef045b5b9d53130718cbcb06b00b7672b8 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:37:28 +0200 Subject: [PATCH 008/323] document search --- .../core/extension-registry/models/index.ts | 3 ++ .../models/search-result-item.model.ts | 9 +++++ .../document-search-result-item.element.ts | 22 ++++++++++ .../search/document-search.repository.ts | 6 +-- ... => document-search.server.data-source.ts} | 33 ++++++++++++++- .../documents/documents/search/manifests.ts | 5 +-- .../search-modal/search-modal.element.ts | 40 ++++++++++--------- .../search-result-item.element.ts | 21 ++++++++++ 8 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-result-item.model.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/{rollback.server.data-source.ts => document-search.server.data-source.ts} (50%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts 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 60c14d9ae9..d01657f8ef 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 @@ -62,6 +62,7 @@ import type { ManifestGranularUserPermission } from './user-granular-permission. import type { ManifestCollectionAction } from './collection-action.model.js'; import type { ManifestMfaLoginProvider } from './mfa-login-provider.model.js'; import type { ManifestSearchProvider } from './search-provider.model.js'; +import type { ManifestSearchResultItem } from './search-result-item.model.js'; import type { ManifestBase, ManifestBundle, @@ -95,6 +96,7 @@ export type * from './property-action.model.js'; export type * from './property-editor.model.js'; export type * from './repository.model.js'; export type * from './search-provider.model.js'; +export type * from './search-result-item.model.js'; export type * from './section-sidebar-app.model.js'; export type * from './section-view.model.js'; export type * from './section.model.js'; @@ -177,6 +179,7 @@ export type ManifestTypes = | ManifestPropertyEditorUi | ManifestRepository | ManifestSearchProvider + | ManifestSearchResultItem | ManifestSection | ManifestSectionSidebarApp | ManifestSectionSidebarAppMenuKind diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-result-item.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-result-item.model.ts new file mode 100644 index 0000000000..26d3b338d1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/search-result-item.model.ts @@ -0,0 +1,9 @@ +import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api'; + +/** + * Represents a search result element. + */ +export interface ManifestSearchResultItem extends ManifestElement { + type: 'searchResultItem'; + forEntityTypes: Array; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts new file mode 100644 index 0000000000..e016ddf597 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts @@ -0,0 +1,22 @@ +import type { UmbDocumentItemModel } from '../repository/index.js'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; + +const elementName = 'umb-document-search-result-item'; +@customElement(elementName) +export class UmbDocumentSearchResultItemElement extends UmbLitElement { + @property({ attribute: false }) + item?: UmbDocumentItemModel; + + render() { + return html`HELLO WORLD ${this.item?.unique}`; + } +} + +export { UmbDocumentSearchResultItemElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbDocumentSearchResultItemElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts index 8d4c9e4d53..a852a74409 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts @@ -1,4 +1,4 @@ -import { UmbDocumentSearchServerDataSource } from './rollback.server.data-source.js'; +import { UmbDocumentSearchServerDataSource } from './document-search.server.data-source.js'; import type { UmbSearchRequestArgs } from './types.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -13,7 +13,7 @@ export class UmbDocumentSearchRepository extends UmbControllerBase implements Um this.#dataSource = new UmbDocumentSearchServerDataSource(this); } - async search(args: UmbSearchRequestArgs) { - return await this.#dataSource.search(args); + search(args: UmbSearchRequestArgs) { + return this.#dataSource.search(args); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts similarity index 50% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts index 05e7649eed..ae8446097a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/rollback.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts @@ -2,6 +2,7 @@ import type { UmbSearchRequestArgs } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; /** * A data source for the Rollback that fetches data from the server @@ -26,12 +27,40 @@ export class UmbDocumentSearchServerDataSource { * @return {*} * @memberof UmbDocumentSearchServerDataSource */ - search(args: UmbSearchRequestArgs) { - return tryExecuteAndNotify( + async search(args: UmbSearchRequestArgs) { + const { data, error } = await tryExecuteAndNotify( this.#host, DocumentService.getItemDocumentSearch({ query: args.query, }), ); + + if (data) { + const mappedItems = data.items.map((item) => { + return { + entityType: UMB_DOCUMENT_ENTITY_TYPE, + unique: item.id, + isTrashed: item.isTrashed, + isProtected: item.isProtected, + 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. + }; + }); + + return { data: { items: mappedItems, total: data.total } }; + } + + return { error }; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts index e138c643cd..4420f0747f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -16,8 +17,6 @@ export const manifests: Array = [ alias: 'Umb.SearchResultItem.Document', type: 'searchResultItem', element: () => import('./document-search-result-item.element.js'), - meta: { - label: 'Documents', - }, + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 6c8b403142..dc3df95850 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -1,23 +1,14 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { - css, - html, - LitElement, - nothing, - repeat, - customElement, - query, - state, -} from '@umbraco-cms/backoffice/external/lit'; -import { ManifestSearchProvider, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { css, html, nothing, repeat, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; +import type { ManifestSearchResultItem } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import './search-result-item.element.js'; + export type SearchItem = { - name: string; - icon?: string; - href: string; - url?: string; + entityType: string; }; export type SearchGroupItem = { name: string; @@ -101,13 +92,19 @@ export class UmbSearchModalElement extends UmbLitElement { this._activeSearchTag = searchProvider.alias; } - #updateSearchResults() { + async #updateSearchResults() { if (this._search) { - const { data, error } = this.#currentProvider.search({ + const { data, error } = await this.#currentProvider.search({ query: this._search, }); - console.log(data, error); + console.log('data', data); + + if (!data) return; + + this._searchResults = data.items; + + console.log('reults', this._searchResults); // this._searchResults = this.#mockApi.getDocuments.filter((item) => // item.name.toLowerCase().includes(this._search.toLowerCase()), // ); @@ -166,6 +163,13 @@ export class UmbSearchModalElement extends UmbLitElement { } #renderItem(item: SearchItem) { + return html` + manifest.forEntityTypes.includes(item.entityType)} + default-element="umb-search-result-item"> + `; return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts new file mode 100644 index 0000000000..fee8a881de --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts @@ -0,0 +1,21 @@ +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; + +const elementName = 'umb-search-result-item'; +@customElement(elementName) +export class UmbSearchResultItemElement extends UmbLitElement { + @property({ type: Object }) + item: any; + + render() { + return html`Helloasasdas`; + } +} + +export { UmbSearchResultItemElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbSearchResultItemElement; + } +} From 2fa9aee666b4ede337805b2c1f33b5120b1a3fee Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:44:54 +0200 Subject: [PATCH 009/323] search result --- src/Umbraco.Web.UI.Client/package.json | 1 + .../document-search-result-item.element.ts | 24 ++++++++++--- .../src/packages/search/index.ts | 1 + .../search-modal/search-modal.element.ts | 2 +- .../search-result-item.element.ts | 21 ----------- .../search-result-item.element.ts | 36 +++++++++++++++++++ .../src/packages/search/types.ts | 5 +++ src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 8 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/search/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/search/types.ts diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 8b9792bc73..e8ea2524c6 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -68,6 +68,7 @@ "./repository": "./dist-cms/packages/core/repository/index.js", "./resources": "./dist-cms/packages/core/resources/index.js", "./router": "./dist-cms/packages/core/router/index.js", + "./search": "./dist-cms/packages/search/index.js", "./section": "./dist-cms/packages/core/section/index.js", "./server-file-system": "./dist-cms/packages/core/server-file-system/index.js", "./sorter": "./dist-cms/packages/core/sorter/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts index e016ddf597..8e1556711a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts @@ -1,16 +1,30 @@ -import type { UmbDocumentItemModel } from '../repository/index.js'; +import type { UmbSearchResultItemModel } from '@umbraco-cms/backoffice/search'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; const elementName = 'umb-document-search-result-item'; @customElement(elementName) export class UmbDocumentSearchResultItemElement extends UmbLitElement { - @property({ attribute: false }) - item?: UmbDocumentItemModel; + @property({ type: Object }) + item?: UmbSearchResultItemModel; render() { - return html`HELLO WORLD ${this.item?.unique}`; + return html` +
ICON
+
${this.item?.name}
+ `; } + + static styles = [ + UmbTextStyles, + css` + :host { + display: flex; + gap: 12px; + } + `, + ]; } export { UmbDocumentSearchResultItemElement as element }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/index.ts b/src/Umbraco.Web.UI.Client/src/packages/search/index.ts new file mode 100644 index 0000000000..9b7dfb03df --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/search/index.ts @@ -0,0 +1 @@ +export { type UmbSearchResultItemModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index dc3df95850..52fc2f1b33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -5,7 +5,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; -import './search-result-item.element.js'; +import '../search-result/search-result-item.element.js'; export type SearchItem = { entityType: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts deleted file mode 100644 index fee8a881de..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-result-item.element.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; - -const elementName = 'umb-search-result-item'; -@customElement(elementName) -export class UmbSearchResultItemElement extends UmbLitElement { - @property({ type: Object }) - item: any; - - render() { - return html`Helloasasdas`; - } -} - -export { UmbSearchResultItemElement as element }; - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbSearchResultItemElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts new file mode 100644 index 0000000000..103fa70187 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts @@ -0,0 +1,36 @@ +import type { UmbSearchResultItemModel } from '../types.js'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; + +const elementName = 'umb-search-result-item'; +@customElement(elementName) +export class UmbSearchResultItemElement extends UmbLitElement { + @property({ type: Object }) + item?: UmbSearchResultItemModel; + + render() { + return html` +
ICON
+
${this.item?.name}
+ `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: flex; + gap: 12px; + } + `, + ]; +} + +export { UmbSearchResultItemElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbSearchResultItemElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/types.ts b/src/Umbraco.Web.UI.Client/src/packages/search/types.ts new file mode 100644 index 0000000000..e4952bdd42 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/search/types.ts @@ -0,0 +1,5 @@ +export type UmbSearchResultItemModel = { + icon?: string; + name: string; + unique: string; +}; diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index eee2db6359..736aea9e17 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -86,6 +86,7 @@ "@umbraco-cms/backoffice/repository": ["./src/packages/core/repository/index.ts"], "@umbraco-cms/backoffice/resources": ["./src/packages/core/resources/index.ts"], "@umbraco-cms/backoffice/router": ["./src/packages/core/router/index.ts"], + "@umbraco-cms/backoffice/search": ["./src/packages/search/index.ts"], "@umbraco-cms/backoffice/section": ["./src/packages/core/section/index.ts"], "@umbraco-cms/backoffice/server-file-system": ["./src/packages/core/server-file-system/index.ts"], "@umbraco-cms/backoffice/sorter": ["./src/packages/core/sorter/index.ts"], From b66b336c915cdd4b6f3e1f07ef7cc538a4ce3cbe Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:06:37 +0200 Subject: [PATCH 010/323] default search item --- .../document-search-result-item.element.ts | 36 ---- .../documents/documents/search/manifests.ts | 1 - .../search-modal/search-modal.element.ts | 157 ++---------------- .../search-result-item.element.ts | 74 ++++++++- .../src/packages/search/types.ts | 1 + 5 files changed, 86 insertions(+), 183 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts deleted file mode 100644 index 8e1556711a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { UmbSearchResultItemModel } from '@umbraco-cms/backoffice/search'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; - -const elementName = 'umb-document-search-result-item'; -@customElement(elementName) -export class UmbDocumentSearchResultItemElement extends UmbLitElement { - @property({ type: Object }) - item?: UmbSearchResultItemModel; - - render() { - return html` -
ICON
-
${this.item?.name}
- `; - } - - static styles = [ - UmbTextStyles, - css` - :host { - display: flex; - gap: 12px; - } - `, - ]; -} - -export { UmbDocumentSearchResultItemElement as element }; - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbDocumentSearchResultItemElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts index 4420f0747f..1514c91f3a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/manifests.ts @@ -16,7 +16,6 @@ export const manifests: Array = [ name: 'Document Search Result Item ', alias: 'Umb.SearchResultItem.Document', type: 'searchResultItem', - element: () => import('./document-search-result-item.element.js'), forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 52fc2f1b33..81bde5a234 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -1,3 +1,4 @@ +import type { UmbSearchResultItemModel } from '../types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, repeat, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestSearchResultItem } from '@umbraco-cms/backoffice/extension-registry'; @@ -7,13 +8,6 @@ import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-c import '../search-result/search-result-item.element.js'; -export type SearchItem = { - entityType: string; -}; -export type SearchGroupItem = { - name: string; - items: Array; -}; @customElement('umb-search-modal') export class UmbSearchModalElement extends UmbLitElement { @query('input') @@ -23,7 +17,7 @@ export class UmbSearchModalElement extends UmbLitElement { private _search = ''; @state() - private _searchResults: Array = []; + private _searchResults: Array = []; @state() private searchTags: Array = [ @@ -94,20 +88,9 @@ export class UmbSearchModalElement extends UmbLitElement { async #updateSearchResults() { if (this._search) { - const { data, error } = await this.#currentProvider.search({ - query: this._search, - }); - - console.log('data', data); - + const { data } = await this.#currentProvider.search({ query: this._search }); if (!data) return; - this._searchResults = data.items; - - console.log('reults', this._searchResults); - // this._searchResults = this.#mockApi.getDocuments.filter((item) => - // item.name.toLowerCase().includes(this._search.toLowerCase()), - // ); } else { this._searchResults = []; } @@ -135,7 +118,7 @@ export class UmbSearchModalElement extends UmbLitElement { } #renderSearchTags() { - return html`
+ return html`
${repeat( this._searchProviders, (searchProvider) => searchProvider, @@ -143,7 +126,7 @@ export class UmbSearchModalElement extends UmbLitElement { html``, )} @@ -153,16 +136,12 @@ export class UmbSearchModalElement extends UmbLitElement { #renderResults() { return repeat( this._searchResults, - (item) => item.name, - (item) => this.#renderItem(item), + (item) => item.unique, + (item) => this.#renderResultItem(item), ); } - #renderNoResults() { - return html`
Only mock data for now Search for blog
`; - } - - #renderItem(item: SearchItem) { + #renderResultItem(item: UmbSearchResultItemModel) { return html` manifest.forEntityTypes.includes(item.entityType)} default-element="umb-search-result-item"> `; - return html` -
- - ${item.icon ? html`` : this.#renderHashTag()} - - - ${item.name} ${item.url ? html`${item.url}` : nothing} - - > - - `; } - #renderHashTag() { - return html` - - - - - `; + #renderNoResults() { + return html`
Only mock data for now Search for blog
`; } - #mockApi = { - getDocuments: [ - { - name: 'Blog', - href: '#', - icon: 'icon-thumbnail-list', - url: '/blog/', - }, - { - name: 'Popular blogs', - href: '#', - icon: 'icon-article', - url: '/blog/popular-blogs/', - }, - { - name: 'How to write a blog', - href: '#', - icon: 'icon-article', - url: '/blog/how-to-write-a-blog/', - }, - ], - getMedia: [ - { - name: 'Blog hero', - href: '#', - icon: 'icon-picture', - }, - ], - getDocumentTypes: [ - { - name: 'Contact form for blog', - href: '#', - }, - { - name: 'Blog', - href: '#', - }, - { - name: 'Blog link item', - href: '#', - }, - ], - }; - static styles = [ UmbTextStyles, css` - #search-tags { + #search-providers { display: flex; flex-wrap: wrap; gap: var(--uui-size-space-2); padding: 0 var(--uui-size-space-5); padding-bottom: var(--uui-size-space-2); } - .search-tag { + .search-provider { padding: var(--uui-size-space-3) var(--uui-size-space-4); background: var(--uui-color-surface-alt); line-height: 1; @@ -258,11 +175,11 @@ export class UmbSearchModalElement extends UmbLitElement { cursor: pointer; border: 2px solid transparent; } - .search-tag:hover { + .search-provider:hover { background: var(--uui-color-surface-emphasis); color: var(--uui-color-interactive-emphasis); } - .search-tag.active { + .search-provider.active { background: var(--uui-color-surface-emphasis); color: var(--uui-color-interactive-emphasis); border-color: var(--uui-color-focus); @@ -305,52 +222,6 @@ export class UmbSearchModalElement extends UmbLitElement { flex-direction: column; height: 100%; } - .item { - background: var(--uui-color-surface); - padding: var(--uui-size-space-3) var(--uui-size-space-5); - border-radius: var(--uui-border-radius); - color: var(--uui-color-interactive); - display: grid; - grid-template-columns: var(--uui-size-space-6) 1fr var(--uui-size-space-5); - align-items: center; - } - .item:hover { - background-color: var(--uui-color-surface-emphasis); - color: var(--uui-color-interactive-emphasis); - } - .item:hover .item-symbol { - font-weight: unset; - opacity: 1; - } - .item-icon { - margin-bottom: auto; - margin-top: 5px; - } - .item-icon, - .item-symbol { - opacity: 0.4; - } - .item-url { - font-size: 0.8rem; - line-height: 1.2; - font-weight: 100; - } - .item-name { - display: flex; - flex-direction: column; - } - .item-icon > * { - height: 1rem; - display: flex; - width: min-content; - } - .item-symbol { - font-weight: 100; - } - a { - text-decoration: none; - color: inherit; - } #no-results { display: flex; flex-direction: column; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts index 103fa70187..41a9b41b09 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-result/search-result-item.element.ts @@ -1,6 +1,6 @@ import type { UmbSearchResultItemModel } from '../types.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, nothing, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; const elementName = 'umb-search-result-item'; @@ -10,9 +10,29 @@ export class UmbSearchResultItemElement extends UmbLitElement { item?: UmbSearchResultItemModel; render() { + if (!this.item) return nothing; + + const url = 'url/goes/here'; + return html` -
ICON
-
${this.item?.name}
+ + + ${this.item.icon ? html`` : this.#renderHashTag()} + + ${this.item.name} ${url ? html`${url}` : nothing} + > + + `; + } + + #renderHashTag() { + return html` + + + + `; } @@ -22,6 +42,54 @@ export class UmbSearchResultItemElement extends UmbLitElement { :host { display: flex; gap: 12px; + width: 100%; + } + .item { + background: var(--uui-color-surface); + padding: var(--uui-size-space-3) var(--uui-size-space-5); + border-radius: var(--uui-border-radius); + color: var(--uui-color-interactive); + display: grid; + grid-template-columns: var(--uui-size-space-6) 1fr var(--uui-size-space-5); + align-items: center; + width: 100%; + } + .item:hover { + background-color: var(--uui-color-surface-emphasis); + color: var(--uui-color-interactive-emphasis); + } + .item:hover .item-symbol { + font-weight: unset; + opacity: 1; + } + .item-icon { + margin-bottom: auto; + margin-top: 5px; + } + .item-icon, + .item-symbol { + opacity: 0.4; + } + .item-url { + font-size: 0.8rem; + line-height: 1.2; + font-weight: 100; + } + .item-name { + display: flex; + flex-direction: column; + } + .item-icon > * { + height: 1rem; + display: flex; + width: min-content; + } + .item-symbol { + font-weight: 100; + } + a { + text-decoration: none; + color: inherit; } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/types.ts b/src/Umbraco.Web.UI.Client/src/packages/search/types.ts index e4952bdd42..1967a24bf4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/types.ts @@ -1,4 +1,5 @@ export type UmbSearchResultItemModel = { + entityType: string; icon?: string; name: string; unique: string; From 9f37bebdbe1d089deb5444f7271791d072046353 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:13:14 +0200 Subject: [PATCH 011/323] cleanup --- .../search-modal/search-modal.element.ts | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 81bde5a234..ca9192cfb2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -19,22 +19,6 @@ export class UmbSearchModalElement extends UmbLitElement { @state() private _searchResults: Array = []; - @state() - private searchTags: Array = [ - 'Data Type', - 'Document', - 'Document Type', - 'Media', - 'Media Type', - 'Member', - 'Member Type', - 'Users', - 'User Group', - ]; - - @state() - private _activeSearchTag = 'Document'; - @state() private _searchProviders: Array<{ name: string; @@ -42,7 +26,11 @@ export class UmbSearchModalElement extends UmbLitElement { alias: string; }> = []; - #currentProvider: any; + @state() + _currentProvider?: { + api: any; + alias: string; + }; /** * @@ -79,16 +67,16 @@ export class UmbSearchModalElement extends UmbLitElement { } async #onSearchTagClick(searchProvider: any) { - console.log(searchProvider); const api = await searchProvider.providerPromise; - - this.#currentProvider = api; - this._activeSearchTag = searchProvider.alias; + this._currentProvider = { + api, + alias: searchProvider.alias, + }; } async #updateSearchResults() { - if (this._search) { - const { data } = await this.#currentProvider.search({ query: this._search }); + if (this._search && this._currentProvider) { + const { data } = await this._currentProvider.api.search({ query: this._search }); if (!data) return; this._searchResults = data.items; } else { @@ -126,7 +114,7 @@ export class UmbSearchModalElement extends UmbLitElement { html``, )} @@ -152,7 +140,7 @@ export class UmbSearchModalElement extends UmbLitElement { } #renderNoResults() { - return html`
Only mock data for now Search for blog
`; + return html`
No results found
`; } static styles = [ From d03adace843e0c20da0a955e1cd58ce8c2a1eaa8 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:15:20 +0200 Subject: [PATCH 012/323] cleanup --- .../search/search-modal/search-modal.element.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index ca9192cfb2..4a7b57fdc8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -32,9 +32,6 @@ export class UmbSearchModalElement extends UmbLitElement { alias: string; }; - /** - * - */ constructor() { super(); @@ -55,10 +52,14 @@ export class UmbSearchModalElement extends UmbLitElement { super.connectedCallback(); requestAnimationFrame(() => { - this._input.focus(); + this.#focusInput(); }); } + #focusInput() { + this._input.focus(); + } + #onSearchChange(event: InputEvent) { const target = event.target as HTMLInputElement; this._search = target.value; @@ -72,6 +73,8 @@ export class UmbSearchModalElement extends UmbLitElement { api, alias: searchProvider.alias, }; + + this.#focusInput(); } async #updateSearchResults() { From ecb9857ae771b4afc20d59325924ea811c85ffc7 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:16:41 +0200 Subject: [PATCH 013/323] select first provider --- .../packages/search/search-modal/search-modal.element.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 4a7b57fdc8..fceaf940de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -45,6 +45,10 @@ export class UmbSearchModalElement extends UmbLitElement { providerPromise: createExtensionApi(this, provider.manifest), alias: provider.alias, })); + + if (this._searchProviders.length > 0) { + this.#setCurrentProvider(this._searchProviders[0]); + } }); } @@ -67,7 +71,7 @@ export class UmbSearchModalElement extends UmbLitElement { this.#updateSearchResults(); } - async #onSearchTagClick(searchProvider: any) { + async #setCurrentProvider(searchProvider: any) { const api = await searchProvider.providerPromise; this._currentProvider = { api, @@ -115,7 +119,7 @@ export class UmbSearchModalElement extends UmbLitElement { (searchProvider) => searchProvider, (searchProvider) => html`
`; } + #closeModal(event: MouseEvent | KeyboardEvent) { + if (event instanceof KeyboardEvent && event.key !== 'Enter') return; + this.modalContext?.reject(); + } + static styles = [ UmbTextStyles, css` @@ -430,6 +453,11 @@ export class UmbSearchModalElement extends UmbLitElement { outline-offset: -3px; display: flex; } + .search-item:focus { + outline: 2px solid var(--uui-color-interactive-emphasis); + border-radius: 6px; + outline-offset: -4px; + } .search-item.active:not(:focus-within) { outline: 2px solid var(--uui-color-border); border-radius: 6px; From b4c7b6b8132b7d58ea2b4008d4236fd0d751ea52 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:56:05 +0200 Subject: [PATCH 072/323] responsive --- .../src/packages/search/search-modal/search-modal.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 71adab12b8..ed2566b54f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -346,7 +346,8 @@ export class UmbSearchModalElement extends UmbLitElement { display: flex; flex-direction: column; width: min(610px, 100vw); - height: 80dvh; + height: max(600px, 80dvh); + max-height: 100dvh; background-color: var(--uui-color-surface); box-sizing: border-box; color: var(--uui-color-text); @@ -363,6 +364,7 @@ export class UmbSearchModalElement extends UmbLitElement { display: flex; flex-direction: column; height: 100%; + overflow: auto; } #search-providers { display: flex; From 3dfba7e3913cdc91ed6a74a7d5dd2355a09be681 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:08:04 +0200 Subject: [PATCH 073/323] document types --- .../documents/search/document-search.repository.ts | 8 ++++++-- .../search/document-search.server.data-source.ts | 7 ++++--- .../documents/search/document.search-provider.ts | 12 +++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts index 6a2f556a19..c5471d0e5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts @@ -1,10 +1,14 @@ import { UmbDocumentSearchServerDataSource } from './document-search.server.data-source.js'; -import type { UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; +import type { UmbDocumentSearchItemModel } from './document.search-provider.js'; +import type { UmbSearchRepository, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbDocumentSearchRepository extends UmbControllerBase implements UmbApi { +export class UmbDocumentSearchRepository + extends UmbControllerBase + implements UmbSearchRepository, UmbApi +{ #dataSource: UmbDocumentSearchServerDataSource; constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts index 46c99963cc..824dd544ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; -import type { UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; +import type { UmbDocumentSearchItemModel } from './document.search-provider.js'; +import type { UmbSearchDataSource, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,7 +11,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbDocumentSearchServerDataSource * @implements {RepositoryDetailDataSource} */ -export class UmbDocumentSearchServerDataSource { +export class UmbDocumentSearchServerDataSource implements UmbSearchDataSource { #host: UmbControllerHost; /** @@ -36,7 +37,7 @@ export class UmbDocumentSearchServerDataSource { ); if (data) { - const mappedItems = data.items.map((item) => { + const mappedItems: Array = data.items.map((item) => { return { href: '/section/content/workspace/document/edit/' + item.id, entityType: UMB_DOCUMENT_ENTITY_TYPE, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts index 760b37f3ce..7029cfba73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document.search-provider.ts @@ -1,9 +1,15 @@ +import type { UmbDocumentItemModel } from '../index.js'; import { UmbDocumentSearchRepository } from './document-search.repository.js'; -import type { UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; -import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +export interface UmbDocumentSearchItemModel extends UmbDocumentItemModel { + href: string; +} -export class UmbDocumentSearchProvider extends UmbControllerBase implements UmbApi { +export class UmbDocumentSearchProvider + extends UmbControllerBase + implements UmbSearchProvider +{ #repository = new UmbDocumentSearchRepository(this); search(args: UmbSearchRequestArgs) { From 9d6239fc7c5ebd6b9cb430bfaa29b75a32cc2e9e Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:08:18 +0200 Subject: [PATCH 074/323] media href --- .../media/media/search/media-search.server.data-source.ts | 1 + .../src/packages/media/media/search/media.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts index bc3a660932..21a2ae1858 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbMediaSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { + href: '/section/media/workspace/media/edit/' + item.id, entityType: UMB_MEDIA_ENTITY_TYPE, unique: item.id, isTrashed: item.isTrashed, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts index 89f3b95cfb..9b5655ec82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts @@ -3,7 +3,9 @@ import { UmbMediaSearchRepository } from './media-search.repository.js'; import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbMediaSearchItemModel extends UmbMediaItemModel {} +export interface UmbMediaSearchItemModel extends UmbMediaItemModel { + href: string; +} export class UmbMediaSearchProvider extends UmbControllerBase implements UmbSearchProvider { #repository = new UmbMediaSearchRepository(this); From 96e42e93b3f1a4b3fcb9c84ecbf767d7e9d0f645 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:09:19 +0200 Subject: [PATCH 075/323] data type href --- .../data-type/search/data-type-search.server.data-source.ts | 1 + .../packages/data-type/search/data-type.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type-search.server.data-source.ts index 2dcd9a55aa..20f021a3c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbDataTypeSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { + href: '/section/settings/workspace/data-type/edit/' + item.id, entityType: UMB_DATA_TYPE_ENTITY_TYPE, unique: item.id, name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts index a315d0904c..276e663587 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/search/data-type.search-provider.ts @@ -3,7 +3,9 @@ import { UmbDataTypeSearchRepository } from './data-type-search.repository.js'; import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbDataTypeSearchItemModel extends UmbDataTypeItemModel {} +export interface UmbDataTypeSearchItemModel extends UmbDataTypeItemModel { + href: string; +} export class UmbDataTypeSearchProvider extends UmbControllerBase From 261e0eee36005074b80d7aad3446091762b1f41a Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:10:13 +0200 Subject: [PATCH 076/323] document type href --- .../search/document-type-search.server.data-source.ts | 1 + .../document-types/search/document-type.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type-search.server.data-source.ts index 7b8c2c0f56..beb2bc9f0a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbDocumentTypeSearchServerDataSource implements UmbSearchDataSourc if (data) { const mappedItems: Array = data.items.map((item) => { return { + href: '/section/settings/workspace/document-type/edit/' + item.id, entityType: UMB_DOCUMENT_TYPE_ENTITY_TYPE, isElement: item.isElement, icon: item.icon, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type.search-provider.ts index 2d4a51bfc3..d70845fc0a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/search/document-type.search-provider.ts @@ -3,7 +3,9 @@ import { UmbDocumentTypeSearchRepository } from './document-type-search.reposito import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbDocumentTypeSearchItemModel extends UmbDocumentTypeItemModel {} +export interface UmbDocumentTypeSearchItemModel extends UmbDocumentTypeItemModel { + href: string; +} export class UmbDocumentTypeSearchProvider extends UmbControllerBase From 4f6378a064ced1409ad0146f3d7ef6b4f5507025 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:11:04 +0200 Subject: [PATCH 077/323] media type href --- .../search/media-type-search.server.data-source.ts | 1 + .../media/media-types/search/media-type.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type-search.server.data-source.ts index a05b50817a..b49edd53b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbMediaTypeSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { + href: '/section/settings/workspace/media-type/edit/' + item.id, entityType: UMB_MEDIA_TYPE_ENTITY_TYPE, unique: item.id, name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type.search-provider.ts index e85cc21cc8..746805fd58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/search/media-type.search-provider.ts @@ -3,7 +3,9 @@ import { UmbMediaTypeSearchRepository } from './media-type-search.repository.js' import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbMediaTypeSearchItemModel extends UmbMediaTypeItemModel {} +export interface UmbMediaTypeSearchItemModel extends UmbMediaTypeItemModel { + href: string; +} export class UmbMediaTypeSearchProvider extends UmbControllerBase From efd3995f127566c26d07d397605ed656843de48e Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:14:29 +0200 Subject: [PATCH 078/323] member href --- .../members/member/search/member-search.server.data-source.ts | 1 + .../packages/members/member/search/member.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member-search.server.data-source.ts index ec3ee432bd..b56ebd9dc6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbMemberSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { + href: '/section/member-management/workspace/member/edit/' + item.id, entityType: UMB_MEMBER_ENTITY_TYPE, unique: item.id, name: item.variants[0].name || '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member.search-provider.ts index 99ec93e170..535a812f31 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/search/member.search-provider.ts @@ -3,7 +3,9 @@ import { UmbMemberSearchRepository } from './member-search.repository.js'; import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbMemberSearchItemModel extends UmbMemberItemModel {} +export interface UmbMemberSearchItemModel extends UmbMemberItemModel { + href: string; +} export class UmbMemberSearchProvider extends UmbControllerBase implements UmbSearchProvider { #repository = new UmbMemberSearchRepository(this); From 53f343bbb0509a8f8bc96023829453557e54fbc4 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:14:34 +0200 Subject: [PATCH 079/323] member type href --- .../search/member-type-search.server.data-source.ts | 1 + .../members/member-type/search/member-type.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type-search.server.data-source.ts index 79b16fed9e..0fc23e69bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbMemberTypeSearchServerDataSource implements UmbSearchDataSource< if (data) { const mappedItems: Array = data.items.map((item) => { return { + href: '/section/settings/workspace/member-type/edit/' + item.id, entityType: UMB_MEMBER_TYPE_ENTITY_TYPE, unique: item.id, name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type.search-provider.ts index 852f7089e0..f46a3093e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/search/member-type.search-provider.ts @@ -3,7 +3,9 @@ import { UmbMemberTypeSearchRepository } from './member-type-search.repository.j import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbMemberTypeSearchItemModel extends UmbMemberTypeItemModel {} +export interface UmbMemberTypeSearchItemModel extends UmbMemberTypeItemModel { + href: string; +} export class UmbMemberTypeSearchProvider extends UmbControllerBase From 3fb1f893a5d58bf131dd4931ebee9e8ba296cc23 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:14:40 +0200 Subject: [PATCH 080/323] template href --- .../templates/search/template-search.server.data-source.ts | 1 + .../templating/templates/search/template.search-provider.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template-search.server.data-source.ts index a502683fbe..ba85e4e73c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template-search.server.data-source.ts @@ -39,6 +39,7 @@ export class UmbTemplateSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { + href: '/section/settings/workspace/template/edit/' + item.id, entityType: UMB_TEMPLATE_ENTITY_TYPE, unique: item.id, name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template.search-provider.ts index 28477776d5..a1e8b90235 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/search/template.search-provider.ts @@ -3,7 +3,9 @@ import { UmbTemplateSearchRepository } from './template-search.repository.js'; import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbTemplateSearchItemModel extends UmbTemplateItemModel {} +export interface UmbTemplateSearchItemModel extends UmbTemplateItemModel { + href: string; +} export class UmbTemplateSearchProvider extends UmbControllerBase From ea2fa841f6841c0ce66198723068dd7e7f605c22 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:17:38 +0200 Subject: [PATCH 081/323] remove results on provider change --- .../src/packages/search/search-modal/search-modal.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index ed2566b54f..9c68c6a5d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -242,6 +242,7 @@ export class UmbSearchModalElement extends UmbLitElement { this.#focusInput(); this._loading = true; + this._searchResults = []; this.#updateSearchResults(); } From f03db2b55ce53f258ff6702c37c75e8f316d47b5 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:32:38 +0200 Subject: [PATCH 082/323] fix document styling --- .../document-search-result-item.element.ts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts index ad021f5241..98d35db29e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search-result-item.element.ts @@ -87,28 +87,13 @@ export class UmbSearchResultItemElement extends UmbLitElement { UmbTextStyles, css` :host { - background: var(--uui-color-surface); padding: var(--uui-size-space-3) var(--uui-size-space-5); border-radius: var(--uui-border-radius); - color: var(--uui-color-interactive); display: grid; grid-template-columns: var(--uui-size-space-6) 1fr var(--uui-size-space-5); align-items: center; width: 100%; - } - .item { - background: var(--uui-color-surface); - padding: var(--uui-size-space-3) var(--uui-size-space-5); - border-radius: var(--uui-border-radius); - color: var(--uui-color-interactive); - display: grid; - grid-template-columns: var(--uui-size-space-6) 1fr var(--uui-size-space-5); - align-items: center; - width: 100%; - } - .item:hover { - background-color: var(--uui-color-surface-emphasis); - color: var(--uui-color-interactive-emphasis); + outline-offset: -3px; } .item-icon { margin-bottom: auto; From e3215d2670da230b84f2a1306fbbe433cff1677f Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:32:50 +0200 Subject: [PATCH 083/323] fix keyboard navigation --- .../search/search-modal/search-modal.element.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 9c68c6a5d4..5bc1c8484f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -337,7 +337,12 @@ export class UmbSearchModalElement extends UmbLitElement { #closeModal(event: MouseEvent | KeyboardEvent) { if (event instanceof KeyboardEvent && event.key !== 'Enter') return; - this.modalContext?.reject(); + + requestAnimationFrame(() => { + // In the case where the browser has not triggered focus-visible and we keyboard navigate and press enter. + // It is necessary to wait one frame. + this.modalContext?.reject(); + }); } static styles = [ @@ -456,6 +461,10 @@ export class UmbSearchModalElement extends UmbLitElement { outline-offset: -3px; display: flex; } + .search-item:hover { + background: var(--uui-color-surface-emphasis); + color: var(--uui-color-interactive-emphasis); + } .search-item:focus { outline: 2px solid var(--uui-color-interactive-emphasis); border-radius: 6px; From e0db6f628265393b6254f9d3a76bae5b95ff19a6 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:44:14 +0200 Subject: [PATCH 084/323] cleanup --- .../src/packages/search/search-modal/search-modal.element.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index 5bc1c8484f..f2d6b6eb82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -172,8 +172,6 @@ export class UmbSearchModalElement extends UmbLitElement { } async #setSearchItemNavIndex(index: number) { - await this.updateComplete; - const prevElement = this.shadowRoot?.querySelector( `a[data-item-index="${this.#searchItemNavIndex}"]`, ) as HTMLElement | null; From 25e5d9ec500295976faffd7f5b1d3f5501bd4459 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:54:49 +0200 Subject: [PATCH 085/323] cleanup --- .../search-modal/search-modal.element.ts | 257 +++++++++--------- 1 file changed, 127 insertions(+), 130 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts index f2d6b6eb82..eccd95f917 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/search-modal/search-modal.element.ts @@ -57,10 +57,20 @@ export class UmbSearchModalElement extends UmbLitElement { constructor() { super(); - this.#observeViews(); + this.#observeProviders(); } - #observeViews() { + connectedCallback() { + super.connectedCallback(); + + this.addEventListener('keydown', this.#onKeydown); + + requestAnimationFrame(() => { + this.#focusInput(); + }); + } + + #observeProviders() { new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'searchProvider', null, async (providers) => { const searchProviders: Array = []; @@ -83,94 +93,6 @@ export class UmbSearchModalElement extends UmbLitElement { }); } - connectedCallback() { - super.connectedCallback(); - - this.addEventListener('keydown', this.#onKeydown); - - requestAnimationFrame(() => { - this.#focusInput(); - }); - } - - #onKeydown(event: KeyboardEvent) { - const root = this.shadowRoot; - if (!root) return; - - if (event.key === 'Tab') { - const isFirstProvider = (element: Element) => element === root.querySelector('.search-provider:first-child'); - const isLastProvider = (element: Element) => element === root.querySelector('.search-provider:last-child'); - const setActiveProviderFocus = (element?: Element | null) => (element as HTMLElement)?.focus(); - - const activeProvider = root.querySelector('.search-provider.active') as HTMLElement | null; - - if (!activeProvider) return; - - // When moving backwards in search providers - if (event.shiftKey) { - // If the FOCUS is on a provider, and it is the first in the list, we need to wrap around and focus the LAST one - if (this.#providerHasFocus) { - if (this.#isFocusingFirstProvider) { - setActiveProviderFocus(root.querySelector('.search-provider:last-child')); - event.preventDefault(); - } - return; - } - - // If the currently ACTIVE provider is the first in the list, we need to wrap around and focus the LAST one - if (isFirstProvider(activeProvider)) { - setActiveProviderFocus(root.querySelector('.search-provider:last-child')); - event.preventDefault(); - return; - } - - // We set the focus to current provider, and because we don't prevent the default tab behavior, the previous provider will be focused - setActiveProviderFocus(activeProvider); - } - // When moving forwards in search providers - else { - // If the FOCUS is on a provider, and it is the last in the list, we need to wrap around and focus the FIRST one - if (this.#providerHasFocus) { - if (this.#isFocusingLastProvider) { - setActiveProviderFocus(root.querySelector('.search-provider:first-child')); - event.preventDefault(); - } - return; - } - - // If the currently ACTIVE provider is the last in the list, we need to wrap around and focus the FIRST one - if (isLastProvider(activeProvider)) { - setActiveProviderFocus(root.querySelector('.search-provider:first-child')); - event.preventDefault(); - return; - } - - // We set the focus to current provider, and because we don't prevent the default tab behavior, the next provider will be focused - setActiveProviderFocus(activeProvider); - } - } - - switch (event.key) { - case 'Tab': - case 'Shift': - case 'Escape': - case 'Enter': - break; - case 'ArrowDown': - event.preventDefault(); - this.#setSearchItemNavIndex(Math.min(this.#searchItemNavIndex + 1, this._searchResults.length - 1)); - break; - case 'ArrowUp': - event.preventDefault(); - this.#setSearchItemNavIndex(Math.max(this.#searchItemNavIndex - 1, 0)); - break; - default: - if (this._input === root.activeElement) return; - this.#focusInput(); - break; - } - } - async #setSearchItemNavIndex(index: number) { const prevElement = this.shadowRoot?.querySelector( `a[data-item-index="${this.#searchItemNavIndex}"]`, @@ -192,36 +114,6 @@ export class UmbSearchModalElement extends UmbLitElement { this._input.focus(); } - get #providerHasFocus() { - const providerElements = this.shadowRoot?.querySelectorAll('.search-provider') || []; - return Array.from(providerElements).some((element) => element === this.shadowRoot?.activeElement); - } - - get #isFocusingLastProvider() { - const providerElements = this.shadowRoot?.querySelectorAll('.search-provider') || []; - return providerElements[providerElements.length - 1] === this.shadowRoot?.activeElement; - } - - get #isFocusingFirstProvider() { - const providerElements = this.shadowRoot?.querySelectorAll('.search-provider') || []; - return providerElements[0] === this.shadowRoot?.activeElement; - } - - #onSearchChange(event: InputEvent) { - const target = event.target as HTMLInputElement; - this._search = target.value.trim(); - - clearTimeout(this.#inputTimer); - if (!this._search) { - this._loading = false; - this._searchResults = []; - return; - } - - this._loading = true; - this.#inputTimer = setTimeout(() => this.#updateSearchResults(), this.#inputTimerAmount); - } - async #setShowFakeCursor(show: boolean) { if (show) { await new Promise((resolve) => requestAnimationFrame(resolve)); @@ -257,6 +149,121 @@ export class UmbSearchModalElement extends UmbLitElement { this.#searchItemNavIndex = -1; } + #closeModal(event: MouseEvent | KeyboardEvent) { + if (event instanceof KeyboardEvent && event.key !== 'Enter') return; + + requestAnimationFrame(() => { + // In the case where the browser has not triggered focus-visible and we keyboard navigate and press enter. + // It is necessary to wait one frame. + this.modalContext?.reject(); + }); + } + + #onSearchChange(event: InputEvent) { + const target = event.target as HTMLInputElement; + this._search = target.value.trim(); + + clearTimeout(this.#inputTimer); + if (!this._search) { + this._loading = false; + this._searchResults = []; + return; + } + + this._loading = true; + this.#inputTimer = setTimeout(() => this.#updateSearchResults(), this.#inputTimerAmount); + } + + #onKeydown(event: KeyboardEvent) { + const root = this.shadowRoot; + if (!root) return; + + if (event.key === 'Tab') { + const isFirstProvider = (element: Element) => element === root.querySelector('.search-provider:first-child'); + const isLastProvider = (element: Element) => element === root.querySelector('.search-provider:last-child'); + const setFocus = (element?: Element | null) => (element as HTMLElement)?.focus(); + const providerHasFocus = () => { + const providerElements = root.querySelectorAll('.search-provider') || []; + return Array.from(providerElements).some((element) => element === root.activeElement); + }; + const isFocusingLastProvider = () => { + const providerElements = root.querySelectorAll('.search-provider') || []; + return providerElements[providerElements.length - 1] === root.activeElement; + }; + const isFocusingFirstProvider = () => { + const providerElements = root.querySelectorAll('.search-provider') || []; + return providerElements[0] === root.activeElement; + }; + + const activeProvider = root.querySelector('.search-provider.active') as HTMLElement | null; + + if (!activeProvider) return; + + // When moving backwards in search providers + if (event.shiftKey) { + // If the FOCUS is on a provider, and it is the first in the list, we need to wrap around and focus the LAST one + if (providerHasFocus()) { + if (isFocusingFirstProvider()) { + setFocus(root.querySelector('.search-provider:last-child')); + event.preventDefault(); + } + return; + } + + // If the currently ACTIVE provider is the first in the list, we need to wrap around and focus the LAST one + if (isFirstProvider(activeProvider)) { + setFocus(root.querySelector('.search-provider:last-child')); + event.preventDefault(); + return; + } + + // We set the focus to current provider, and because we don't prevent the default tab behavior, the previous provider will be focused + setFocus(activeProvider); + } + // When moving forwards in search providers + else { + // If the FOCUS is on a provider, and it is the last in the list, we need to wrap around and focus the FIRST one + if (providerHasFocus()) { + if (isFocusingLastProvider()) { + setFocus(root.querySelector('.search-provider:first-child')); + event.preventDefault(); + } + return; + } + + // If the currently ACTIVE provider is the last in the list, we need to wrap around and focus the FIRST one + if (isLastProvider(activeProvider)) { + setFocus(root.querySelector('.search-provider:first-child')); + event.preventDefault(); + return; + } + + // We set the focus to current provider, and because we don't prevent the default tab behavior, the next provider will be focused + setFocus(activeProvider); + } + } + + switch (event.key) { + case 'Tab': + case 'Shift': + case 'Escape': + case 'Enter': + break; + case 'ArrowDown': + event.preventDefault(); + this.#setSearchItemNavIndex(Math.min(this.#searchItemNavIndex + 1, this._searchResults.length - 1)); + break; + case 'ArrowUp': + event.preventDefault(); + this.#setSearchItemNavIndex(Math.max(this.#searchItemNavIndex - 1, 0)); + break; + default: + if (this._input === root.activeElement) return; + this.#focusInput(); + break; + } + } + render() { return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts index 6253c452d1..f11010df0d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts @@ -208,17 +208,15 @@ export class UmbMediaTypeWorkspaceContext const parent = this.#parent.getValue(); if (!parent) throw new Error('Parent is not set'); - if ((await this.structure.create(parent.unique)) === true) { - if (!parent) throw new Error('Parent is not set'); + await this.structure.create(parent.unique); - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadTreeItemChildrenEvent({ - entityType: parent.entityType, - unique: parent.unique, - }); - eventContext.dispatchEvent(event); - this.setIsNew(false); - } + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadTreeItemChildrenEvent({ + entityType: parent.entityType, + unique: parent.unique, + }); + eventContext.dispatchEvent(event); + this.setIsNew(false); } else { await this.structure.save(); 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 e10fedb763..bdf789c2a6 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 @@ -14,6 +14,9 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { @state() private _icon?: string; + @state() + private _isNew?: string; + @state() private _iconColorAlias?: string; // TODO: Color should be using an alias, and look up in some dictionary/key/value) of project-colors. @@ -34,18 +37,7 @@ export class UmbMemberTypeWorkspaceEditorElement 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('_observeIsNew'); - }, - '_observeIsNew', - ); + this.observe(this.#workspaceContext.isNew, (isNew) => (this._isNew = isNew), '_observeIsNew'); } private async _handleIconClick() { @@ -85,6 +77,7 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { label="name" value=${this._name} alias=${this._alias} + ?auto-generate-alias=${this._isNew} @change="${this.#onNameAndAliasChange}" ${umbFocus()}>
@@ -333,16 +340,6 @@ export class UmbSearchModalElement extends UmbLitElement { return this._loading ? nothing : html`
${this.localize.term('general_searchNoResult')}
`; } - #closeModal(event: MouseEvent | KeyboardEvent) { - if (event instanceof KeyboardEvent && event.key !== 'Enter') return; - - requestAnimationFrame(() => { - // In the case where the browser has not triggered focus-visible and we keyboard navigate and press enter. - // It is necessary to wait one frame. - this.modalContext?.reject(); - }); - } - static styles = [ UmbTextStyles, css` From 5bffe4366a14310504894dd32bab482ef584f457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 21:21:11 +0200 Subject: [PATCH 086/323] deep merge --- .../src/packages/core/utils/index.ts | 3 +- .../core/utils/object/deep-merge.function.ts | 22 +++++++ .../core/utils/object/deep-merge.test.ts | 61 +++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts index 8b243bcb6c..09d60ef911 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts @@ -16,4 +16,5 @@ export * from './string/generate-umbraco-alias.function.js'; export * from './string/increment-string.function.js'; export * from './string/split-string-to-array.js'; export * from './string/to-camel-case/to-camel-case.function.js'; -export * from './type/diff.type.js'; +export type * from './type/deep-partial.type.js'; +export type * from './type/diff.type.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts new file mode 100644 index 0000000000..b08629cb1d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts @@ -0,0 +1,22 @@ +import type { DeepPartial } from '../type/deep-partial.type.js'; + +/** + * Deep merge two objects. + * @param target + * @param ...sources + */ +export function umbDeepMerge(source: DeepPartial, fallback: T) { + const result = { ...fallback }; + + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== undefined) { + if (source[key].constructor === Object && fallback[key].constructor === Object) { + result[key] = umbDeepMerge(source[key], fallback[key]); + } else { + result[key] = source[key] as any; + } + } + } + + return result; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.test.ts new file mode 100644 index 0000000000..61509c9162 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.test.ts @@ -0,0 +1,61 @@ +import { expect } from '@open-wc/testing'; +import { umbDeepMerge } from './deep-merge.function.js'; + +describe('UmbDeepMerge', () => { + beforeEach(() => {}); + + describe('merge just objects', () => { + it('transfers defined properties', () => { + const defaults = { + prop1: { + name: 'prop1', + value: 'value1', + }, + prop2: { + name: 'prop2', + value: 'value2', + }, + }; + const source = { + prop2: { + name: 'prop2_updatedName', + }, + }; + const result = umbDeepMerge(source, defaults); + + expect(result.prop1.name).to.equal('prop1'); + expect(result.prop2.name).to.equal('prop2_updatedName'); + }); + }); + + describe('merge objects with arrays', () => { + // The arrays should not be merged, but take the value from the main object. [NL] + it('transfers defined properties', () => { + const defaults = { + prop1: { + name: 'prop1', + value: ['entry1', 'entry2', 'entry3'], + }, + prop2: { + name: 'prop2', + value: ['entry4', 'entry4', 'entry5'], + }, + }; + const source = { + prop1: { + name: 'prop1_updatedName', + }, + prop2: { + name: 'prop2_updatedName', + value: ['entry666'], + }, + }; + const result = umbDeepMerge(source, defaults); + + expect(result.prop1.name).to.equal('prop1_updatedName'); + expect(result.prop2.value.join(',')).to.equal(defaults.prop1.value.join(',')); + expect(result.prop2.name).to.equal('prop2_updatedName'); + expect(result.prop2.value.join(',')).to.equal(source.prop2.value.join(',')); + }); + }); +}); From a3069c619545067015b5c699b01e7b5a3c3589e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 21:21:51 +0200 Subject: [PATCH 087/323] url-pattern-to-string correction --- .../core/utils/path/url-pattern-to-string.function.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts index e927e3cf15..1cd087a67e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/url-pattern-to-string.function.ts @@ -5,9 +5,9 @@ const PARAM_IDENTIFIER = /:([^/]+)/g; export function umbUrlPatternToString(pattern: string, params: UrlParametersRecord | null): string { return params ? pattern.replace(PARAM_IDENTIFIER, (_substring: string, ...args: string[]) => { - const segmentName = args[0]; // (segmentName is the parameter name without the colon) + const segmentValue = params![args[0]]; // (segmentValue is the value to replace the parameter) // Replace the path-segment with the value from the params object or 'null' if it doesn't exist - return params![segmentName]?.toString() ?? 'null'; + return segmentValue === undefined ? `:${args[0]}` : segmentValue === null ? 'null' : segmentValue.toString(); }) : pattern; } From e00975e64bada859f1492f138af31c3954280644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 21:25:02 +0200 Subject: [PATCH 088/323] deep-partial type --- .../src/packages/core/utils/type/deep-partial.type.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts new file mode 100644 index 0000000000..65bb71bfa0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts @@ -0,0 +1,5 @@ +export type DeepPartial = T extends object + ? { + [P in keyof T]?: DeepPartial; + } + : T; From fdbe522a8ef3460d21ca9abec17044ed1b5918dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 22:20:31 +0200 Subject: [PATCH 089/323] eport util --- src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts index 09d60ef911..572569ab13 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts @@ -3,6 +3,7 @@ export * from './direction/index.js'; export * from './download/blob-download.function.js'; export * from './get-processed-image-url.function.js'; export * from './math/math.js'; +export * from './object/deep-merge.function.js'; export * from './pagination-manager/pagination.manager.js'; export * from './path/ensure-path-ends-with-slash.function.js'; export * from './path/path-decode.function.js'; From 433bdc4c74ef6a620cc9bb02d1a47e7cf9aed220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 23:42:36 +0200 Subject: [PATCH 090/323] deep partial modal data, for more fine grained definitions --- .../modal/context/modal-manager.context.ts | 2 +- .../core/modal/context/modal.context.ts | 18 +++++++++-- .../modal-route-registration.controller.ts | 19 +++++++----- .../modal-route-registration.interface.ts | 5 +++- .../packages/core/modal/token/modal-token.ts | 10 +++++-- .../tree-picker/tree-picker-modal.token.ts | 4 +-- .../src/packages/core/utils/index.ts | 2 +- .../core/utils/object/deep-merge.function.ts | 11 ++++--- .../utils/type/deep-partial-object.type.ts | 30 +++++++++++++++++++ .../core/utils/type/deep-partial.type.ts | 5 ---- 10 files changed, 80 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial-object.type.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts index eb74e7deca..0764a232c8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts @@ -38,7 +38,7 @@ export class UmbModalManagerContext extends UmbContextBase, >( diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts index 05d6220b7a..2fc6c8da0c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts @@ -6,6 +6,7 @@ import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import { type UmbDeepPartialObject, umbDeepMerge } from '@umbraco-cms/backoffice/utils'; export interface UmbModalRejectReason { type: string; @@ -13,7 +14,9 @@ export interface UmbModalRejectReason { export type UmbModalContextClassArgs< ModalAliasType extends string | UmbModalToken, - ModalAliasTypeAsToken extends UmbModalToken = ModalAliasType extends UmbModalToken ? ModalAliasType : UmbModalToken, + ModalAliasTypeAsToken extends UmbModalToken = ModalAliasType extends UmbModalToken + ? ModalAliasType + : UmbModalToken, > = { router?: IRouterSlot | null; data?: ModalAliasTypeAsToken['DATA']; @@ -22,7 +25,10 @@ export type UmbModalContextClassArgs< }; // TODO: consider splitting this into two separate handlers -export class UmbModalContext extends UmbControllerBase { +export class UmbModalContext< + ModalPreset extends { [key: string]: any } = { [key: string]: any }, + ModalValue = any, +> extends UmbControllerBase { // #submitPromise: Promise; #submitResolver?: (value: ModalValue) => void; @@ -60,7 +66,13 @@ export class UmbModalContext, defaultData) as ModalPreset) + : // otherwise pick one of them: + (args.data as ModalPreset) ?? defaultData, + ); const initValue = args.value ?? (this.alias instanceof UmbModalToken ? (this.alias as UmbModalToken).getDefaultValue() : undefined); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.controller.ts index b4de970109..b645cc0185 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.controller.ts @@ -1,25 +1,30 @@ import type { UmbModalToken } from '../token/index.js'; import type { UmbModalConfig, UmbModalContext, UmbModalManagerContext, UmbModalRouteRegistration } from '../index.js'; +import type { UmbModalContextClassArgs } from '../context/modal.context.js'; import { type Params, type IRouterSlot, UMB_ROUTE_CONTEXT, encodeFolderName } from '@umbraco-cms/backoffice/router'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbDeepPartialObject } from '@umbraco-cms/backoffice/utils'; export type UmbModalRouteBuilder = (params: { [key: string]: string | number } | null) => string; export type UmbModalRouteSetupReturn = UmbModalTokenValue extends undefined ? { - modal?: UmbModalConfig; - data: UmbModalTokenData; + modal?: UmbDeepPartialObject; + data: UmbDeepPartialObject; value?: UmbModalTokenValue; } : { - modal?: UmbModalConfig; - data: UmbModalTokenData; + modal?: UmbDeepPartialObject; + data: UmbDeepPartialObject; value: UmbModalTokenValue; }; -export class UmbModalRouteRegistrationController +export class UmbModalRouteRegistrationController< + UmbModalTokenData extends { [key: string]: any } = { [key: string]: any }, + UmbModalTokenValue = any, + > extends UmbControllerBase implements UmbModalRouteRegistration { @@ -293,8 +298,8 @@ export class UmbModalRouteRegistrationController>; + args.modal!.key = this.#key; this.#modalContext = modalManagerContext.open(this, this.#modalAlias, args); this.#modalContext.onSubmit().then(this.#onSubmit, this.#onReject); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.interface.ts index e4113c2408..a1af2fbcf7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/route-registration/modal-route-registration.interface.ts @@ -3,7 +3,10 @@ import type { UmbModalContext, UmbModalRouteBuilder } from '../index.js'; import type { UmbModalToken } from '../token/modal-token.js'; import type { IRouterSlot, Params } from '@umbraco-cms/backoffice/router'; -export interface UmbModalRouteRegistration { +export interface UmbModalRouteRegistration< + UmbModalTokenData extends { [key: string]: any } = { [key: string]: any }, + UmbModalTokenValue = any, +> { key: string; alias: UmbModalToken | string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/modal-token.ts index 8d45fde4b9..61d66ce63e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/modal-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/modal-token.ts @@ -1,12 +1,18 @@ import type { UmbModalConfig } from '../context/modal-manager.context.js'; -export interface UmbModalTokenDefaults { +export interface UmbModalTokenDefaults< + ModalDataType extends { [key: string]: any } = { [key: string]: any }, + ModalValueType = unknown, +> { modal?: UmbModalConfig; data?: ModalDataType; value?: ModalValueType; } -export class UmbModalToken { +export class UmbModalToken< + ModalDataType extends { [key: string]: any } = { [key: string]: any }, + ModalValueType = unknown, +> { /** * Get the data type of the token's data. * 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 index a6ab0af664..d5d3affed0 100644 --- 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 @@ -11,7 +11,7 @@ export interface UmbTreePickerModalCreateActionData extends UmbPickerModalData { treeAlias?: string; @@ -21,7 +21,7 @@ export interface UmbTreePickerModalData< export interface UmbTreePickerModalValue extends UmbPickerModalValue {} -export const UMB_TREE_PICKER_MODAL = new UmbModalToken( +export const UMB_TREE_PICKER_MODAL = new UmbModalToken, UmbTreePickerModalValue>( UMB_TREE_PICKER_MODAL_ALIAS, { modal: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts index 572569ab13..6895540e28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts @@ -17,5 +17,5 @@ export * from './string/generate-umbraco-alias.function.js'; export * from './string/increment-string.function.js'; export * from './string/split-string-to-array.js'; export * from './string/to-camel-case/to-camel-case.function.js'; -export type * from './type/deep-partial.type.js'; +export type * from './type/deep-partial-object.type.js'; export type * from './type/diff.type.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts index b08629cb1d..94b67c9b94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/object/deep-merge.function.ts @@ -1,17 +1,20 @@ -import type { DeepPartial } from '../type/deep-partial.type.js'; +import type { UmbDeepPartialObject } from '../type/deep-partial-object.type.js'; /** * Deep merge two objects. * @param target * @param ...sources */ -export function umbDeepMerge(source: DeepPartial, fallback: T) { +export function umbDeepMerge< + T extends { [key: string]: any }, + PartialType extends UmbDeepPartialObject = UmbDeepPartialObject, +>(source: PartialType, fallback: T) { const result = { ...fallback }; for (const key in source) { if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== undefined) { - if (source[key].constructor === Object && fallback[key].constructor === Object) { - result[key] = umbDeepMerge(source[key], fallback[key]); + if (source[key]?.constructor === Object && fallback[key].constructor === Object) { + result[key] = umbDeepMerge(source[key] as any, fallback[key]); } else { result[key] = source[key] as any; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial-object.type.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial-object.type.ts new file mode 100644 index 0000000000..7961caf5d1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial-object.type.ts @@ -0,0 +1,30 @@ +/*export type DeepPartial = T extends { [key: string]: any } + ? { + [P in keyof T]?: DeepPartial; + } + : T; +*/ + +// Notice this can be way more complex, but in this case I just wanted to cover pure objects, to match our deep merge function [NL] +// See https://stackoverflow.com/questions/61132262/typescript-deep-partial for more extensive solutions. +/** + * Deep partial object type, making objects and their properties optional, but only until a property of a different type is encountered. + * This means if an object holds a property with an array that holds objects, the array will be made optional, but the properties of the objects inside the array will not be changed. + * @type UmbDeepPartialObject + * @generic T - The object to make partial. + * @returns A type with all properties of objects made optional. + */ +// eslint-disable-next-line @typescript-eslint/ban-types +export type UmbDeepPartialObject = T extends Function + ? T + : // Thing extends Array + // ? DeepPartialArray : + T extends { [key: string]: any } + ? UmbDeepPartialObjectProperty + : T | undefined; + +//interface DeepPartialArray extends Array> {} + +type UmbDeepPartialObjectProperty = { + [Key in keyof Thing]?: UmbDeepPartialObject; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts deleted file mode 100644 index 65bb71bfa0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/type/deep-partial.type.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type DeepPartial = T extends object - ? { - [P in keyof T]?: DeepPartial; - } - : T; From 4875e1db14fed35d04d7719d1b7c01d47e84c048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 23:43:04 +0200 Subject: [PATCH 091/323] remove unnesecary modal data in implementation --- .../components/input-block-type/input-block-type.element.ts | 6 ------ 1 file changed, 6 deletions(-) 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 2e5ca4ecda..c8a685055e 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 @@ -86,13 +86,7 @@ export class UmbInputBlockTypeElement< hideTreeRoot: true, multiple: false, createAction: { - modalData: { - entityType: UMB_DOCUMENT_TYPE_ENTITY_TYPE, - preset: { isElementType: true }, - }, - additionalPathGenerator: umbCreateDocumentTypeWorkspacePathGenerator, additionalPathParams: { - entityType: UMB_DOCUMENT_TYPE_ENTITY_TYPE, parentUnique: null, presetAlias: 'element', }, From 86ddab0c37b995b88ff605b30ea7454fcf5d12db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 23:45:04 +0200 Subject: [PATCH 092/323] improed modal token --- .../modals/document-type-picker-modal.token.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 8fc9713972..956ae78c1d 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 @@ -7,8 +7,14 @@ import { UMB_TREE_PICKER_MODAL_ALIAS, } from '@umbraco-cms/backoffice/tree'; -export interface UmbDocumentTypePickerModalData +/*export interface UmbDocumentTypePickerModalData extends UmbTreePickerModalData {} +*/ +export type UmbDocumentTypePickerModalData = UmbTreePickerModalData< + UmbDocumentTypeTreeItemModel, + typeof umbCreateDocumentTypeWorkspacePathGenerator +>; + export interface UmbDocumentTypePickerModalValue extends UmbTreePickerModalValue {} export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< @@ -23,14 +29,14 @@ export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< treeAlias: 'Umb.Tree.DocumentType', createAction: { modalData: { - entityType: 'documentType', + entityType: 'document-type', preset: {}, }, additionalPathGenerator: umbCreateDocumentTypeWorkspacePathGenerator, additionalPathParams: { - entityType: 'documentType', - parentUnique: '', - presetAlias: '', + entityType: 'document-type', + parentUnique: null, + presetAlias: null, }, }, }, From f13ab36561b281d2591e93084b174a8fd454c351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Apr 2024 23:45:20 +0200 Subject: [PATCH 093/323] better rejection when failed workspace modal --- .../core/tree/tree-picker/tree-picker-modal.element.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts index 41220920d7..dea4836ea8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts @@ -57,6 +57,9 @@ export class UmbTreePickerModalElement { From e58087667a6b7d6e88366cf23d596d92968a1cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 25 Apr 2024 12:50:27 +0200 Subject: [PATCH 094/323] refactor to use umbPathPattern --- .../input-block-type.element.ts | 8 ++--- ...nerate-route-path-builder.function.test.ts | 16 ++++----- .../generate-route-path-builder.function.ts | 7 +++- .../src/packages/core/router/index.ts | 2 +- .../core/router/path-pattern.class.ts | 35 +++++++++++++++++++ .../src/packages/core/router/route.context.ts | 4 +-- .../tree-picker/tree-picker-modal.element.ts | 3 +- .../tree-picker/tree-picker-modal.token.ts | 12 +++---- .../document-type-picker-modal.token.ts | 8 ++--- .../documents/document-types/paths.ts | 11 +++--- .../document-type-workspace.context.ts | 4 +-- 11 files changed, 72 insertions(+), 38 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts 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 c8a685055e..ef77263298 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 @@ -7,11 +7,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import { UmbDeleteEvent } from '@umbraco-cms/backoffice/event'; -import { - UMB_DOCUMENT_TYPE_PICKER_MODAL, - UMB_DOCUMENT_TYPE_ENTITY_TYPE, - umbCreateDocumentTypeWorkspacePathGenerator, -} from '@umbraco-cms/backoffice/document-type'; +import { UMB_DOCUMENT_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/document-type'; import { UmbSorterController } from '@umbraco-cms/backoffice/sorter'; /** TODO: Look into sending a "change" event when there is a change, rather than create, delete, and change event. Make sure it doesn't break move for RTE/List/Grid. [LI] */ @@ -86,7 +82,7 @@ export class UmbInputBlockTypeElement< hideTreeRoot: true, multiple: false, createAction: { - additionalPathParams: { + extendWithPathParams: { parentUnique: null, presetAlias: 'element', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.test.ts index b768e4d582..59637c2db8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.test.ts @@ -1,41 +1,41 @@ import { expect } from '@open-wc/testing'; -import { umbCreateRoutePathBuilder } from './generate-route-path-builder.function.js'; +import { umbGenerateRoutePathBuilder } from './generate-route-path-builder.function.js'; describe('createRoutePathBuilder', () => { it('should return a function that builds a route path without parameters', () => { - const buildPath = umbCreateRoutePathBuilder('test/path'); + const buildPath = umbGenerateRoutePathBuilder('test/path'); expect(buildPath(null)).to.eq('/test/path/'); }); it('should return a function that builds a route path with parameters', () => { - const buildPath = umbCreateRoutePathBuilder(':param0/test/:param1/path/:param2'); + const buildPath = umbGenerateRoutePathBuilder(':param0/test/:param1/path/:param2'); expect(buildPath({ param0: 'value0', param1: 'value1', param2: 'value2' })).to.eq( '/value0/test/value1/path/value2/', ); }); it('should convert number parameters to strings', () => { - const buildPath = umbCreateRoutePathBuilder('test/:param1/path/:param2'); + const buildPath = umbGenerateRoutePathBuilder('test/:param1/path/:param2'); expect(buildPath({ param1: 123, param2: 456 })).to.eq('/test/123/path/456/'); }); it('should not consider route segments that resembles parameters as parameters', () => { - const buildPath = umbCreateRoutePathBuilder('test/uc:store/path'); + const buildPath = umbGenerateRoutePathBuilder('test/uc:store/path'); expect(buildPath({ someOtherParam: 'test' })).to.eq('/test/uc:store/path/'); }); it('should support multiple parameters with the same name', () => { - const buildPath = umbCreateRoutePathBuilder('test/:param1/path/:param1'); + const buildPath = umbGenerateRoutePathBuilder('test/:param1/path/:param1'); expect(buildPath({ param1: 'value1' })).to.eq('/test/value1/path/value1/'); }); it('should not consider parameters that are not in the params object', () => { - const buildPath = umbCreateRoutePathBuilder('test/:param1/path/:param2'); + const buildPath = umbGenerateRoutePathBuilder('test/:param1/path/:param2'); expect(buildPath({ param1: 'value1' })).to.eq('/test/value1/path/:param2/'); }); it('should support complex objects as parameters with a custom toString method', () => { - const buildPath = umbCreateRoutePathBuilder('test/:param1/path/:param2'); + const buildPath = umbGenerateRoutePathBuilder('test/:param1/path/:param2'); const obj = { toString() { return 'value1'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.ts index 181abf6abf..24db7b9dc6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/generate-route-path-builder.function.ts @@ -1,8 +1,13 @@ import { type UrlParametersRecord, umbUrlPatternToString } from '../utils/path/url-pattern-to-string.function.js'; import { stripSlash } from '@umbraco-cms/backoffice/external/router-slot'; // This must only include the util to avoid side effects of registering the route element. -export function umbCreateRoutePathBuilder(path: string) { +export function umbGenerateRoutePathBuilder(path: string) { return (params: UrlParametersRecord | null) => { return '/' + stripSlash(umbUrlPatternToString(path, params)) + '/'; }; } + +/** + * @deprecated Use `umbGenerateRoutePathBuilder` instead. + */ +export { umbGenerateRoutePathBuilder as umbCreateRoutePathBuilder }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts index c4b9ff29db..7aeb5ac6ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts @@ -1,8 +1,8 @@ export * from '@umbraco-cms/backoffice/external/router-slot'; export * from './encode-folder-name.function.js'; -export * from './generate-route-path-builder.function.js'; export * from './route.context.js'; export * from './route.interface.js'; export * from './router-slot-change.event.js'; export * from './router-slot-init.event.js'; export * from './router-slot.element.js'; +export * from './path-pattern.class.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts new file mode 100644 index 0000000000..31ed8b8b57 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts @@ -0,0 +1,35 @@ +import { umbUrlPatternToString } from '../utils/path/url-pattern-to-string.function.js'; + +export type UmbPathPatternParamsType = { [key: string]: any }; + +export class UmbPathPattern { + #local: string; + #base: string; + + /** + * Get the params type of the path pattern + * + * @public + * @type {T} + * @memberOf UmbPathPattern + * @example `typeof MyPathPattern.PARAMS` + * @returns undefined + */ + readonly PARAMS!: LocalParamsType; + + constructor(localPattern: string, basePath?: string) { + this.#local = localPattern; + this.#base = basePath ? (basePath.lastIndexOf('/') !== basePath.length - 1 ? basePath + '/' : basePath) : ''; + } + + generateLocal(params: LocalParamsType) { + return umbUrlPatternToString(this.#local, params); + } + generateGlobal(params: LocalParamsType) { + return this.#base + umbUrlPatternToString(this.#local, params); + } + + toString() { + return this.#local; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/route.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/route.context.ts index ee860f7d6f..61213982e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/route.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/route.context.ts @@ -1,5 +1,5 @@ import type { UmbRoute } from './route.interface.js'; -import { umbCreateRoutePathBuilder } from './generate-route-path-builder.function.js'; +import { umbGenerateRoutePathBuilder } from './generate-route-path-builder.function.js'; import type { IRoutingInfo, IRouterSlot } from '@umbraco-cms/backoffice/external/router-slot'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -147,7 +147,7 @@ export class UmbRouteContext extends UmbContextBase { : this.#routerActiveLocalPath + '/' : ''; const localPath = routeBasePath + routeActiveLocalPath + modalRegistration.generateModalPath(); - const urlBuilder = umbCreateRoutePathBuilder(localPath); + const urlBuilder = umbGenerateRoutePathBuilder(localPath); modalRegistration._internal_setRouteBuilder(urlBuilder); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts index dea4836ea8..dc441fe8df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts @@ -65,7 +65,8 @@ export class UmbTreePickerModalElement { const oldPath = this._createPath; this._createPath = - routeBuilder({}) + createActionData.additionalPathGenerator(createActionData.additionalPathParams); + routeBuilder({}) + + createActionData.extendWithPathPattern.generateLocal(createActionData.extendWithPathParams); this.requestUpdate('_createPath', oldPath); }); } 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 index d5d3affed0..03f5152144 100644 --- 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 @@ -1,22 +1,22 @@ import { UMB_TREE_PICKER_MODAL_ALIAS } from './constants.js'; import type { UmbPickerModalData, UmbPickerModalValue, UmbWorkspaceModalData } from '@umbraco-cms/backoffice/modal'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import type { UmbPathPattern, UmbPathPatternParamsType } from '@umbraco-cms/backoffice/router'; -export type UmbPathGeneratorType = (params: any) => string; -export interface UmbTreePickerModalCreateActionData { +export interface UmbTreePickerModalCreateActionData { modalData: UmbWorkspaceModalData; modalToken?: UmbModalToken; - additionalPathGenerator: PathGeneratorType; - additionalPathParams: Parameters[0]; + extendWithPathPattern: UmbPathPattern; + extendWithPathParams: PathPatternParamsType; } export interface UmbTreePickerModalData< TreeItemType, - PathGeneratorType extends UmbPathGeneratorType = UmbPathGeneratorType, + PathPatternParamsType extends UmbPathPatternParamsType = UmbPathPatternParamsType, > extends UmbPickerModalData { treeAlias?: string; // Consider if it makes sense to move this into the UmbPickerModalData interface, but for now this is a TreePicker feature. [NL] - createAction?: UmbTreePickerModalCreateActionData; + createAction?: UmbTreePickerModalCreateActionData; } export interface UmbTreePickerModalValue extends UmbPickerModalValue {} 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 956ae78c1d..2221229a12 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,4 +1,4 @@ -import { umbCreateDocumentTypeWorkspacePathGenerator } from '../paths.js'; +import { UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH } from '../paths.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentTypeTreeItemModel } from '@umbraco-cms/backoffice/document-type'; import { @@ -12,7 +12,7 @@ import { */ export type UmbDocumentTypePickerModalData = UmbTreePickerModalData< UmbDocumentTypeTreeItemModel, - typeof umbCreateDocumentTypeWorkspacePathGenerator + typeof UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH.PARAMS >; export interface UmbDocumentTypePickerModalValue extends UmbTreePickerModalValue {} @@ -32,8 +32,8 @@ export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< entityType: 'document-type', preset: {}, }, - additionalPathGenerator: umbCreateDocumentTypeWorkspacePathGenerator, - additionalPathParams: { + extendWithPathPattern: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, + extendWithPathParams: { entityType: 'document-type', parentUnique: null, presetAlias: null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts index 93b117acb3..c351f94b67 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts @@ -1,5 +1,5 @@ import type { UmbDocumentTypeEntityTypeUnion } from './entity.js'; -import { umbUrlPatternToString } from '@umbraco-cms/backoffice/utils'; +import { UmbPathPattern } from '@umbraco-cms/backoffice/router'; export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE = 'template'; export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT = 'element'; @@ -13,13 +13,10 @@ export type UmbCreateDocumentTypeWorkspacePresetType = | UmbCreateDocumentTypeWorkspacePresetTemplateType | UmbCreateDocumentTypeWorkspacePresetElementType; -export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH = 'create/:entityType/:parentUnique/:presetAlias'; -export const umbCreateDocumentTypeWorkspacePathGenerator = (params: { +export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH = new UmbPathPattern<{ entityType: UmbDocumentTypeEntityTypeUnion; parentUnique?: string | null; presetAlias?: UmbCreateDocumentTypeWorkspacePresetType | null; -}) => umbUrlPatternToString(UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, params); +}>('create/:entityType/:parentUnique/:presetAlias'); -export const UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH = 'edit/:id'; -export const umbEditDocumentTypeWorkspacePathGenerator = (params: { id: string }) => - umbUrlPatternToString(UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, params); +export const UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH = new UmbPathPattern<{ id: string }>('edit/:id'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index b5194e7080..578df73d21 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -96,7 +96,7 @@ export class UmbDocumentTypeWorkspaceContext this.routes.setRoutes([ { - path: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, + path: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH.toString(), component: UmbDocumentTypeWorkspaceEditorElement, setup: (_component, info) => { const parentEntityType = info.match.params.entityType; @@ -112,7 +112,7 @@ export class UmbDocumentTypeWorkspaceContext }, }, { - path: UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH, + path: UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH.toString(), component: UmbDocumentTypeWorkspaceEditorElement, setup: (_component, info) => { this.removeUmbControllerByAlias('isNewRedirectController'); From e9fdc4daef443d76b43dfbff72a1f0684bb05f56 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:00:40 +0200 Subject: [PATCH 095/323] add interfaces for composition repo + data source --- ...-type-composition-data-source.interface.ts | 23 +++++++++++++++++++ ...t-type-composition-repository.interface.ts | 18 +++++++++++++++ .../core/content-type/composition/index.ts | 4 ++++ .../core/content-type/composition/types.ts | 19 +++++++++++++++ .../src/packages/core/content-type/index.ts | 1 + 5 files changed, 65 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts new file mode 100644 index 0000000000..e0a2c35635 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts @@ -0,0 +1,23 @@ +import type { + UmbContentTypeCompositionCompatibleModel, + UmbContentTypeCompositionReferenceModel, + UmbContentTypeCompositionRequestModel, +} from './types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbContentTypeCompositionDataSourceConstructor { + new (host: UmbControllerHost): UmbContentTypeCompositionDataSource; +} + +export interface UmbContentTypeCompositionDataSource { + availableCompositions< + ResponseType extends UmbContentTypeCompositionCompatibleModel, + ArgsType extends UmbContentTypeCompositionRequestModel, + >( + args: ArgsType, + ): Promise>>; + getReferences( + unique: string, + ): Promise>>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts new file mode 100644 index 0000000000..ac9fb7ce59 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts @@ -0,0 +1,18 @@ +import type { + UmbContentTypeCompositionCompatibleModel, + UmbContentTypeCompositionReferenceModel, + UmbContentTypeCompositionRequestModel, +} from './types.js'; +import type { UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbContentTypeCompositionRepository { + getReferences( + unique: string, + ): Promise>>; + availableCompositions< + ResponseType extends UmbContentTypeCompositionCompatibleModel, + ArgsType extends UmbContentTypeCompositionRequestModel, + >( + args: ArgsType, + ): Promise>>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/index.ts new file mode 100644 index 0000000000..c9b2fadc33 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/index.ts @@ -0,0 +1,4 @@ +export type { UmbContentTypeCompositionRepository } from './content-type-composition-repository.interface.js'; +export type { UmbContentTypeCompositionDataSource } from './content-type-composition-data-source.interface.js'; + +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts new file mode 100644 index 0000000000..d6530f961d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts @@ -0,0 +1,19 @@ +export interface UmbContentTypeCompositionReferenceModel { + unique: string; + name: string; + icon: string; +} + +export interface UmbContentTypeCompositionRequestModel { + unique: string | null; + currentPropertyAliases: Array; + currentCompositeUniques: Array; +} + +export interface UmbContentTypeCompositionCompatibleModel { + unique: string; + name: string; + icon: string; + folderPath: Array; + isCompatible: boolean; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/index.ts index 6f9d7d26e5..03701d17e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/index.ts @@ -4,3 +4,4 @@ export * from './repository/index.js'; export * from './structure/index.js'; export * from './types.js'; export * from './workspace/index.js'; +export * from './composition/index.js'; From 595652fd9163c63a4fddfa8948176f5389918a17 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:00:59 +0200 Subject: [PATCH 096/323] extend document type composition types --- .../documents/document-types/types.ts | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts index 49f17aac41..a1c8ab0903 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts @@ -1,5 +1,10 @@ import type { UmbDocumentTypeEntityType } from './entity.js'; -import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; +import type { + UmbContentTypeCompositionCompatibleModel, + UmbContentTypeCompositionReferenceModel, + UmbContentTypeCompositionRequestModel, + UmbContentTypeModel, +} from '@umbraco-cms/backoffice/content-type'; export interface UmbDocumentTypeDetailModel extends UmbContentTypeModel { entityType: UmbDocumentTypeEntityType; @@ -14,23 +19,10 @@ export type UmbDocumentTypeCleanupModel = { keepLatestVersionPerDayForDays?: number | null; }; -export interface UmbDocumentTypeCompositionRequestModel { - unique: string | null; +export interface UmbDocumentTypeCompositionRequestModel extends UmbContentTypeCompositionRequestModel { isElement: boolean; - currentPropertyAliases: Array; - currentCompositeUniques: Array; } -export interface UmbDocumentTypeCompositionCompatibleModel { - unique: string; - name: string; - icon: string; - folderPath: Array; - isCompatible: boolean; -} +export interface UmbDocumentTypeCompositionCompatibleModel extends UmbContentTypeCompositionCompatibleModel {} -export interface UmbDocumentTypeCompositionReferenceModel { - unique: string; - name: string; - icon: string; -} +export interface UmbDocumentTypeCompositionReferenceModel extends UmbContentTypeCompositionReferenceModel {} From c89806edbb17f77ebe01451419bdfa0a3cc1d8d5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:01:23 +0200 Subject: [PATCH 097/323] use generic interfaces in composition modal --- .../composition-picker-modal.element.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts index 97c15ff002..562d59ed27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts @@ -1,20 +1,20 @@ +import type { + UmbContentTypeCompositionRepository, + UmbContentTypeCompositionCompatibleModel, + UmbContentTypeCompositionReferenceModel, +} from '../../composition/index.js'; import type { UmbCompositionPickerModalData, UmbCompositionPickerModalValue, } from './composition-picker-modal.token.js'; import { css, html, customElement, state, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { - UmbDocumentTypeCompositionRepository, - UmbDocumentTypeCompositionCompatibleModel, - UmbDocumentTypeCompositionReferenceModel, -} from '@umbraco-cms/backoffice/document-type'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; interface CompatibleCompositions { path: string; - compositions: Array; + compositions: Array; } @customElement('umb-composition-picker-modal') @@ -23,12 +23,12 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement< UmbCompositionPickerModalValue > { // TODO: Loosen this from begin specific to Document Types, so we can have a general interface for composition repositories. [NL] - #compositionRepository?: UmbDocumentTypeCompositionRepository; + #compositionRepository?: UmbContentTypeCompositionRepository; #unique: string | null = null; #init?: Promise; @state() - private _references: Array = []; + private _references: Array = []; @state() private _compatibleCompositions?: Array; @@ -41,7 +41,7 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement< const alias = this.data?.compositionRepositoryAlias; if (alias) { this.#init = new UmbExtensionApiInitializer(this, umbExtensionsRegistry, alias, [this], (permitted, ctrl) => { - this.#compositionRepository = permitted ? (ctrl.api as UmbDocumentTypeCompositionRepository) : undefined; + this.#compositionRepository = permitted ? (ctrl.api as UmbContentTypeCompositionRepository) : undefined; }).asPromise(); } else { throw new Error('No composition repository alias provided'); @@ -168,7 +168,7 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement< } } - #renderCompositionsItems(compositionsList: Array) { + #renderCompositionsItems(compositionsList: Array) { return repeat( compositionsList, (compositions) => compositions.unique, From 165601324c786229b7c6c784fbdee566fb408d94 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:01:41 +0200 Subject: [PATCH 098/323] implement interfaces --- .../composition/document-type-composition.repository.ts | 6 +++++- .../document-type-composition.server.data-source.ts | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts index 1901072d48..2f3c5fbbde 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts @@ -1,9 +1,13 @@ import { UmbDocumentTypeCompositionServerDataSource } from './document-type-composition.server.data-source.js'; +import type { UmbContentTypeCompositionRepository } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDocumentTypeCompositionRequestModel } from '@umbraco-cms/backoffice/document-type'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; -export class UmbDocumentTypeCompositionRepository extends UmbRepositoryBase { +export class UmbDocumentTypeCompositionRepository + extends UmbRepositoryBase + implements UmbContentTypeCompositionRepository +{ #compositionSource: UmbDocumentTypeCompositionServerDataSource; constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts index 0422becef4..aef52c8ad2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts @@ -9,13 +9,14 @@ import { } 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 { UmbContentTypeCompositionDataSource } from '@umbraco-cms/backoffice/content-type'; /** * A data source for the Document Type Composition that fetches data from the server * @export * @class UmbDocumentTypeCompositionServerDataSource */ -export class UmbDocumentTypeCompositionServerDataSource { +export class UmbDocumentTypeCompositionServerDataSource implements UmbContentTypeCompositionDataSource { #host: UmbControllerHost; /** From 1b0966ea61271332a0859d99d22a6ce7723f46d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 25 Apr 2024 13:18:46 +0200 Subject: [PATCH 099/323] promise reject on create failure --- .../structure/content-type-structure-manager.class.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts index a4b7176829..14f7dc9ef1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts @@ -120,18 +120,18 @@ export class UmbContentTypeStructureManager< */ public async create(parentUnique: string | null) { const contentType = this.getOwnerContentType(); - if (!contentType || !contentType.unique) return false; + if (!contentType || !contentType.unique) { + throw new Error('Could not find the Content Type to create'); + } const { data } = await this.#repository.create(contentType, parentUnique); - if (!data) return false; + if (!data) return Promise.reject(); // Update state with latest version: this.#contentTypes.updateOne(contentType.unique, data); // Start observe the new content type in the store, as we did not do that when it was a scaffold/local-version. this._observeContentType(data); - - return true; } private async _loadContentTypeCompositions(contentType: T) { From f07d8f85f989a3a130bfac39d08412da285d338b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:44:22 +0200 Subject: [PATCH 100/323] move input-tree to tree picker property editor --- src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts | 1 - .../tree => property-editors/tree-picker}/components/index.ts | 0 .../tree-picker}/components/input-tree/index.ts | 0 .../tree-picker}/components/input-tree/input-tree.element.ts | 0 .../tree-picker}/components/input-tree/input-tree.stories.ts | 0 .../tree-picker}/components/input-tree/input-tree.test.ts | 0 6 files changed, 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/packages/{core/tree => property-editors/tree-picker}/components/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{core/tree => property-editors/tree-picker}/components/input-tree/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{core/tree => property-editors/tree-picker}/components/input-tree/input-tree.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{core/tree => property-editors/tree-picker}/components/input-tree/input-tree.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{core/tree => property-editors/tree-picker}/components/input-tree/input-tree.test.ts (100%) 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 f12bb43497..a6376a6b04 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 @@ -1,6 +1,5 @@ import { UmbRequestReloadTreeItemChildrenEvent } from './reload-tree-item-children/index.js'; -export * from './components/index.js'; export * from './tree-item/index.js'; export * from './default/index.js'; export * from './data/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/components/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/index.ts 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/property-editors/tree-picker/components/input-tree/input-tree.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.test.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/components/input-tree/input-tree.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.test.ts From 966245abbcf571a4d5bf1667305c4be6f525c07a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:44:32 +0200 Subject: [PATCH 101/323] relative import --- .../tree-picker/property-editor-ui-tree-picker.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts index 47261ec112..6e0b1b4a25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts @@ -1,9 +1,9 @@ +import type { UmbInputTreeElement } from './components/input-tree/index.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbDynamicRootRepository } from '@umbraco-cms/backoffice/dynamic-root'; import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -import type { UmbInputTreeElement } from '@umbraco-cms/backoffice/tree'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbTreePickerSource } from '@umbraco-cms/backoffice/components'; From 85021020ca628c0a1baf768aa0c954246bd3f99c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 13:44:45 +0200 Subject: [PATCH 102/323] global registration --- .../src/packages/property-editors/entry-point.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts index a6a004ace8..dc6d64c9b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts @@ -1 +1,2 @@ import './checkbox-list/components/index.js'; +import './tree-picker/components/index.js'; From 7c3ad9da5b34e578bdec4c2828302a458a47e6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 25 Apr 2024 13:46:33 +0200 Subject: [PATCH 103/323] settings import map --- src/Umbraco.Web.UI.Client/package.json | 1 + src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index a8d5468163..c7543081eb 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -70,6 +70,7 @@ "./resources": "./dist-cms/packages/core/resources/index.js", "./router": "./dist-cms/packages/core/router/index.js", "./section": "./dist-cms/packages/core/section/index.js", + "./settings": "./dist-cms/packages/settings/index.js", "./server-file-system": "./dist-cms/packages/core/server-file-system/index.js", "./sorter": "./dist-cms/packages/core/sorter/index.js", "./static-file": "./dist-cms/packages/static-file/index.js", diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index af06940c67..579e94ca5a 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -88,6 +88,7 @@ "@umbraco-cms/backoffice/resources": ["./src/packages/core/resources/index.ts"], "@umbraco-cms/backoffice/router": ["./src/packages/core/router/index.ts"], "@umbraco-cms/backoffice/section": ["./src/packages/core/section/index.ts"], + "@umbraco-cms/backoffice/settings": ["./src/packages/settings/index.ts"], "@umbraco-cms/backoffice/server-file-system": ["./src/packages/core/server-file-system/index.ts"], "@umbraco-cms/backoffice/sorter": ["./src/packages/core/sorter/index.ts"], "@umbraco-cms/backoffice/static-file": ["./src/packages/static-file/index.ts"], From 3af29a3e697afdb488f46a3b796d5f3554d62408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 25 Apr 2024 13:47:15 +0200 Subject: [PATCH 104/323] const rework --- .../components/backoffice-main.element.ts | 9 +++++---- .../packages/core/router/path-pattern.class.ts | 7 ++++++- .../src/packages/core/section/index.ts | 1 + .../src/packages/core/section/paths.ts | 3 +++ .../tree-picker/tree-picker-modal.element.ts | 18 ++++++++++-------- .../tree-picker/tree-picker-modal.token.ts | 1 + .../modals/document-type-picker-modal.token.ts | 7 ++++--- .../packages/documents/document-types/paths.ts | 7 ++++--- .../document-type-workspace.context.ts | 8 ++++---- .../src/packages/settings/index.ts | 1 + .../src/packages/settings/paths.ts | 6 ++++++ 11 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/section/paths.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/paths.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts index a04f0fad35..edd3ff21f4 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts @@ -1,7 +1,7 @@ import type { UmbBackofficeContext } from '../backoffice.context.js'; import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbSectionContext, UMB_SECTION_CONTEXT } from '@umbraco-cms/backoffice/section'; +import { UmbSectionContext, UMB_SECTION_CONTEXT, UMB_SECTION_PATH_PATTERN } from '@umbraco-cms/backoffice/section'; import type { UmbRoute, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router'; import type { ManifestSection, UmbSectionElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; @@ -16,7 +16,6 @@ export class UmbBackofficeMainElement extends UmbLitElement { @state() private _sections: Array> = []; - private _routePrefix = 'section/'; private _backofficeContext?: UmbBackofficeContext; private _sectionContext?: UmbSectionContext; @@ -56,7 +55,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { } else { return { alias: section.alias, - path: this._routePrefix + (section.manifest as ManifestSection).meta.pathname, + path: UMB_SECTION_PATH_PATTERN.generateLocal({ name: section.manifest!.meta.pathname }), component: () => createExtensionElement(section.manifest!, 'umb-section-default'), setup: (component) => { (component as UmbSectionElement).manifest = section.manifest as ManifestSection; @@ -78,7 +77,9 @@ export class UmbBackofficeMainElement extends UmbLitElement { private _onRouteChange = async (event: UmbRouterSlotChangeEvent) => { const currentPath = event.target.localActiveViewPath || ''; - const section = this._sections.find((s) => this._routePrefix + s.manifest?.meta.pathname === currentPath); + const section = this._sections.find( + (s) => UMB_SECTION_PATH_PATTERN.generateLocal({ name: s.manifest!.meta.pathname }) === currentPath, + ); if (!section) return; await section.asPromise(); if (section.manifest) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts index 31ed8b8b57..3463046395 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/path-pattern.class.ts @@ -25,7 +25,12 @@ export class UmbPathPattern('section/:name'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts index dc441fe8df..0ba176209b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/tree-picker-modal.element.ts @@ -24,6 +24,9 @@ export class UmbTreePickerModalElement { - return { data: createActionData.modalData }; + return { data: createAction.modalData }; }) .onSubmit((value) => { if (value) { this.value = { selection: [value.unique] }; this._submitModal(); } else { - throw new Error('No value returned from workspace modal'); this._rejectModal(); } }) .observeRouteBuilder((routeBuilder) => { const oldPath = this._createPath; this._createPath = - routeBuilder({}) + - createActionData.extendWithPathPattern.generateLocal(createActionData.extendWithPathParams); + routeBuilder({}) + createAction.extendWithPathPattern.generateLocal(createAction.extendWithPathParams); this.requestUpdate('_createPath', oldPath); }); } @@ -110,7 +112,7 @@ export class UmbTreePickerModalElement ${this._createPath ? html` ` : nothing} 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 index 03f5152144..0f00085f53 100644 --- 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 @@ -4,6 +4,7 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { UmbPathPattern, UmbPathPatternParamsType } from '@umbraco-cms/backoffice/router'; export interface UmbTreePickerModalCreateActionData { + label: string; modalData: UmbWorkspaceModalData; modalToken?: UmbModalToken; extendWithPathPattern: UmbPathPattern; 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 2221229a12..b0ca9278c6 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,4 +1,4 @@ -import { UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH } from '../paths.js'; +import { UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN } from '../paths.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentTypeTreeItemModel } from '@umbraco-cms/backoffice/document-type'; import { @@ -12,7 +12,7 @@ import { */ export type UmbDocumentTypePickerModalData = UmbTreePickerModalData< UmbDocumentTypeTreeItemModel, - typeof UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH.PARAMS + typeof UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.PARAMS >; export interface UmbDocumentTypePickerModalValue extends UmbTreePickerModalValue {} @@ -28,11 +28,12 @@ export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< data: { treeAlias: 'Umb.Tree.DocumentType', createAction: { + label: '#content_createEmpty', modalData: { entityType: 'document-type', preset: {}, }, - extendWithPathPattern: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, + extendWithPathPattern: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, extendWithPathParams: { entityType: 'document-type', parentUnique: null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts index c351f94b67..f96d75b927 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/paths.ts @@ -1,3 +1,4 @@ +import { UMB_SETTINGS_SECTION_PATH } from '@umbraco-cms/backoffice/settings'; import type { UmbDocumentTypeEntityTypeUnion } from './entity.js'; import { UmbPathPattern } from '@umbraco-cms/backoffice/router'; @@ -13,10 +14,10 @@ export type UmbCreateDocumentTypeWorkspacePresetType = | UmbCreateDocumentTypeWorkspacePresetTemplateType | UmbCreateDocumentTypeWorkspacePresetElementType; -export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH = new UmbPathPattern<{ +export const UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ entityType: UmbDocumentTypeEntityTypeUnion; parentUnique?: string | null; presetAlias?: UmbCreateDocumentTypeWorkspacePresetType | null; -}>('create/:entityType/:parentUnique/:presetAlias'); +}>('create/:entityType/:parentUnique/:presetAlias', UMB_SETTINGS_SECTION_PATH); -export const UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH = new UmbPathPattern<{ id: string }>('edit/:id'); +export const UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ id: string }>('edit/:id'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index 578df73d21..d927e650a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -2,10 +2,10 @@ import { UmbDocumentTypeDetailRepository } from '../repository/detail/document-t import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentTypeDetailModel } from '../types.js'; import { - UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH, + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT, UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE, - UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH, + UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, type UmbCreateDocumentTypeWorkspacePresetType, } from '../paths.js'; import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element.js'; @@ -96,7 +96,7 @@ export class UmbDocumentTypeWorkspaceContext this.routes.setRoutes([ { - path: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH.toString(), + path: UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.toString(), component: UmbDocumentTypeWorkspaceEditorElement, setup: (_component, info) => { const parentEntityType = info.match.params.entityType; @@ -112,7 +112,7 @@ export class UmbDocumentTypeWorkspaceContext }, }, { - path: UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH.toString(), + path: UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN.toString(), component: UmbDocumentTypeWorkspaceEditorElement, setup: (_component, info) => { this.removeUmbControllerByAlias('isNewRedirectController'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/index.ts new file mode 100644 index 0000000000..b3031d9a5d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/index.ts @@ -0,0 +1 @@ +export * from './paths.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/paths.ts new file mode 100644 index 0000000000..775dfe38cd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/paths.ts @@ -0,0 +1,6 @@ +import { UMB_SECTION_PATH_PATTERN } from '@umbraco-cms/backoffice/section'; + +export const UMB_SETTINGS_SECTION_PATHNAME = 'settings'; +export const UMB_SETTINGS_SECTION_PATH = UMB_SECTION_PATH_PATTERN.generateAbsolute({ + name: UMB_SETTINGS_SECTION_PATHNAME, +}); From bdc80990fb0ba9b8c5eebcbfd9e40d968f365a06 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 14:23:23 +0200 Subject: [PATCH 105/323] move source picker from core components --- .../src/packages/core/components/index.ts | 1 - .../src/packages/property-editors/entry-point.ts | 1 - .../source-picker}/input-tree-picker-source/index.ts | 0 .../input-tree-picker-source.element.ts | 0 ...roperty-editor-ui-tree-picker-source-picker.element.ts | 8 +++++++- .../tree-picker/property-editor-ui-tree-picker.element.ts | 3 +++ 6 files changed, 10 insertions(+), 3 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/{core/components => property-editors/tree-picker/config/source-picker}/input-tree-picker-source/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{core/components => property-editors/tree-picker/config/source-picker}/input-tree-picker-source/input-tree-picker-source.element.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts index b0bee29cb5..0846cc4cf8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts @@ -25,7 +25,6 @@ export * from './input-multi-url/index.js'; export * from './input-number-range/index.js'; export * from './input-radio-button-list/index.js'; export * from './input-slider/index.js'; -export * from './input-tree-picker-source/index.js'; export * from './input-toggle/index.js'; export * from './input-upload-field/index.js'; export * from './multiple-color-picker-input/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts index dc6d64c9b3..a6a004ace8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/entry-point.ts @@ -1,2 +1 @@ import './checkbox-list/components/index.js'; -import './tree-picker/components/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts index d8b1002fda..9a4c91db81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts @@ -1,4 +1,7 @@ -import type { UmbInputTreePickerSourceElement, UmbTreePickerSource } from '@umbraco-cms/backoffice/components'; +import type { + UmbInputTreePickerSourceElement, + UmbTreePickerSource, +} from './input-tree-picker-source/input-tree-picker-source.element.js'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { @@ -7,6 +10,9 @@ import { } from '@umbraco-cms/backoffice/property-editor'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +// import of local component +import './input-tree-picker-source/index.js'; + /** * @element umb-property-editor-ui-tree-picker-source-picker */ diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts index 6e0b1b4a25..6cc9d17564 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts @@ -8,6 +8,9 @@ import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/ import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbTreePickerSource } from '@umbraco-cms/backoffice/components'; +// import of local component +import './components/input-tree/index.js'; + /** * @element umb-property-editor-ui-tree-picker */ From 81f0bf6c2fcf7f1b8ad1ef526757a33ea24076ae Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 14:24:43 +0200 Subject: [PATCH 106/323] rename to content picker --- .../Umbraco.MultiNodeTreePicker.ts | 0 .../{tree-picker => content-picker}/components/index.ts | 0 .../components/input-tree/index.ts | 0 .../components/input-tree/input-tree.element.ts | 0 .../components/input-tree/input-tree.stories.ts | 0 .../components/input-tree/input-tree.test.ts | 0 .../config/source-picker/input-tree-picker-source/index.ts | 0 .../input-tree-picker-source.element.ts | 0 .../config/source-picker/manifests.ts | 0 .../property-editor-ui-tree-picker-source-picker.element.ts | 0 .../property-editor-ui-tree-picker-source-picker.stories.ts | 0 .../property-editor-ui-tree-picker-source-picker.test.ts | 0 .../config/source-type-picker/manifests.ts | 0 ...operty-editor-ui-tree-picker-source-type-picker.element.ts | 0 .../{tree-picker => content-picker}/manifests.ts | 0 .../property-editor-ui-tree-picker.element.ts | 0 .../property-editor-ui-tree-picker.stories.ts | 0 .../property-editor-ui-tree-picker.test.ts | 0 .../src/packages/property-editors/manifests.ts | 4 ++-- 19 files changed, 2 insertions(+), 2 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/Umbraco.MultiNodeTreePicker.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/components/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/components/input-tree/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/components/input-tree/input-tree.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/components/input-tree/input-tree.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/components/input-tree/input-tree.test.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/input-tree-picker-source/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/property-editor-ui-tree-picker-source-picker.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-picker/property-editor-ui-tree-picker-source-picker.test.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-type-picker/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/config/source-type-picker/property-editor-ui-tree-picker-source-type-picker.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/property-editor-ui-tree-picker.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/property-editor-ui-tree-picker.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/property-editors/{tree-picker => content-picker}/property-editor-ui-tree-picker.test.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/Umbraco.MultiNodeTreePicker.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/Umbraco.MultiNodeTreePicker.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/Umbraco.MultiNodeTreePicker.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/Umbraco.MultiNodeTreePicker.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.test.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/components/input-tree/input-tree.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/components/input-tree/input-tree.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.test.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/property-editor-ui-tree-picker-source-picker.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-type-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-type-picker/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-type-picker/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-type-picker/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-type-picker/property-editor-ui-tree-picker-source-type-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-type-picker/property-editor-ui-tree-picker-source-type-picker.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/config/source-type-picker/property-editor-ui-tree-picker-source-type-picker.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-type-picker/property-editor-ui-tree-picker-source-type-picker.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.test.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/property-editors/tree-picker/property-editor-ui-tree-picker.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/property-editor-ui-tree-picker.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/manifests.ts index 7737fe3c94..b2697be517 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/manifests.ts @@ -20,7 +20,7 @@ import { manifests as sliderManifests } from './slider/manifests.js'; import { manifests as textareaManifests } from './textarea/manifests.js'; import { manifests as textBoxManifests } from './text-box/manifests.js'; import { manifests as toggleManifests } from './toggle/manifests.js'; -import { manifests as treePickerManifests } from './tree-picker/manifests.js'; +import { manifests as contentPickerManifests } from './content-picker/manifests.js'; import { manifests as uploadFieldManifests } from './upload-field/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -41,7 +41,7 @@ export const manifests: Array = [ ...textareaManifests, ...textBoxManifests, ...toggleManifests, - ...treePickerManifests, + ...contentPickerManifests, ...uploadFieldManifests, colorEditor, numberRange, From 33d57ad3651da25efc0808baefe6e4e44f881230 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 25 Apr 2024 14:28:23 +0200 Subject: [PATCH 107/323] rename interfaces --- .../input-tree-picker-source.element.ts | 24 +++++++++---------- ...or-ui-tree-picker-source-picker.element.ts | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts index be4d8e0aeb..64b642eb8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/content-picker/config/source-picker/input-tree-picker-source/input-tree-picker-source.element.ts @@ -5,21 +5,21 @@ import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -export type UmbTreePickerSource = { - type: UmbTreePickerSourceType; +export type UmbContentPickerSource = { + type: UmbContentPickerSourceType; id?: string; - dynamicRoot?: UmbTreePickerDynamicRoot; + dynamicRoot?: UmbContentPickerDynamicRoot; }; -export type UmbTreePickerSourceType = 'content' | 'member' | 'media'; +export type UmbContentPickerSourceType = 'content' | 'member' | 'media'; -export type UmbTreePickerDynamicRoot = { +export type UmbContentPickerDynamicRoot = { originAlias: string; originKey?: string; - querySteps?: Array; + querySteps?: Array; }; -export type UmbTreePickerDynamicRootQueryStep = { +export type UmbContentPickerDynamicRootQueryStep = { unique: string; alias: string; anyOfDocTypeKeys?: Array; @@ -31,10 +31,10 @@ export class UmbInputTreePickerSourceElement extends UUIFormControlMixin(UmbLitE return undefined; } - #type: UmbTreePickerSourceType = 'content'; + #type: UmbContentPickerSourceType = 'content'; @property() - public set type(value: UmbTreePickerSourceType) { + public set type(value: UmbContentPickerSourceType) { if (value === undefined) { value = this.#type; } @@ -49,7 +49,7 @@ export class UmbInputTreePickerSourceElement extends UUIFormControlMixin(UmbLitE this.requestUpdate('type', oldValue); } - public get type(): UmbTreePickerSourceType { + public get type(): UmbContentPickerSourceType { return this.#type; } @@ -57,7 +57,7 @@ export class UmbInputTreePickerSourceElement extends UUIFormControlMixin(UmbLitE nodeId?: string; @property({ attribute: false }) - dynamicRoot?: UmbTreePickerDynamicRoot | undefined; + dynamicRoot?: UmbContentPickerDynamicRoot | undefined; @state() _options: Array
Date: Tue, 30 Apr 2024 11:37:30 +0200 Subject: [PATCH 186/323] implement a way to listen if entrypoints have been loaded --- .../extension-initializer-base.ts | 19 +++++++++++++------ .../app-entry-point-extension-initializer.ts | 2 +- ...ffice-entry-point-extension-initializer.ts | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/extension-initializer-base.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/extension-initializer-base.ts index 39b67f29c4..d79d971922 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/extension-initializer-base.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/extension-initializer-base.ts @@ -4,6 +4,7 @@ import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbElement } from '@umbraco-cms/backoffice/element-api'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { ReplaySubject } from '@umbraco-cms/backoffice/external/rxjs'; /** * Base class for extension initializers, which are responsible for loading and unloading extensions. @@ -15,12 +16,14 @@ export abstract class UmbExtensionInitializerBase< protected host; protected extensionRegistry; #extensionMap = new Map(); + #loaded = new ReplaySubject(1); + loaded = this.#loaded.asObservable(); constructor(host: UmbElement, extensionRegistry: UmbExtensionRegistry, manifestType: Key) { super(host); this.host = host; this.extensionRegistry = extensionRegistry; - this.observe(extensionRegistry.byType(manifestType), (extensions) => { + this.observe(extensionRegistry.byType(manifestType), async (extensions) => { this.#extensionMap.forEach((existingExt) => { if (!extensions.find((b) => b.alias === existingExt.alias)) { this.unloadExtension(existingExt); @@ -28,11 +31,15 @@ export abstract class UmbExtensionInitializerBase< } }); - extensions.forEach((extension) => { - if (this.#extensionMap.has(extension.alias)) return; - this.#extensionMap.set(extension.alias, extension); - this.instantiateExtension(extension); - }); + await Promise.all( + extensions.map((extension) => { + if (this.#extensionMap.has(extension.alias)) return; + this.#extensionMap.set(extension.alias, extension); + return this.instantiateExtension(extension); + }), + ); + + this.#loaded.next(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/app-entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/app-entry-point-extension-initializer.ts index 877b118b79..022fb492c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/app-entry-point-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/app-entry-point-extension-initializer.ts @@ -32,7 +32,7 @@ export class UmbAppEntryPointExtensionInitializer extends UmbExtensionInitialize // If the extension has known exports, be sure to run those if (hasInitExport(moduleInstance)) { - moduleInstance.onInit(this.host, this.extensionRegistry); + await moduleInstance.onInit(this.host, this.extensionRegistry); } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/backoffice-entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/backoffice-entry-point-extension-initializer.ts index 29cec8c445..b62e743da6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/backoffice-entry-point-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/initializers/backoffice-entry-point-extension-initializer.ts @@ -32,7 +32,7 @@ export class UmbBackofficeEntryPointExtensionInitializer extends UmbExtensionIni // If the extension has known exports, be sure to run those if (hasInitExport(moduleInstance)) { - moduleInstance.onInit(this.host, this.extensionRegistry); + await moduleInstance.onInit(this.host, this.extensionRegistry); } } } From 4e63a1d974e91d9b7626a28fc18c282c76cd82a3 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:38:03 +0200 Subject: [PATCH 187/323] wait for entrypoints to be loaded through the extension initializer before trying to load them --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 8805c793c8..79cf22f85e 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -17,7 +17,7 @@ import { UmbAppEntryPointExtensionInitializer, umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; -import { filter, first } from '@umbraco-cms/backoffice/external/rxjs'; +import { filter, first, firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; @customElement('umb-app') export class UmbAppElement extends UmbLitElement { @@ -118,7 +118,6 @@ export class UmbAppElement extends UmbLitElement { OpenAPI.BASE = window.location.origin; new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); - new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry); new UUIIconRegistryEssential().attach(this); @@ -141,6 +140,8 @@ export class UmbAppElement extends UmbLitElement { // Register public extensions (login extensions) await new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPublicExtensions(); + const initializer = new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry); + await firstValueFrom(initializer.loaded); // Try to initialise the auth flow and get the runtime status try { From 47bf0f8f7ab7af962eb54f371d8450e73e4f794f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 11:38:37 +0200 Subject: [PATCH 188/323] add audit log repo to document --- .../documents/documents/audit-log/index.ts | 1 + .../document-audit-log.repository.ts | 34 +++++++++++ .../document-audit-log.server.data-source.ts | 57 +++++++++++++++++++ .../documents/audit-log/repository/index.ts | 1 + .../documents/documents/audit-log/types.ts | 18 ++++++ 5 files changed, 111 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/index.ts new file mode 100644 index 0000000000..b8d46eff26 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/index.ts @@ -0,0 +1 @@ +export { UmbDocumentAuditLogRepository } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts new file mode 100644 index 0000000000..6666954243 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts @@ -0,0 +1,34 @@ +import type { UmbAuditLogRequestArgs } from '../types.js'; +import { UmbDocumentAuditLogServerDataSource } from './document-audit-log.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +/** + * Repository for the document audit log + * @export + * @class UmbDocumentAuditLogRepository + * @extends {UmbRepositoryBase} + */ +export class UmbDocumentAuditLogRepository extends UmbRepositoryBase { + #dataSource: UmbDocumentAuditLogServerDataSource; + + /** + * Creates an instance of UmbDocumentAuditLogRepository. + * @param {UmbControllerHost} host + * @memberof UmbDocumentAuditLogRepository + */ + constructor(host: UmbControllerHost) { + super(host); + this.#dataSource = new UmbDocumentAuditLogServerDataSource(host); + } + + /** + * Request the audit log for a document + * @param {UmbAuditLogRequestArgs} args + * @return {*} + * @memberof UmbDocumentAuditLogRepository + */ + async requestAuditLog(args: UmbAuditLogRequestArgs) { + return this.#dataSource.getAuditLog(args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts new file mode 100644 index 0000000000..f35b3587ef --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts @@ -0,0 +1,57 @@ +import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * Server data source for the document audit log + * @export + * @class UmbAuditLogServerDataSource + */ +export class UmbDocumentAuditLogServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbAuditLogServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbAuditLogServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get the audit log for a document + * @param {UmbAuditLogRequestArgs} args + * @return {*} + * @memberof UmbDocumentAuditLogServerDataSource + */ + async getAuditLog(args: UmbAuditLogRequestArgs) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentService.getDocumentByIdAuditLog({ + id: args.unique, + orderDirection: args.orderDirection, + sinceDate: args.sinceDate, + skip: args.skip, + take: args.take, + }), + ); + + if (data) { + const mappedItems = data.items.map((item) => { + return { + user: item.user ? { unique: item.user.id } : null, + timestamp: item.timestamp, + logType: item.logType, + comment: item.comment, + parameters: item.parameters, + }; + }); + + return { data: { items: mappedItems, total: data.total } }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/index.ts new file mode 100644 index 0000000000..3b931d3592 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/index.ts @@ -0,0 +1 @@ +export { UmbDocumentAuditLogRepository } from './document-audit-log.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts new file mode 100644 index 0000000000..62f9072b8d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts @@ -0,0 +1,18 @@ +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; + +export interface UmbAuditLogRequestArgs { + unique: string; + orderDirection?: UmbDirectionType; + sinceDate?: string; + skip?: number; + take?: number; +} + +export interface UmbDocumentAuditLogModel { + user: UmbReferenceByUnique; + timestamp: string; + logType: AuditTypeModel; + comment?: string | null; + parameters?: string | null; +} From 96d004902836e0925d8674ab81d50c47b14a4288 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 11:38:50 +0200 Subject: [PATCH 189/323] render audit log for document --- ...ent-workspace-view-info-history.element.ts | 163 +++++++++--------- ...tion-type-detail-workspace-view.element.ts | 2 - 2 files changed, 77 insertions(+), 88 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 79ca53ee46..66b3847f87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -1,102 +1,77 @@ import { UMB_ROLLBACK_MODAL } from '../../../modals/rollback/index.js'; +import type { UmbDocumentAuditLogModel } from '../../../audit-log/types.js'; +import { UmbDocumentAuditLogRepository } from '../../../audit-log/index.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context-token.js'; import { HistoryTagStyleAndText, TimeOptions } from './utils.js'; -import { UmbAuditLogRepository } from '@umbraco-cms/backoffice/audit-log'; -import { - css, - html, - customElement, - state, - property, - nothing, - repeat, - ifDefined, -} from '@umbraco-cms/backoffice/external/lit'; -import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, state, nothing, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; +import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; +import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbUserItemModel } from '@umbraco-cms/backoffice/user'; +import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; @customElement('umb-document-workspace-view-info-history') export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { - #logRepository: UmbAuditLogRepository; - #itemsPerPage = 10; - - @property() - documentUnique = ''; + @state() + _currentPageNumber = 1; @state() - private _total?: number; + _totalPages = 1; @state() - private _items?: Array; - - @state() - private _currentPage = 1; + private _items?: Array; @state() private _serverUrl = ''; + #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; + #auditLogRepository = new UmbDocumentAuditLogRepository(this); + #pagination = new UmbPaginationManager(); + #userItemRepository = new UmbUserItemRepository(this); + + #userMap = new Map(); + constructor() { super(); - this.#logRepository = new UmbAuditLogRepository(this); + + this.#pagination.setPageSize(2); + this.observe(this.#pagination.currentPage, (number) => (this._currentPageNumber = number)); + this.observe(this.#pagination.totalPages, (number) => (this._totalPages = number)); this.consumeContext(UMB_APP_CONTEXT, (instance) => { this._serverUrl = instance.getServerUrl(); }); + + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; + this.#requestAuditLogs(); + }); } - protected firstUpdated(): void { - this.#getLogs(); - } + async #requestAuditLogs() { + const unique = this.#workspaceContext?.getUnique(); + if (!unique) throw new Error('Document unique is required'); - async #getLogs() { - this._items = undefined; // Reset items to show loader - if (!this.documentUnique) return; - - /*const { data } = await this.#logRepository.getAuditLogByUnique({ - id: this.documentUnique, - orderDirection: DirectionModel.DESCENDING, - skip: (this._currentPage - 1) * this.#itemsPerPage, - take: this.#itemsPerPage, + const { data } = await this.#auditLogRepository.requestAuditLog({ + unique, + skip: this.#pagination.getSkip(), + take: this.#pagination.getPageSize(), }); - if (!data) return; - this._total = data.total; - this._items = data.items; - */ - - //TODO: I think there is an issue with the API (backend) - error with ID. Hacking for now. - // Uncomment previous code and delete the following when issue fixed. - // This should also make it load significantly faster - - const { data } = await this.#logRepository.getLog({ - orderDirection: DirectionModel.DESCENDING, - skip: 0, - take: 99999, - }); - - if (!data) return; - - // Hack list to only get the items for the current document - const list = data.items.filter((item) => item.entity?.id === this.documentUnique); - this._total = list.length; - - // Hack list to only get the items for the current page - this._items = list.slice( - (this._currentPage - 1) * this.#itemsPerPage, - (this._currentPage - 1) * this.#itemsPerPage + this.#itemsPerPage, - ); + if (data) { + this._items = data.items; + this.#pagination.setTotalItems(data.total); + this.#requestAndCacheUserItems(); + } } #onPageChange(event: UUIPaginationEvent) { - if (this._currentPage === event.target.current) return; - this._currentPage = event.target.current; - - this.#getLogs(); + this.#pagination.setCurrentPageNumber(event.target?.current); + this.#requestAuditLogs(); } #onRollbackModalOpen = async () => { @@ -109,6 +84,25 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { notificationContext.peek('positive', { data: { message: this.localize.term('rollback_documentRolledBack') } }); }; + async #requestAndCacheUserItems() { + const allUsers = this._items?.map((item) => item.user.unique).filter(Boolean) as string[]; + const uniqueUsers = [...new Set(allUsers)]; + const uncachedUsers = uniqueUsers.filter((unique) => !this.#userMap.has(unique)); + + // If there are no uncached user items, we don't need to make a request + if (uncachedUsers.length === 0) return; + + const { data: items } = await this.#userItemRepository.requestItems(uncachedUsers); + + if (items) { + items.forEach((item) => { + // cache the user item + this.#userMap.set(item.unique, item); + this.requestUpdate('_items'); + }); + } + } + render() { return html`
@@ -123,7 +117,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement {
${this._items ? this.#renderHistory() : html` `}
- ${this.#renderHistoryPagination()}`; + ${this.#renderPagination()}`; } #renderHistory() { @@ -135,18 +129,14 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { (item) => item.timestamp, (item) => { const { text, style } = HistoryTagStyleAndText(item.logType); - const avatar = Array.isArray(item.userAvatars) ? item.userAvatars[1] : undefined; + const user = this.#userMap.get(item.user.unique); + //const avatar = Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; // TODO: we need to get the absolute url for the avatars from the server - const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; + //const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; return html` - - ${this.localize.term(text.label)} ${this.localize.term(text.desc, item.parameters)} @@ -161,16 +151,17 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { } } - #renderHistoryPagination() { - if (!this._total) return nothing; - - const totalPages = Math.ceil(this._total / this.#itemsPerPage); - - if (totalPages <= 1) return nothing; - - return html``; + #renderPagination() { + return html` + ${this._totalPages > 1 + ? html` + + ` + : nothing} + `; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/views/relation-type-detail-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/views/relation-type-detail-workspace-view.element.ts index 78c3003a55..66655f1cd7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/views/relation-type-detail-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/views/relation-type-detail-workspace-view.element.ts @@ -46,8 +46,6 @@ export class UmbRelationTypeDetailWorkspaceViewElement extends UmbLitElement imp this.observe(this.#paginationManager.currentPage, (number) => (this._currentPageNumber = number)); this.observe(this.#paginationManager.totalPages, (number) => (this._totalPages = number)); - this.#paginationManager.addEventListener('change', () => {}); - this.consumeContext(UMB_RELATION_TYPE_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.#requestRelations(); From e0e04f2f6c2d1ab92da42a9fe8099d37caae0431 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 11:40:23 +0200 Subject: [PATCH 190/323] set page size to 10 --- .../views/info/document-workspace-view-info-history.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 66b3847f87..01ca4467de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -38,7 +38,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { constructor() { super(); - this.#pagination.setPageSize(2); + this.#pagination.setPageSize(10); this.observe(this.#pagination.currentPage, (number) => (this._currentPageNumber = number)); this.observe(this.#pagination.totalPages, (number) => (this._totalPages = number)); From 7aa98ed28d3d17868c3f9fd3f2bea8313bcfb938 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 12:27:45 +0200 Subject: [PATCH 191/323] move pagination into history box --- ...ent-workspace-view-info-history.element.ts | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 01ca4467de..8380d79265 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -105,19 +105,19 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { render() { return html` -
-

History

- - - -
- ${this._items ? this.#renderHistory() : html` `} -
- ${this.#renderPagination()}`; +
+

History

+ + + +
+ ${this._items ? this.#renderHistory() : html` `} + ${this.#renderPagination()} + `; } #renderHistory() { @@ -156,6 +156,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { ${this._totalPages > 1 ? html` @@ -196,10 +197,11 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { flex: 1; display: inline-block; } + .pagination { display: flex; justify-content: center; - margin-top: var(--uui-size-space-4); + margin-top: var(--uui-size-layout-1); } `, ]; From 2ba61312598b7670030915dc91b22456f264b928 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 12:32:39 +0200 Subject: [PATCH 192/323] wip implement audit log for media --- .../packages/media/media/audit-log/index.ts | 1 + .../media/media/audit-log/repository/index.ts | 1 + .../repository/media-audit-log.repository.ts | 34 +++++++++++ .../media-audit-log.server.data-source.ts | 57 +++++++++++++++++++ .../packages/media/media/audit-log/types.ts | 19 +++++++ 5 files changed, 112 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/index.ts new file mode 100644 index 0000000000..8017bb3da6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/index.ts @@ -0,0 +1 @@ +export { UmbMediaAuditLogRepository } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/index.ts new file mode 100644 index 0000000000..583a2b1a56 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/index.ts @@ -0,0 +1 @@ +export { UmbMediaAuditLogRepository } from './media-audit-log.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts new file mode 100644 index 0000000000..a7a94859a7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts @@ -0,0 +1,34 @@ +import type { UmbAuditLogRequestArgs } from '../types.js'; +import { UmbMediaAuditLogServerDataSource } from './media-audit-log.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +/** + * Repository for the Media audit log + * @export + * @class UmbMediaAuditLogRepository + * @extends {UmbRepositoryBase} + */ +export class UmbMediaAuditLogRepository extends UmbRepositoryBase { + #dataSource: UmbMediaAuditLogServerDataSource; + + /** + * Creates an instance of UmbMediaAuditLogRepository. + * @param {UmbControllerHost} host + * @memberof UmbMediaAuditLogRepository + */ + constructor(host: UmbControllerHost) { + super(host); + this.#dataSource = new UmbMediaAuditLogServerDataSource(host); + } + + /** + * Request the audit log for a Media + * @param {UmbAuditLogRequestArgs} args + * @return {*} + * @memberof UmbMediaAuditLogRepository + */ + async requestAuditLog(args: UmbAuditLogRequestArgs) { + return this.#dataSource.getAuditLog(args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts new file mode 100644 index 0000000000..706d9e4cfb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts @@ -0,0 +1,57 @@ +import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * Server data source for the Media audit log + * @export + * @class UmbAuditLogServerDataSource + */ +export class UmbMediaAuditLogServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbAuditLogServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbAuditLogServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get the audit log for a Media + * @param {UmbAuditLogRequestArgs} args + * @return {*} + * @memberof UmbMediaAuditLogServerDataSource + */ + async getAuditLog(args: UmbAuditLogRequestArgs) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + MediaService.getMediaByIdAuditLog({ + id: args.unique, + orderDirection: args.orderDirection, + sinceDate: args.sinceDate, + skip: args.skip, + take: args.take, + }), + ); + + if (data) { + const mappedItems = data.items.map((item) => { + return { + user: item.user ? { unique: item.user.id } : null, + timestamp: item.timestamp, + logType: item.logType, + comment: item.comment, + parameters: item.parameters, + }; + }); + + return { data: { items: mappedItems, total: data.total } }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts new file mode 100644 index 0000000000..f4326b28a8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts @@ -0,0 +1,19 @@ +import type { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; + +export interface UmbAuditLogRequestArgs { + unique: string; + orderDirection?: UmbDirectionType; + sinceDate?: string; + skip?: number; + take?: number; +} + +export interface UmbMediaAuditLogModel { + user: UmbReferenceByUnique; + timestamp: string; + logType: AuditTypeModel; + comment?: string | null; + parameters?: string | null; +} From d7061703dc8e60b5e0accfca8a94125ef1cf2741 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 12:32:48 +0200 Subject: [PATCH 193/323] remove server url --- .../info/document-workspace-view-info-history.element.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 8380d79265..c357aa3798 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -25,9 +25,6 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { @state() private _items?: Array; - @state() - private _serverUrl = ''; - #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #auditLogRepository = new UmbDocumentAuditLogRepository(this); #pagination = new UmbPaginationManager(); @@ -42,10 +39,6 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { this.observe(this.#pagination.currentPage, (number) => (this._currentPageNumber = number)); this.observe(this.#pagination.totalPages, (number) => (this._totalPages = number)); - this.consumeContext(UMB_APP_CONTEXT, (instance) => { - this._serverUrl = instance.getServerUrl(); - }); - this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.#requestAuditLogs(); From 17f1d2af48c90369bca25ef15972d5cbdf63bf87 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 12:34:50 +0200 Subject: [PATCH 194/323] delete audit log package --- .../src/apps/backoffice/backoffice.element.ts | 1 - .../src/packages/audit-log/index.ts | 1 - .../src/packages/audit-log/manifests.ts | 4 - .../repository/audit-log.repository.ts | 68 ---------------- .../repository/audit-log.server.data.ts | 81 ------------------- .../packages/audit-log/repository/index.ts | 2 - .../audit-log/repository/manifests.ts | 13 --- .../src/packages/audit-log/umbraco-package.ts | 9 --- 8 files changed, 179 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index 45186a691a..179676c253 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -11,7 +11,6 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import './components/index.js'; const CORE_PACKAGES = [ - import('../../packages/audit-log/umbraco-package.js'), import('../../packages/block/umbraco-package.js'), import('../../packages/data-type/umbraco-package.js'), import('../../packages/dictionary/umbraco-package.js'), diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts deleted file mode 100644 index 3d76f338dd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts deleted file mode 100644 index a8e101b348..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { manifests as repositoryManifests } from './repository/manifests.js'; -import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifests: Array = [...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts deleted file mode 100644 index 385a2a6ff4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { UmbAuditLogServerDataSource } from './audit-log.server.data.js'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; -import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import type { AuditTypeModel, DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; - -export class UmbAuditLogRepository extends UmbControllerBase { - #dataSource: UmbAuditLogServerDataSource; - #notificationService?: UmbNotificationContext; - #init; - - constructor(host: UmbControllerHost) { - super(host); - this.#dataSource = new UmbAuditLogServerDataSource(host); - - this.#init = new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT, (instance) => { - this.#notificationService = instance; - }).asPromise(); - } - - async getLog({ - orderDirection, - sinceDate, - skip = 0, - take = 100, - }: { - orderDirection?: DirectionModel; - sinceDate?: string; - skip?: number; - take?: number; - }) { - await this.#init; - - return this.#dataSource.getAuditLog({ orderDirection, sinceDate, skip, take }); - } - - async getAuditLogByUnique({ - id, - orderDirection, - skip = 0, - take = 100, - }: { - id: string; - orderDirection?: DirectionModel; - skip?: number; - take?: number; - }) { - await this.#init; - return this.#dataSource.getAuditLogById({ id, orderDirection, skip, take }); - } - - async getAuditLogTypeByLogType({ - logType, - sinceDate, - skip, - take, - }: { - logType: AuditTypeModel; - sinceDate?: string; - skip?: number; - take?: number; - }) { - await this.#init; - return this.#dataSource.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts deleted file mode 100644 index 634ee8eeef..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type { DirectionModel, AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { AuditLogService } 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 Data Type items that fetches data from the server - * @export - * @class UmbAuditLogServerDataSource - */ -export class UmbAuditLogServerDataSource { - #host: UmbControllerHost; - - /** - * Creates an instance of UmbAuditLogServerDataSource. - * @param {UmbControllerHost} host - * @memberof UmbAuditLogServerDataSource - */ - constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Fetches the items for the given ids from the server - * @param {Array} ids - * @return {*} - * @memberof UmbAuditLogServerDataSource - */ - async getAuditLog({ - orderDirection, - sinceDate, - skip, - take, - }: { - orderDirection?: DirectionModel; - sinceDate?: string; - skip?: number; - take?: number; - }) { - return await tryExecuteAndNotify( - this.#host, - AuditLogService.getAuditLog({ orderDirection, sinceDate, skip, take }), - ); - } - - async getAuditLogById({ - id, - orderDirection, - sinceDate, - skip, - take, - }: { - id: string; - orderDirection?: DirectionModel; - sinceDate?: string; - skip?: number; - take?: number; - }) { - return await tryExecuteAndNotify( - this.#host, - AuditLogService.getAuditLogById({ id, orderDirection, sinceDate, skip, take }), - ); - } - - async getAuditLogTypeByLogType({ - logType, - sinceDate, - skip, - take, - }: { - logType: AuditTypeModel; - sinceDate?: string; - skip?: number; - take?: number; - }) { - return await tryExecuteAndNotify( - this.#host, - AuditLogService.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }), - ); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts deleted file mode 100644 index 0b87786128..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { UMB_AUDIT_LOG_REPOSITORY_ALIAS as AUDIT_LOG_REPOSITORY_ALIAS } from './manifests.js'; -export { UmbAuditLogRepository } from './audit-log.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts deleted file mode 100644 index 7c946a2a74..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UmbAuditLogRepository } from './audit-log.repository.js'; -import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; - -export const UMB_AUDIT_LOG_REPOSITORY_ALIAS = 'Umb.Repository.AuditLog'; - -const repository: ManifestRepository = { - type: 'repository', - alias: UMB_AUDIT_LOG_REPOSITORY_ALIAS, - name: 'AuditLog Repository', - api: UmbAuditLogRepository, -}; - -export const manifests: Array = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts deleted file mode 100644 index 5f4f04e17c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const name = 'Umbraco.Core.AuditLog'; -export const extensions = [ - { - name: 'Audit Log Bundle', - alias: 'Umb.Bundle.AuditLog', - type: 'bundle', - js: () => import('./manifests.js'), - }, -]; From 545ba506073a43e47e03edb354e2d74d4e9ad1a5 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 11:35:03 +0100 Subject: [PATCH 195/323] Changed the `skip`/`take` fallback to use a logical OR (`||`) instead of a nullish coalescing (`??`), as the value may be a `NaN` or even `0`. --- .../repository/document-collection.server.data-source.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts index 6c726464d5..99091d6d97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts @@ -24,8 +24,8 @@ export class UmbDocumentCollectionServerDataSource implements UmbCollectionDataS orderCulture: query.orderCulture ?? 'en-US', orderDirection: query.orderDirection === 'asc' ? DirectionModel.ASCENDING : DirectionModel.DESCENDING, filter: query.filter, - skip: query.skip ?? 0, - take: query.take ?? 100, + skip: query.skip || 0, + take: query.take || 100, }; const { data, error } = await tryExecuteAndNotify(this.#host, DocumentService.getCollectionDocumentById(params)); From 0186527c44aa8d4c1fc94f908001dd401dd4948d Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 11:37:15 +0100 Subject: [PATCH 196/323] Temporary fix for the child name button to navigate through to the target document. --- .../document-table-column-name.element.ts | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts index 2ee3f9321e..100d870c1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts @@ -1,7 +1,7 @@ import type { UmbDocumentCollectionItemModel } from '../../../types.js'; import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +//import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import type { UmbTableColumn, UmbTableColumnLayoutElement, UmbTableItem } from '@umbraco-cms/backoffice/components'; @customElement('umb-document-table-column-name') @@ -21,30 +21,33 @@ export class UmbDocumentTableColumnNameElement extends UmbLitElement implements constructor() { super(); - new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) - .addAdditionalPath('document') - .onSetup(() => { - return { data: { entityType: 'document', preset: {} } }; - }) - .observeRouteBuilder((routeBuilder) => { - this._editDocumentPath = routeBuilder({}); - }); + // new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + // .addAdditionalPath('document') + // .onSetup(() => { + // return { data: { entityType: 'document', preset: {} } }; + // }) + // .observeRouteBuilder((routeBuilder) => { + // this._editDocumentPath = routeBuilder({}); + // }); + + this._editDocumentPath = '/section/content/workspace/document/'; } - #onClick(event: Event) { - // TODO: [LK] Review the `stopPropagation` usage, as it causes a page reload. - // But we still need a say to prevent the `umb-table` from triggering a selection event. - event.stopPropagation(); - } + // #onClick(event: Event) { + // // TODO: [LK] Review the `stopPropagation` usage, as it causes a page reload. + // // But we still need a say to prevent the `umb-table` from triggering a selection event. + // event.stopPropagation(); + // } render() { - return html``; + return html` + + `; } static styles = [ From 026a52847a07d00541255ab05570fd4b3e9d1f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 12:56:40 +0200 Subject: [PATCH 197/323] move proxy event handler --- .../section-sidebar-context-menu.element.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts index 16cd02b42e..7e4c545168 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts @@ -41,19 +41,6 @@ export class UmbSectionSidebarContextMenuElement extends UmbLitElement { this.removeUmbControllerByAlias('_observeHeadline'); } }); - - this.addEventListener(UMB_CONTENT_REQUEST_EVENT_TYPE, this.#proxyContextRequests as EventListener); - } - - #proxyContextRequests(event: UmbContextRequestEvent) { - if (!this.#sectionSidebarContext) return; - // Note for this hack (The if-sentence): [NL] - // We do not currently have a good enough control to ensure that the proxy is last, meaning if another context is provided at this element, it might respond after the proxy event has been dispatched. - // To avoid such this hack just prevents proxying the event if its a request for its own context. - if (event.contextAlias !== UMB_SECTION_SIDEBAR_CONTEXT.contextAlias) { - event.stopImmediatePropagation(); - this.#sectionSidebarContext.getContextElement()?.dispatchEvent(event.clone()); - } } #observeEntityModel() { @@ -81,6 +68,17 @@ export class UmbSectionSidebarContextMenuElement extends UmbLitElement { this.#closeContextMenu(); } + #proxyContextRequests(event: UmbContextRequestEvent) { + if (!this.#sectionSidebarContext) return; + // Note for this hack (The if-sentence): [NL] + // We do not currently have a good enough control to ensure that the proxy is last, meaning if another context is provided at this element, it might respond after the proxy event has been dispatched. + // To avoid such this hack just prevents proxying the event if its a request for its own context. + if (event.contextAlias !== UMB_SECTION_SIDEBAR_CONTEXT.contextAlias) { + event.stopImmediatePropagation(); + this.#sectionSidebarContext.getContextElement()?.dispatchEvent(event.clone()); + } + } + render() { return html` ${this.#renderBackdrop()} @@ -99,7 +97,7 @@ export class UmbSectionSidebarContextMenuElement extends UmbLitElement { #renderModal() { return this._isOpen && this._unique !== undefined && this._entityType - ? html`
+ ? html`
${this._headline ? html`

${this.localize.string(this._headline)}

` : nothing} Date: Tue, 30 Apr 2024 13:25:56 +0200 Subject: [PATCH 198/323] register conditions --- .../core/recycle-bin/conditions/manifests.ts | 3 ++- .../src/packages/core/recycle-bin/manifests.ts | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts index 2c2000967c..093a0c39c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts @@ -1,3 +1,4 @@ +import { manifest as isTrashedManifest } from './is-trashed/is-trashed.condition.manifest.js'; import { manifest as isNotTrashedManifest } from './is-not-trashed/is-not-trashed.condition.manifest.js'; -export const manifests = [isNotTrashedManifest]; +export const manifests = [isTrashedManifest, isNotTrashedManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts index 7a48f5b4e3..1a0c4526d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts @@ -1,10 +1,12 @@ -import { manifests as trashEntityActionManifests } from '../recycle-bin/entity-action/trash/manifests.js'; -import { manifests as restoreFromRecycleBinEntityActionManifests } from '../recycle-bin/entity-action/restore-from-recycle-bin/manifests.js'; -import { manifests as emptyRecycleBinEntityActionManifests } from '../recycle-bin/entity-action/empty-recycle-bin/manifests.js'; +import { manifests as trashEntityActionManifests } from './entity-action/trash/manifests.js'; +import { manifests as restoreFromRecycleBinEntityActionManifests } from './entity-action/restore-from-recycle-bin/manifests.js'; +import { manifests as emptyRecycleBinEntityActionManifests } from './entity-action/empty-recycle-bin/manifests.js'; +import { manifests as conditionManifests } from './conditions/manifests.js'; import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ - ...trashEntityActionManifests, - ...restoreFromRecycleBinEntityActionManifests, + ...conditionManifests, ...emptyRecycleBinEntityActionManifests, + ...restoreFromRecycleBinEntityActionManifests, + ...trashEntityActionManifests, ]; From 31a044c31bfa1f95247e7b94c0b5a377ed16151c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 13:44:07 +0200 Subject: [PATCH 199/323] align element type with modals --- .../core/section/section-sidebar/section-sidebar.context.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar/section-sidebar.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar/section-sidebar.context.ts index 69d9348efb..5fad1202bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar/section-sidebar.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar/section-sidebar.context.ts @@ -17,19 +17,19 @@ export class UmbSectionSidebarContext extends UmbContextBase(undefined); headline = this.#headline.asObservable(); - #contextElement: HTMLElement | undefined = undefined; + #contextElement: Element | undefined = undefined; constructor(host: UmbControllerHost) { super(host, UMB_SECTION_SIDEBAR_CONTEXT); } - toggleContextMenu(host: HTMLElement, args: UmbOpenContextMenuArgs) { + toggleContextMenu(host: Element, args: UmbOpenContextMenuArgs) { this.openContextMenu(host, args); } // TODO: we wont get notified about tree item name changes because we don't have a subscription // we need to figure out how we best can handle this when we only know the entity and unique id - openContextMenu(host: HTMLElement, args: UmbOpenContextMenuArgs) { + openContextMenu(host: Element, args: UmbOpenContextMenuArgs) { this.#entityType.setValue(args.entityType); this.#unique.setValue(args.unique); this.#headline.setValue(args.headline); From 9f6f1ecfd9eb0ccbdfe5fe23f8daddab8418eabe Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 13:44:18 +0200 Subject: [PATCH 200/323] pass host element instead of class --- .../tree/tree-item/tree-item-base/tree-item-context-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 93825c96df..d86bd67532 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 @@ -180,7 +180,7 @@ export abstract class UmbTreeItemContextBase Date: Tue, 30 Apr 2024 13:44:54 +0200 Subject: [PATCH 201/323] testing is trashed context --- .../documents/documents/entity-actions/create/manifests.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 82338de7b5..873c1e202f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -20,6 +20,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE], }, + { + alias: 'Umb.Condition.IsTrashed', + }, ], }, ]; From 5058a3fa5f06b70d182b2a00a17884afae7fc807 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 14:02:58 +0200 Subject: [PATCH 202/323] add audit log generic types --- src/Umbraco.Web.UI.Client/package.json | 2 +- .../audit-log-data-source.interface.ts | 6 ++++++ .../audit-log-repository.interface.ts | 6 ++++++ .../src/packages/core/audit-log/index.ts | 3 +++ .../src/packages/core/audit-log/types.ts | 19 +++++++++++++++++++ .../document-audit-log.repository.ts | 8 ++++++-- .../document-audit-log.server.data-source.ts | 10 ++++++---- .../documents/documents/audit-log/types.ts | 19 ++----------------- src/Umbraco.Web.UI.Client/tsconfig.json | 2 +- 9 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 6bc051b292..327b456bd5 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -14,7 +14,7 @@ "./localization-api": "./dist-cms/libs/localization-api/index.js", "./observable-api": "./dist-cms/libs/observable-api/index.js", "./action": "./dist-cms/packages/core/action/index.js", - "./audit-log": "./dist-cms/packages/audit-log/index.js", + "./audit-log": "./dist-cms/packages/core/audit-log/index.js", "./auth": "./dist-cms/packages/core/auth/index.js", "./block-grid": "./dist-cms/packages/block/block-grid/index.js", "./block-list": "./dist-cms/packages/block/block-list/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-data-source.interface.ts new file mode 100644 index 0000000000..74dbc1d5e9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-data-source.interface.ts @@ -0,0 +1,6 @@ +import type { UmbAuditLogModel, UmbAuditLogRequestArgs } from './types.js'; +import type { UmbDataSourceResponse, UmbPagedModel } from '@umbraco-cms/backoffice/repository'; + +export interface UmbAuditLogDataSource { + getAuditLog(args: UmbAuditLogRequestArgs): Promise>>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts new file mode 100644 index 0000000000..1252a7075c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts @@ -0,0 +1,6 @@ +import type { UmbAuditLogModel, UmbAuditLogRequestArgs } from './types.js'; +import type { UmbRepositoryBase, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbAuditLogRepository extends UmbRepositoryBase { + requestAuditLog(args: UmbAuditLogRequestArgs): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts new file mode 100644 index 0000000000..8bf3be0865 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts @@ -0,0 +1,3 @@ +export type { UmbAuditLogRepository } from './audit-log-repository.interface.js'; +export type { UmbAuditLogDataSource } from './audit-log-data-source.interface.js'; +export type { UmbAuditLogModel, UmbAuditLogRequestArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts new file mode 100644 index 0000000000..f155a54fbe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts @@ -0,0 +1,19 @@ +import type { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; + +export interface UmbAuditLogModel { + user: UmbReferenceByUnique | null; + timestamp: string; + logType: AuditTypeModel; + comment?: string | null; + parameters?: string | null; +} + +export interface UmbAuditLogRequestArgs { + unique: string; + orderDirection?: UmbDirectionType; + sinceDate?: string; + skip?: number; + take?: number; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts index 6666954243..cdf014c117 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.repository.ts @@ -1,4 +1,5 @@ -import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbAuditLogRepository, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbDocumentAuditLogModel } from '../types.js'; import { UmbDocumentAuditLogServerDataSource } from './document-audit-log.server.data-source.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; @@ -9,7 +10,10 @@ import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; * @class UmbDocumentAuditLogRepository * @extends {UmbRepositoryBase} */ -export class UmbDocumentAuditLogRepository extends UmbRepositoryBase { +export class UmbDocumentAuditLogRepository + extends UmbRepositoryBase + implements UmbAuditLogRepository +{ #dataSource: UmbDocumentAuditLogServerDataSource; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts index f35b3587ef..220a5a1355 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts @@ -1,5 +1,7 @@ -import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbAuditLogDataSource, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbDocumentAuditLogModel } from '../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -8,7 +10,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @export * @class UmbAuditLogServerDataSource */ -export class UmbDocumentAuditLogServerDataSource { +export class UmbDocumentAuditLogServerDataSource implements UmbAuditLogDataSource { #host: UmbControllerHost; /** @@ -31,7 +33,7 @@ export class UmbDocumentAuditLogServerDataSource { this.#host, DocumentService.getDocumentByIdAuditLog({ id: args.unique, - orderDirection: args.orderDirection, + orderDirection: args.orderDirection as DirectionModel, // TODO: Fix type cast sinceDate: args.sinceDate, skip: args.skip, take: args.take, @@ -39,7 +41,7 @@ export class UmbDocumentAuditLogServerDataSource { ); if (data) { - const mappedItems = data.items.map((item) => { + const mappedItems: Array = data.items.map((item) => { return { user: item.user ? { unique: item.user.id } : null, timestamp: item.timestamp, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts index 62f9072b8d..a6f3ed36cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts @@ -1,18 +1,3 @@ -import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; -import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; +import type { UmbAuditLogModel } from '@umbraco-cms/backoffice/audit-log'; -export interface UmbAuditLogRequestArgs { - unique: string; - orderDirection?: UmbDirectionType; - sinceDate?: string; - skip?: number; - take?: number; -} - -export interface UmbDocumentAuditLogModel { - user: UmbReferenceByUnique; - timestamp: string; - logType: AuditTypeModel; - comment?: string | null; - parameters?: string | null; -} +export interface UmbDocumentAuditLogModel extends UmbAuditLogModel {} diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index a44a5b7025..1a5c3a0f7d 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -32,7 +32,7 @@ "@umbraco-cms/backoffice/localization-api": ["./src/libs/localization-api/index.ts"], "@umbraco-cms/backoffice/observable-api": ["./src/libs/observable-api/index.ts"], "@umbraco-cms/backoffice/action": ["./src/packages/core/action/index.ts"], - "@umbraco-cms/backoffice/audit-log": ["./src/packages/audit-log/index.ts"], + "@umbraco-cms/backoffice/audit-log": ["./src/packages/core/audit-log/index.ts"], "@umbraco-cms/backoffice/auth": ["./src/packages/core/auth/index.ts"], "@umbraco-cms/backoffice/block-grid": ["./src/packages/block/block-grid/index.ts"], "@umbraco-cms/backoffice/block-list": ["./src/packages/block/block-list/index.ts"], From 2ec6ec9498b1c98bfa91db0df431f3f21ea7d200 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 14:33:54 +0200 Subject: [PATCH 203/323] clean up types --- .../src/mocks/data/audit-log.data.ts | 4 -- .../audit-log-repository.interface.ts | 6 +-- .../src/packages/core/audit-log/index.ts | 1 + .../src/packages/core/audit-log/types.ts | 5 +- .../src/packages/core/audit-log/utils.ts | 6 +++ .../document-audit-log.server.data-source.ts | 3 +- .../documents/documents/audit-log/types.ts | 3 +- .../documents/documents/audit-log/utils.ts | 49 +++++++++++++++++++ .../repository/media-audit-log.repository.ts | 8 ++- .../media-audit-log.server.data-source.ts | 13 +++-- .../packages/media/media/audit-log/types.ts | 21 ++------ .../packages/media/media/audit-log/utils.ts | 15 ++++++ 12 files changed, 97 insertions(+), 37 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/audit-log/utils.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts index 590190de7e..cd881ce86d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts @@ -15,7 +15,6 @@ const documentId = documentData[0].id; export const logs: Array = [ { user: { id: userId }, - entity: { id: documentId, type: 'document' }, timestamp: '2021-09-14T09:32:49.0000000Z', logType: AuditTypeModel.SAVE, comment: null, @@ -23,7 +22,6 @@ export const logs: Array = [ }, { user: { id: userId }, - entity: { id: documentId, type: 'document' }, timestamp: '2022-09-14T11:30:49.0000000Z', logType: AuditTypeModel.SAVE, comment: null, @@ -31,7 +29,6 @@ export const logs: Array = [ }, { user: { id: userId }, - entity: { id: documentId, type: 'document' }, timestamp: '2022-09-15T09:35:49.0000000Z', logType: AuditTypeModel.SAVE, comment: null, @@ -39,7 +36,6 @@ export const logs: Array = [ }, { user: { id: userId }, - entity: { id: documentId, type: 'document' }, timestamp: '2023-01-09T12:00:00.0000000Z', logType: AuditTypeModel.PUBLISH, comment: null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts index 1252a7075c..fc9e7309ba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/audit-log-repository.interface.ts @@ -1,6 +1,6 @@ import type { UmbAuditLogModel, UmbAuditLogRequestArgs } from './types.js'; -import type { UmbRepositoryBase, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbPagedModel, UmbRepositoryBase, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; -export interface UmbAuditLogRepository extends UmbRepositoryBase { - requestAuditLog(args: UmbAuditLogRequestArgs): Promise>; +export interface UmbAuditLogRepository> extends UmbRepositoryBase { + requestAuditLog(args: UmbAuditLogRequestArgs): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts index 8bf3be0865..1e96536b38 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/index.ts @@ -1,3 +1,4 @@ export type { UmbAuditLogRepository } from './audit-log-repository.interface.js'; export type { UmbAuditLogDataSource } from './audit-log-data-source.interface.js'; export type { UmbAuditLogModel, UmbAuditLogRequestArgs } from './types.js'; +export type { UmbAuditLogType } from './utils.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts index f155a54fbe..f027c9bd5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts @@ -1,11 +1,10 @@ -import type { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; -export interface UmbAuditLogModel { +export interface UmbAuditLogModel { user: UmbReferenceByUnique | null; timestamp: string; - logType: AuditTypeModel; + logType: LogType; comment?: string | null; parameters?: string | null; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/utils.ts new file mode 100644 index 0000000000..04afaaf6c6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/utils.ts @@ -0,0 +1,6 @@ +export type UmbAuditLogType = 'System' | 'Custom'; + +export const UmbAuditLog = Object.freeze({ + CUSTOM: 'Custom', + SYSTEM: 'System', +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts index 220a5a1355..80664db33b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts @@ -1,5 +1,6 @@ import type { UmbAuditLogDataSource, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; import type { UmbDocumentAuditLogModel } from '../types.js'; +import type { UmbDocumentAuditLogType } from '../utils.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; @@ -45,7 +46,7 @@ export class UmbDocumentAuditLogServerDataSource implements UmbAuditLogDataSourc return { user: item.user ? { unique: item.user.id } : null, timestamp: item.timestamp, - logType: item.logType, + logType: item.logType as UmbDocumentAuditLogType, // TODO: Fix type cast comment: item.comment, parameters: item.parameters, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts index a6f3ed36cd..10d55ee045 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts @@ -1,3 +1,4 @@ import type { UmbAuditLogModel } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbDocumentAuditLogType } from './utils.js'; -export interface UmbDocumentAuditLogModel extends UmbAuditLogModel {} +export interface UmbDocumentAuditLogModel extends UmbAuditLogModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts new file mode 100644 index 0000000000..e8ab66d600 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts @@ -0,0 +1,49 @@ +import type { UmbAuditLogType } from '@umbraco-cms/backoffice/audit-log'; + +export type UmbDocumentAuditLogType = + | 'New' + | 'Save' + | 'SaveVariant' + | 'Open' + | 'Delete' + | 'Publish' + | 'PublishVariant' + | 'SendToPublish' + | 'SendToPublishVariant' + | 'Unpublish' + | 'UnpublishVariant' + | 'Move' + | 'Copy' + | 'AssignDomain' + | 'PublicAccess' + | 'Sort' + | 'Notify' + | 'RollBack' + | 'ContentVersionPreventCleanup' + | 'ContentVersionEnableCleanup' + | UmbAuditLogType; + +export const UmbDocumentAuditLog = Object.freeze({ + ASSIGN_DOMAIN: 'AssignDomain', + CONTENT_VERSION_ENABLE_CLEANUP: 'ContentVersionEnableCleanup', + CONTENT_VERSION_PREVENT_CLEANUP: 'ContentVersionPreventCleanup', + COPY: 'Copy', + CUSTOM: 'Custom', + DELETE: 'Delete', + MOVE: 'Move', + NEW: 'New', + NOTIFY: 'Notify', + OPEN: 'Open', + PUBLIC_ACCESS: 'PublicAccess', + PUBLISH_VARIANT: 'PublishVariant', + PUBLISH: 'Publish', + ROLL_BACK: 'RollBack', + SAVE_VARIANT: 'SaveVariant', + SAVE: 'Save', + SEND_TO_PUBLISH_VARIANT: 'SendToPublishVariant', + SEND_TO_PUBLISH: 'SendToPublish', + SORT: 'Sort', + SYSTEM: 'System', + UNPUBLISH_VARIANT: 'UnpublishVariant', + UNPUBLISH: 'Unpublish', +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts index a7a94859a7..0ad4d83073 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.repository.ts @@ -1,4 +1,5 @@ -import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbAuditLogRepository, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbMediaAuditLogModel } from '../types.js'; import { UmbMediaAuditLogServerDataSource } from './media-audit-log.server.data-source.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; @@ -9,7 +10,10 @@ import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; * @class UmbMediaAuditLogRepository * @extends {UmbRepositoryBase} */ -export class UmbMediaAuditLogRepository extends UmbRepositoryBase { +export class UmbMediaAuditLogRepository + extends UmbRepositoryBase + implements UmbAuditLogRepository +{ #dataSource: UmbMediaAuditLogServerDataSource; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts index 706d9e4cfb..fa0550df34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts @@ -1,5 +1,8 @@ -import type { UmbAuditLogRequestArgs } from '../types.js'; +import type { UmbAuditLogDataSource, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbMediaAuditLogModel } from '../types.js'; +import type { UmbMediaAuditLogType } from '../utils.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -8,7 +11,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @export * @class UmbAuditLogServerDataSource */ -export class UmbMediaAuditLogServerDataSource { +export class UmbMediaAuditLogServerDataSource implements UmbAuditLogDataSource { #host: UmbControllerHost; /** @@ -31,7 +34,7 @@ export class UmbMediaAuditLogServerDataSource { this.#host, MediaService.getMediaByIdAuditLog({ id: args.unique, - orderDirection: args.orderDirection, + orderDirection: args.orderDirection as DirectionModel, // TODO: fix this type cast sinceDate: args.sinceDate, skip: args.skip, take: args.take, @@ -39,11 +42,11 @@ export class UmbMediaAuditLogServerDataSource { ); if (data) { - const mappedItems = data.items.map((item) => { + const mappedItems: Array = data.items.map((item) => { return { user: item.user ? { unique: item.user.id } : null, timestamp: item.timestamp, - logType: item.logType, + logType: item.logType as UmbMediaAuditLogType, // TODO: fix this type cast comment: item.comment, parameters: item.parameters, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts index f4326b28a8..81de81c97d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts @@ -1,19 +1,4 @@ -import type { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; -import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; +import type { UmbAuditLogModel } from '@umbraco-cms/backoffice/audit-log'; +import type { UmbMediaAuditLogType } from './utils.js'; -export interface UmbAuditLogRequestArgs { - unique: string; - orderDirection?: UmbDirectionType; - sinceDate?: string; - skip?: number; - take?: number; -} - -export interface UmbMediaAuditLogModel { - user: UmbReferenceByUnique; - timestamp: string; - logType: AuditTypeModel; - comment?: string | null; - parameters?: string | null; -} +export interface UmbMediaAuditLogModel extends UmbAuditLogModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts new file mode 100644 index 0000000000..3f98985f19 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts @@ -0,0 +1,15 @@ +import type { UmbAuditLogType } from '@umbraco-cms/backoffice/audit-log'; + +export type UmbMediaAuditLogType = 'New' | 'Save' | 'Open' | 'Delete' | 'Move' | 'Copy' | 'Sort' | UmbAuditLogType; + +export const UmbMediaAuditLog = Object.freeze({ + COPY: 'Copy', + CUSTOM: 'Custom', + DELETE: 'Delete', + MOVE: 'Move', + NEW: 'New', + OPEN: 'Open', + SAVE: 'Save', + SORT: 'Sort', + SYSTEM: 'System', +}); From f654c8738640f39c5a23bd7c46d9d27b4bd91b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 14:47:05 +0200 Subject: [PATCH 204/323] correct advanced tab name --- .../packages/block/block-grid/workspace/views/manifests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts index e550511e6a..e50774cc26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts @@ -27,7 +27,7 @@ export const workspaceViews: Array = [ js: () => import('./block-grid-type-workspace-view-areas.element.js'), weight: 1000, meta: { - label: '#blockEditor_areas', + label: '#blockEditor_tabAreas', pathname: 'areas', icon: 'icon-grid', }, @@ -45,7 +45,7 @@ export const workspaceViews: Array = [ js: () => import('./block-grid-type-workspace-view-advanced.element.js'), weight: 1000, meta: { - label: '#blockEditor_tabAreas', + label: '#blockEditor_tabAdvanced', pathname: 'advanced', icon: 'icon-wrench', }, From 365df814a6093384077000519eb804511299e56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 14:47:16 +0200 Subject: [PATCH 205/323] get first element type name when only one block type --- .../block-grid-entries.element.ts | 27 +++++++++++- .../context/block-grid-entries.context.ts | 44 +++++++++++++++---- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts index 5048726af1..32c12e08b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts @@ -147,6 +147,12 @@ export class UmbBlockGridEntriesElement extends UmbLitElement { @state() private _areaKey?: string | null; + @state() + private _canCreate?: boolean; + + @state() + private _singleBlockTypeName?: string; + @state() private _styleElement?: HTMLLinkElement; @@ -162,6 +168,21 @@ export class UmbBlockGridEntriesElement extends UmbLitElement { this.requestUpdate('layoutEntries', oldValue); }); + this.observe(this.#context.amountOfAllowedBlockTypes, (length) => { + this._canCreate = length > 0; + if (length === 1) { + this.observe( + this.#context.firstAllowedBlockTypeName(), + (firstAllowedName) => { + this._singleBlockTypeName = firstAllowedName; + }, + 'observeSingleBlockTypeName', + ); + } else { + this.removeUmbControllerByAlias('observeSingleBlockTypeName'); + } + }); + this.#context.getManager().then((manager) => { this.observe( manager.layoutStylesheet, @@ -193,12 +214,14 @@ export class UmbBlockGridEntriesElement extends UmbLitElement { `, )}
- ${this._areaKey === null || this._layoutEntries.length === 0 + ${this._canCreate && (this._areaKey === null || this._layoutEntries.length === 0) ? html` ${this._areaKey === null ? html` ([], (x) => x.contentElementTypeKey); + public readonly allowedBlockTypes = this.#allowedBlockTypes.asObservable(); + public readonly amountOfAllowedBlockTypes = this.#allowedBlockTypes.asObservablePart((x) => x.length); + + firstAllowedBlockTypeName() { + if (!this._manager) { + throw new Error('Manager not ready'); + } + + const nameState = new UmbStringState(undefined); + this.observe(this.allowedBlockTypes, (x) => { + if (x.length === 1) { + this.observe( + this._manager!.contentTypeNameOf(x[0].contentElementTypeKey), + (name) => { + nameState.setValue(name); + }, + 'getFirstAllowedBlockTypeName', + ); + } else { + this.removeUmbControllerByAlias('getFirstAllowedBlockTypeName'); + } + }); + + return nameState.asObservable(); + } + setParentUnique(contentUdi: string | null) { this.#parentUnique = contentUdi; // Notice pathFolderName can be removed when we have switched to use a proper GUID/ID/KEY. [NL] @@ -66,7 +93,7 @@ export class UmbBlockGridEntriesContext this.consumeContext(UMB_BLOCK_GRID_ENTRY_CONTEXT, (blockGridEntry) => { this.#parentEntry = blockGridEntry; this.#gotBlockParentEntry(); // is not used at this point. [NL] - }).asPromise(); + }); this.#catalogueModal = new UmbModalRouteRegistrationController(this, UMB_BLOCK_CATALOGUE_MODAL) .addUniquePaths(['propertyAlias', 'variantId', 'parentUnique', 'areaKey']) @@ -76,7 +103,7 @@ export class UmbBlockGridEntriesContext const index = routingInfo.index ? parseInt(routingInfo.index) : -1; return { data: { - blocks: this.#retrieveAllowedElementTypes(), + blocks: this.#allowedBlockTypes.getValue(), blockGroups: this._manager?.getBlockGroups() ?? [], openClipboard: routingInfo.view === 'clipboard', blockOriginData: { index: index, areaKey: this.#areaKey, parentUnique: this.#parentUnique }, @@ -92,6 +119,8 @@ export class UmbBlockGridEntriesContext protected _gotBlockManager() { if (!this._manager) return; + this.#allowedBlockTypes.setValue(this.#retrieveAllowedElementTypes()); + this.observe( this._manager.propertyAlias, (alias) => { @@ -280,13 +309,10 @@ export class UmbBlockGridEntriesContext */ allowDrop(contentUdi: string) { const content = this._manager?.getContentOf(contentUdi); - if (!content) return false; + const allowedBlocks = this.#allowedBlockTypes.getValue(); + if (!content || !allowedBlocks) return false; - return ( - this.#retrieveAllowedElementTypes() - .map((x) => x.contentElementTypeKey) - .indexOf(content.contentTypeKey) !== -1 - ); + return allowedBlocks.map((x) => x.contentElementTypeKey).indexOf(content.contentTypeKey) !== -1; } onDragStart() { From 304ae710b8b8b400e5babe0cbdad6234386761f3 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 13:55:43 +0100 Subject: [PATCH 206/323] Fixes the child name button to open the document editor modal. --- .../document-table-column-name.element.ts | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts index 100d870c1d..1d9e39d4b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts @@ -1,8 +1,9 @@ import type { UmbDocumentCollectionItemModel } from '../../../types.js'; import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -//import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import type { UmbTableColumn, UmbTableColumnLayoutElement, UmbTableItem } from '@umbraco-cms/backoffice/components'; +import type { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-document-table-column-name') export class UmbDocumentTableColumnNameElement extends UmbLitElement implements UmbTableColumnLayoutElement { @@ -21,32 +22,29 @@ export class UmbDocumentTableColumnNameElement extends UmbLitElement implements constructor() { super(); - // new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) - // .addAdditionalPath('document') - // .onSetup(() => { - // return { data: { entityType: 'document', preset: {} } }; - // }) - // .observeRouteBuilder((routeBuilder) => { - // this._editDocumentPath = routeBuilder({}); - // }); - - this._editDocumentPath = '/section/content/workspace/document/'; + new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath('document') + .onSetup(() => { + return { data: { entityType: 'document', preset: {} } }; + }) + .observeRouteBuilder((routeBuilder) => { + this._editDocumentPath = routeBuilder({}); + }); } - // #onClick(event: Event) { - // // TODO: [LK] Review the `stopPropagation` usage, as it causes a page reload. - // // But we still need a say to prevent the `umb-table` from triggering a selection event. - // event.stopPropagation(); - // } + #onClick(event: Event & { target: UUIButtonElement }) { + event.preventDefault(); + event.stopPropagation(); + window.history.pushState({}, '', event.target.href); + } render() { return html` + label=${this.value.name} + @click=${this.#onClick}> `; } From 48706124418f746a56f76cf5f2674e2d154437f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 15:25:14 +0200 Subject: [PATCH 207/323] fix --- .../property-editor-ui-picker-modal.element.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 7a1894f23f..6c19375a8e 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 @@ -30,14 +30,13 @@ export class UmbPropertyEditorUIPickerModalElement extends UmbModalBaseElement< connectedCallback(): void { super.connectedCallback(); - this._submitLabel = this.data?.submitLabel ?? this._submitLabel; + // TODO: We never parse on a submit label, so this seem weird as we don't enable this of other places. + //this._submitLabel = this.data?.submitLabel ?? this._submitLabel; this.#usePropertyEditorUIs(); } #usePropertyEditorUIs() { - if (!this.data) return; - this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { // Only include Property Editor UIs which has Property Editor Schema Alias this._propertyEditorUIs = propertyEditorUIs.filter( From bdf8dd465b24cddc3a8336abd1746a65459c4740 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 15:26:15 +0200 Subject: [PATCH 208/323] align media and document history --- .../src/packages/core/audit-log/types.ts | 2 +- .../document-audit-log.server.data-source.ts | 2 +- .../audit-log/{utils.ts => utils/index.ts} | 0 ...ent-workspace-view-info-history.element.ts | 9 +- .../documents/workspace/views/info/utils.ts | 14 +- .../media-audit-log.server.data-source.ts | 4 +- .../packages/media/media/audit-log/types.ts | 2 +- .../audit-log/{utils.ts => utils/index.ts} | 0 ...dia-workspace-view-info-history.element.ts | 182 ++++++++---------- .../media/media/workspace/views/info/utils.ts | 38 +--- 10 files changed, 104 insertions(+), 149 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/{utils.ts => utils/index.ts} (100%) rename src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/{utils.ts => utils/index.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts index f027c9bd5d..919289c100 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts @@ -2,7 +2,7 @@ import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; export interface UmbAuditLogModel { - user: UmbReferenceByUnique | null; + user: UmbReferenceByUnique; timestamp: string; logType: LogType; comment?: string | null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts index 80664db33b..955a4a35ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts @@ -44,7 +44,7 @@ export class UmbDocumentAuditLogServerDataSource implements UmbAuditLogDataSourc if (data) { const mappedItems: Array = data.items.map((item) => { return { - user: item.user ? { unique: item.user.id } : null, + user: { unique: item.user.id }, timestamp: item.timestamp, logType: item.logType as UmbDocumentAuditLogType, // TODO: Fix type cast comment: item.comment, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/utils/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index c357aa3798..3ac888ec79 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -2,13 +2,12 @@ import { UMB_ROLLBACK_MODAL } from '../../../modals/rollback/index.js'; import type { UmbDocumentAuditLogModel } from '../../../audit-log/types.js'; import { UmbDocumentAuditLogRepository } from '../../../audit-log/index.js'; import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context-token.js'; -import { HistoryTagStyleAndText, TimeOptions } from './utils.js'; -import { css, html, customElement, state, nothing, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { TimeOptions, getDocumentHistoryTagStyleAndText } from './utils.js'; +import { css, html, customElement, state, nothing, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; import type { UmbUserItemModel } from '@umbraco-cms/backoffice/user'; @@ -23,7 +22,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { _totalPages = 1; @state() - private _items?: Array; + private _items: Array = []; #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #auditLogRepository = new UmbDocumentAuditLogRepository(this); @@ -121,7 +120,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { this._items, (item) => item.timestamp, (item) => { - const { text, style } = HistoryTagStyleAndText(item.logType); + const { text, style } = getDocumentHistoryTagStyleAndText(item.logType); const user = this.#userMap.get(item.user.unique); //const avatar = Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; // TODO: we need to get the absolute url for the avatars from the server diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/utils.ts index 3471249ab9..9e69b8b497 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/utils.ts @@ -1,4 +1,4 @@ -import { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { UmbDocumentAuditLog, type UmbDocumentAuditLogType } from '../../../audit-log/utils/index.js'; interface HistoryStyleMap { look: 'default' | 'primary' | 'secondary' | 'outline' | 'placeholder'; @@ -22,27 +22,27 @@ interface HistoryData { * @param type AuditTypeModel * @returns {HistoricData} */ -export function HistoryTagStyleAndText(type: AuditTypeModel): HistoryData { +export function getDocumentHistoryTagStyleAndText(type: UmbDocumentAuditLogType): HistoryData { switch (type) { - case AuditTypeModel.SAVE: + case UmbDocumentAuditLog.SAVE: return { style: { look: 'primary', color: 'default' }, text: { label: 'auditTrails_smallSave', desc: 'auditTrails_save' }, }; - case AuditTypeModel.PUBLISH: + case UmbDocumentAuditLog.PUBLISH: return { style: { look: 'primary', color: 'positive' }, text: { label: 'content_publish', desc: 'auditTrails_publish' }, }; - case AuditTypeModel.UNPUBLISH: + case UmbDocumentAuditLog.UNPUBLISH: return { style: { look: 'primary', color: 'warning' }, text: { label: 'content_unpublish', desc: 'auditTrails_unpublish' }, }; - case AuditTypeModel.CONTENT_VERSION_ENABLE_CLEANUP: + case UmbDocumentAuditLog.CONTENT_VERSION_ENABLE_CLEANUP: return { style: { look: 'secondary', color: 'default' }, text: { @@ -51,7 +51,7 @@ export function HistoryTagStyleAndText(type: AuditTypeModel): HistoryData { }, }; - case AuditTypeModel.CONTENT_VERSION_PREVENT_CLEANUP: + case UmbDocumentAuditLog.CONTENT_VERSION_PREVENT_CLEANUP: return { style: { look: 'secondary', color: 'default' }, text: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts index fa0550df34..8076086092 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/repository/media-audit-log.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbAuditLogDataSource, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; import type { UmbMediaAuditLogModel } from '../types.js'; -import type { UmbMediaAuditLogType } from '../utils.js'; +import type { UmbMediaAuditLogType } from '../utils/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; @@ -44,7 +44,7 @@ export class UmbMediaAuditLogServerDataSource implements UmbAuditLogDataSource = data.items.map((item) => { return { - user: item.user ? { unique: item.user.id } : null, + user: { unique: item.user.id }, timestamp: item.timestamp, logType: item.logType as UmbMediaAuditLogType, // TODO: fix this type cast comment: item.comment, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts index 81de81c97d..c591a6da6b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/types.ts @@ -1,4 +1,4 @@ import type { UmbAuditLogModel } from '@umbraco-cms/backoffice/audit-log'; -import type { UmbMediaAuditLogType } from './utils.js'; +import type { UmbMediaAuditLogType } from './utils/index.js'; export interface UmbMediaAuditLogModel extends UmbAuditLogModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils.ts rename to src/Umbraco.Web.UI.Client/src/packages/media/media/audit-log/utils/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts index c110432190..528c1aff52 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts @@ -1,106 +1,95 @@ -import { HistoryTagStyleAndText, TimeOptions } from './utils.js'; -import { UmbAuditLogRepository } from '@umbraco-cms/backoffice/audit-log'; -import { - css, - html, - customElement, - state, - property, - nothing, - repeat, - ifDefined, -} from '@umbraco-cms/backoffice/external/lit'; -import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbMediaAuditLogModel } from '../../../audit-log/types.js'; +import { UmbMediaAuditLogRepository } from '../../../audit-log/index.js'; +import { UMB_MEDIA_WORKSPACE_CONTEXT } from '../../media-workspace.context-token.js'; +import { TimeOptions, getMediaHistoryTagStyleAndText } from './utils.js'; +import { css, html, customElement, state, nothing, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; +import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; +import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbUserItemModel } from '@umbraco-cms/backoffice/user'; +import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; @customElement('umb-media-workspace-view-info-history') export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { - #logRepository: UmbAuditLogRepository; - #itemsPerPage = 10; - - @property() - mediaUnique = ''; + @state() + _currentPageNumber = 1; @state() - private _total?: number; + _totalPages = 1; @state() - private _items?: Array; + private _items: Array = []; - @state() - private _currentPage = 1; + #workspaceContext?: typeof UMB_MEDIA_WORKSPACE_CONTEXT.TYPE; + #auditLogRepository = new UmbMediaAuditLogRepository(this); + #pagination = new UmbPaginationManager(); + #userItemRepository = new UmbUserItemRepository(this); - @state() - private _serverUrl = ''; + #userMap = new Map(); constructor() { super(); - this.#logRepository = new UmbAuditLogRepository(this); - this.consumeContext(UMB_APP_CONTEXT, (instance) => { - this._serverUrl = instance.getServerUrl(); + this.#pagination.setPageSize(10); + this.observe(this.#pagination.currentPage, (number) => (this._currentPageNumber = number)); + this.observe(this.#pagination.totalPages, (number) => (this._totalPages = number)); + + this.consumeContext(UMB_MEDIA_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; + this.#requestAuditLogs(); }); } - protected firstUpdated(): void { - this.#getLogs(); - } + async #requestAuditLogs() { + const unique = this.#workspaceContext?.getUnique(); + if (!unique) throw new Error('Media unique is required'); - async #getLogs() { - this._items = undefined; // Reset items to show loader - if (!this.mediaUnique) return; - - /*const { data } = await this.#logRepository.getAuditLogByUnique({ - id: this.mediaUnique, - orderDirection: DirectionModel.DESCENDING, - skip: (this._currentPage - 1) * this.#itemsPerPage, - take: this.#itemsPerPage, + const { data } = await this.#auditLogRepository.requestAuditLog({ + unique, + skip: this.#pagination.getSkip(), + take: this.#pagination.getPageSize(), }); - if (!data) return; - this._total = data.total; - this._items = data.items; - */ - - //TODO: I think there is an issue with the API (backend) - error with ID. Hacking for now. - // Uncomment previous code and delete the following when issue fixed. - // This should also make it load significantly faster - - const { data } = await this.#logRepository.getLog({ - orderDirection: DirectionModel.DESCENDING, - skip: 0, - take: 99999, - }); - - if (!data) return; - - // Hack list to only get the items for the current media - const list = data.items.filter((item) => item.entity?.id === this.mediaUnique); - this._total = list.length; - - // Hack list to only get the items for the current page - this._items = list.slice( - (this._currentPage - 1) * this.#itemsPerPage, - (this._currentPage - 1) * this.#itemsPerPage + this.#itemsPerPage, - ); + if (data) { + this._items = data.items; + this.#pagination.setTotalItems(data.total); + this.#requestAndCacheUserItems(); + } } #onPageChange(event: UUIPaginationEvent) { - if (this._currentPage === event.target.current) return; - this._currentPage = event.target.current; + this.#pagination.setCurrentPageNumber(event.target?.current); + this.#requestAuditLogs(); + } - this.#getLogs(); + async #requestAndCacheUserItems() { + const allUsers = this._items?.map((item) => item.user.unique).filter(Boolean) as string[]; + const uniqueUsers = [...new Set(allUsers)]; + const uncachedUsers = uniqueUsers.filter((unique) => !this.#userMap.has(unique)); + + // If there are no uncached user items, we don't need to make a request + if (uncachedUsers.length === 0) return; + + const { data: items } = await this.#userItemRepository.requestItems(uncachedUsers); + + if (items) { + items.forEach((item) => { + // cache the user item + this.#userMap.set(item.unique, item); + this.requestUpdate('_items'); + }); + } } render() { - return html` - ${this._items ? this.#renderHistory() : html` `} - - ${this.#renderHistoryPagination()}`; + return html` +
+

History

+
+ ${this._items ? this.#renderHistory() : html` `} + ${this.#renderPagination()} +
`; } #renderHistory() { @@ -111,25 +100,19 @@ export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { this._items, (item) => item.timestamp, (item) => { - const { text, style } = HistoryTagStyleAndText(item.logType); - const avatar = Array.isArray(item.userAvatars) ? item.userAvatars[1] : undefined; + const { text, style } = getMediaHistoryTagStyleAndText(item.logType); + const user = this.#userMap.get(item.user.unique); + //const avatar = Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; // TODO: we need to get the absolute url for the avatars from the server - const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; + //const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; + return html` - ${this.localize.term(text.label)} ${this.localize.term(text.desc, item.parameters)} - - - - `; }, )} @@ -140,16 +123,18 @@ export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { } } - #renderHistoryPagination() { - if (!this._total) return nothing; - - const totalPages = Math.ceil(this._total / this.#itemsPerPage); - - if (totalPages <= 1) return nothing; - - return html``; + #renderPagination() { + return html` + ${this._totalPages > 1 + ? html` + + ` + : nothing} + `; } static styles = [ @@ -172,10 +157,11 @@ export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { flex: 1; display: inline-block; } + .pagination { display: flex; justify-content: center; - margin-top: var(--uui-size-space-4); + margin-top: var(--uui-size-layout-1); } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/utils.ts index 3471249ab9..f4290ab2c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/utils.ts @@ -1,4 +1,5 @@ -import { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbMediaAuditLogType } from '../../../audit-log/utils/index.js'; +import { UmbMediaAuditLog } from '../../../audit-log/utils/index.js'; interface HistoryStyleMap { look: 'default' | 'primary' | 'secondary' | 'outline' | 'placeholder'; @@ -20,46 +21,15 @@ interface HistoryData { /** * @description Helper function to get look and color for uui-tag and localization keys for the label and description. * @param type AuditTypeModel - * @returns {HistoricData} */ -export function HistoryTagStyleAndText(type: AuditTypeModel): HistoryData { +export function getMediaHistoryTagStyleAndText(type: UmbMediaAuditLogType): HistoryData { switch (type) { - case AuditTypeModel.SAVE: + case UmbMediaAuditLog.SAVE: return { style: { look: 'primary', color: 'default' }, text: { label: 'auditTrails_smallSave', desc: 'auditTrails_save' }, }; - case AuditTypeModel.PUBLISH: - return { - style: { look: 'primary', color: 'positive' }, - text: { label: 'content_publish', desc: 'auditTrails_publish' }, - }; - - case AuditTypeModel.UNPUBLISH: - return { - style: { look: 'primary', color: 'warning' }, - text: { label: 'content_unpublish', desc: 'auditTrails_unpublish' }, - }; - - case AuditTypeModel.CONTENT_VERSION_ENABLE_CLEANUP: - return { - style: { look: 'secondary', color: 'default' }, - text: { - label: 'contentTypeEditor_historyCleanupEnableCleanup', - desc: 'auditTrails_contentversionenablecleanup', - }, - }; - - case AuditTypeModel.CONTENT_VERSION_PREVENT_CLEANUP: - return { - style: { look: 'secondary', color: 'default' }, - text: { - label: 'contentTypeEditor_historyCleanupPreventCleanup', - desc: 'auditTrails_contentversionpreventcleanup', - }, - }; - default: return { style: { look: 'placeholder', color: 'danger' }, From e2468744a9ce78c735a9dc94e593bcadf49252eb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 15:29:44 +0200 Subject: [PATCH 209/323] clean up --- .../src/mocks/browser-handlers.ts | 2 - .../src/mocks/handlers/audit-log.handlers.ts | 41 ------------------- .../src/packages/core/audit-log/types.ts | 2 +- .../document-audit-log.server.data-source.ts | 2 +- .../documents/documents/audit-log/types.ts | 2 +- 5 files changed, 3 insertions(+), 46 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index 3bbf78c39a..171103dd7a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -1,4 +1,3 @@ -import { handlers as auditLogHandlers } from './handlers/audit-log.handlers.js'; import { handlers as configHandlers } from './handlers/config.handlers.js'; import { handlers as cultureHandlers } from './handlers/culture.handlers.js'; import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; @@ -39,7 +38,6 @@ import * as serverHandlers from './handlers/server.handlers.js'; import { handlers as documentBlueprintHandlers } from './handlers/document-blueprint/index.js'; const handlers = [ - ...auditLogHandlers, ...configHandlers, ...cultureHandlers, ...dataTypeHandlers, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts deleted file mode 100644 index 6091cfa4dd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { logs, logsWithUser } from '../data/audit-log.data.js'; -const { rest } = window.MockServiceWorker; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import type { - PagedAuditLogResponseModel, - PagedAuditLogWithUsernameResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; - -export const handlers = [ - rest.get(umbracoPath('/audit-log'), (_req, res, ctx) => { - const PagedAuditLog = { - total: logsWithUser.length, - items: logsWithUser, - }; - return res(ctx.status(200), ctx.json(PagedAuditLog)); - }), - rest.get(umbracoPath('/audit-log/:id'), (_req, res, ctx) => { - const id = _req.params.id as string; - if (!id) return; - - const foundLogs = logs.filter((log) => log.entity?.id === id); - const PagedAuditLog = { - total: foundLogs.length, - items: foundLogs, - }; - - return res(ctx.status(200), ctx.json(PagedAuditLog)); - }), - rest.get(umbracoPath('/audit-log/type/:logType'), (_req, res, ctx) => { - const logType = _req.params.logType as string; - if (!logType) return; - - const foundLogs = logs.filter((log) => log.entity?.type === logType); - const PagedAuditLog = { - total: foundLogs.length, - items: foundLogs, - }; - - return res(ctx.status(200), ctx.json(PagedAuditLog)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts index 919289c100..737aea8203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/audit-log/types.ts @@ -1,7 +1,7 @@ import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbDirectionType } from '@umbraco-cms/backoffice/utils'; -export interface UmbAuditLogModel { +export interface UmbAuditLogModel { user: UmbReferenceByUnique; timestamp: string; logType: LogType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts index 955a4a35ac..08917ec471 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbAuditLogDataSource, UmbAuditLogRequestArgs } from '@umbraco-cms/backoffice/audit-log'; import type { UmbDocumentAuditLogModel } from '../types.js'; -import type { UmbDocumentAuditLogType } from '../utils.js'; +import type { UmbDocumentAuditLogType } from '../utils/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts index 10d55ee045..e8a4beee94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/audit-log/types.ts @@ -1,4 +1,4 @@ import type { UmbAuditLogModel } from '@umbraco-cms/backoffice/audit-log'; -import type { UmbDocumentAuditLogType } from './utils.js'; +import type { UmbDocumentAuditLogType } from './utils/index.js'; export interface UmbDocumentAuditLogModel extends UmbAuditLogModel {} From ffc0fea22e78d634348fc33a77c38ed5efffafaf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 15:34:32 +0200 Subject: [PATCH 210/323] clean up --- .../src/mocks/data/audit-log.data.ts | 16 +--------------- .../src/mocks/data/document/document.db.ts | 1 - .../src/mocks/e2e-handlers.ts | 1 - .../member-group-detail.server.data-source.ts | 2 +- .../webhook-collection.server.data-source.ts | 2 +- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts index cd881ce86d..3b28bf39a1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts @@ -1,16 +1,8 @@ import { data as userData } from './user/user.data.js'; -import { data as documentData } from './document/document.data.js'; -import type { - AuditLogResponseModel, - AuditLogWithUsernameResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; +import type { AuditLogResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; const userId = userData[0].id; -const userName = userData[0].name; -const userAvatars = userData[0].avatarUrls; - -const documentId = documentData[0].id; export const logs: Array = [ { @@ -42,9 +34,3 @@ export const logs: Array = [ parameters: null, }, ]; - -export const logsWithUser: Array = logs.map((log) => ({ - ...log, - userName: userName, - userAvatars: userAvatars, -})); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts index a5ab5d2e2f..0f6e13d5c6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts @@ -48,7 +48,6 @@ export class UmbDocumentMockDB extends UmbEntityMockDbBase disableDeleteWhenReferenced: true, disableUnpublishWhenReferenced: true, reservedFieldNames: [], - sanitizeTinyMce: true, }; } } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts index 30ecb97891..bd8c502e67 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts @@ -1,4 +1,3 @@ -import { handlers as auditLogHandlers } from './handlers/audit-log.handlers.js'; import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; import { handlers as documentTypeHandlers } from './handlers/document-type/index.js'; import { handlers as installHandlers } from './handlers/install.handlers.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts index 988c920d65..90196926c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts @@ -90,7 +90,7 @@ export class UmbMemberGroupServerDataSource implements UmbDetailDataSource { From 91e06956668a66dd5b0f7cb3d7d027091b8c1554 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 15:34:47 +0200 Subject: [PATCH 211/323] Update e2e-handlers.ts --- src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts index bd8c502e67..ab07ff2cc9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts @@ -20,7 +20,6 @@ export const handlers = [ serverHandlers.serverRunningHandler, serverHandlers.serverInformationHandler, ...manifestsHandlers.manifestEmptyHandlers, - ...auditLogHandlers, ...installHandlers, ...upgradeHandlers, ...userHandlers, From 48d6466f571f16c182fd82f997b2a870a226443f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 16:01:50 +0200 Subject: [PATCH 212/323] export repositories --- .../src/packages/documents/documents/index.ts | 1 + src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts index 565baaf5df..16628f33b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts @@ -1,5 +1,6 @@ import './components/index.js'; +export { UmbDocumentAuditLogRepository } from './audit-log/index.js'; export * from './components/index.js'; export * from './entity-actions/index.js'; export * from './entity.js'; 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 774113923c..51a8792071 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 @@ -1,5 +1,6 @@ import './components/index.js'; +export { UmbMediaAuditLogRepository } from './audit-log/index.js'; export * from './repository/index.js'; export * from './workspace/index.js'; export * from './reference/index.js'; From 280a149637196d0419f03d1146bfaefc83599baa Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:08:10 +0200 Subject: [PATCH 213/323] add localization --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 8 ++++---- src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts | 4 +++- src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 4 +++- src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 4 +++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 79cf22f85e..9ec240e899 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -64,16 +64,16 @@ export class UmbAppElement extends UmbLitElement { setup: (component) => { const searchParams = new URLSearchParams(window.location.search); const hasCode = searchParams.has('code'); - (component as UmbAppErrorElement).errorHeadline = 'Umbraco Authorization'; + (component as UmbAppErrorElement).errorHeadline = this.localize.term('general_login'); (component as UmbAppErrorElement).errorMessage = hasCode - ? 'Authorization completed. You may now close this window.' - : 'Authorization failed. Please close this window and try again.'; + ? this.localize.term('errors_externalLoginSuccess') + : this.localize.term('errors_externalLoginFailed'); // Complete the authorization request this.#authContext?.completeAuthorizationRequest().finally(() => { // If we don't have an opener, redirect to the root if (!window.opener) { - history.replaceState(null, '', '/'); + //history.replaceState(null, '', ''); } }); }, diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index a823ed5684..5db74e6d7e 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -712,7 +712,9 @@ export default { unauthorized: 'Du har ikke tilladelse til at udføre denne handling', userNotFound: 'Den angivne bruger blev ikke fundet i databasen', externalInfoNotFound: 'Serveren kunne ikke kommunikere med den eksterne loginudbyder', - externalLoginFailed: 'Serveren mislykkedes i at logge ind med den eksterne loginudbyder', + externalLoginFailed: + 'Serveren mislykkedes i at logge ind med den eksterne loginudbyder. Luk dette vindue og prøv igen.', + externalLoginSuccess: 'Du er nu logget ind. Du kan nu lukke dette vindue.', }, openidErrors: { accessDenied: 'Access denied', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 4a2d45e517..a47a038f95 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -717,7 +717,9 @@ export default { unauthorized: 'You were not authorized before performing this action', userNotFound: 'The local user was not found in the database', externalInfoNotFound: 'The server did not succeed in communicating with the external login provider', - externalLoginFailed: 'The server failed to authorize you against the external login provider', + externalLoginFailed: + 'The server failed to authorize you against the external login provider. Please close the window and try again.', + externalLoginSuccess: 'You have successfully logged in. You may now close this window.', }, openidErrors: { accessDenied: 'Access denied', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 8a6ec29075..4d5bbcb5c4 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -727,7 +727,9 @@ export default { unauthorized: 'You were not authorized before performing this action', userNotFound: 'The local user was not found in the database', externalInfoNotFound: 'The server did not succeed in communicating with the external login provider', - externalLoginFailed: 'The server failed to authorize you against the external login provider', + externalLoginFailed: + 'The server failed to authorize you against the external login provider. Please close the window and try again.', + externalLoginSuccess: 'You have successfully logged in. You may now close this window.', }, openidErrors: { accessDenied: 'Access denied', From 7d5fc5d14fad2212a7f36d3a772b59c002a0a201 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:08:57 +0200 Subject: [PATCH 214/323] hide the back button on external login --- .../src/apps/app/app-error.element.ts | 22 ++++++++++++++----- .../src/apps/app/app.element.ts | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts index 92027afa18..049e093ddc 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-error.element.ts @@ -32,6 +32,14 @@ export class UmbAppErrorElement extends UmbLitElement { @property() error?: unknown; + /** + * Hide the back button + * + * @attr + */ + @property({ type: Boolean, attribute: 'hide-back-button' }) + hideBackButton = false; + constructor() { super(); @@ -168,11 +176,15 @@ export class UmbAppErrorElement extends UmbLitElement {
${this.renderPropertyTags()} - - - ${this.localize.term('contentTypeEditor_inheritedFrom')} - - ${this._inheritedContentTypeName ?? '??'} - - - + ${this._inherited + ? html` + + ${this.localize.term('contentTypeEditor_inheritedFrom')} + + ${this._inheritedContentTypeName ?? '??'} + + + ` + : nothing}
`; } @@ -276,12 +278,13 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement { if (!this.property) return; return html`
- - ${this.property.name} (${this.property.alias}) + + ${this.property.name} + (${this.property.alias})
this.#partialUpdate({ sortOrder: parseInt(e.target.value as string) ?? 0 } as UmbPropertyTypeModel)} @@ -373,18 +376,23 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement { margin-bottom: 0; } - :host([sort-mode-active]:not([inherited])) { + :host([sort-mode-active]:not([_inherited])) { cursor: grab; } :host([sort-mode-active]) .sortable { flex: 1; display: flex; - background-color: var(--uui-color-divider); align-items: center; padding: 0 var(--uui-size-3); gap: var(--uui-size-3); } + :host([sort-mode-active][_inherited]) .sortable { + color: var(--uui-color-disabled-contrast); + } + :host([sort-mode-active]:not([_inherited])) .sortable { + background-color: var(--uui-color-divider); + } :host([sort-mode-active]) uui-input { max-width: 75px; From 8945d540730d916519644ec8307d1462490fe326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 23:46:38 +0200 Subject: [PATCH 232/323] fix delete tab name --- .../views/design/content-type-design-editor.element.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts index 720c6c6b34..2627482872 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts @@ -230,11 +230,13 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements } async #requestDeleteTab(tab: UmbPropertyTypeContainerModel | undefined) { + if (!tab) return; + const tabName = tab.name === '' ? 'Unnamed' : tab.name; // TODO: Localize this: const modalData: UmbConfirmModalData = { headline: 'Delete tab', - content: html` - Are you sure you want to delete the tab ${tab?.name ?? tab?.id} + content: html` + Are you sure you want to delete the tab ${tabName}
From 92f760453f5a15fbbcb414a09842baf946e19833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 23:47:33 +0200 Subject: [PATCH 233/323] todo --- .../workspace/views/design/content-type-design-editor.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts index 2627482872..bd97af52bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts @@ -231,6 +231,7 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements async #requestDeleteTab(tab: UmbPropertyTypeContainerModel | undefined) { if (!tab) return; + // TODO: Localize this: const tabName = tab.name === '' ? 'Unnamed' : tab.name; // TODO: Localize this: const modalData: UmbConfirmModalData = { From b966a89e9c64e76d57c470926cf2a2934130f9cd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 07:17:24 +0200 Subject: [PATCH 234/323] default to true --- .../conditions/is-not-trashed/is-not-trashed.condition.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts index 9c096261d0..e4b8e04aa6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts @@ -14,6 +14,10 @@ export class UmbIsNotTrashedCondition constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { super(host, args); + // this is a "negative/not" condition, so we assume the default value is that the context is not trashed + // and therefore the condition is permitted + this.permitted = true; + this.consumeContext(UMB_IS_TRASHED_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === false; From 5cee10258e1f4e852e4aa18f4ebb6a2a8274890d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 07:17:47 +0200 Subject: [PATCH 235/323] add conditions to all entity actions --- .../entity-actions/create-blueprint/manifests.ts | 3 +++ .../documents/entity-actions/create/manifests.ts | 2 +- .../culture-and-hostnames/manifests.ts | 3 +++ .../documents/entity-actions/duplicate/manifests.ts | 3 +++ .../documents/documents/entity-actions/manifests.ts | 12 ++++++++++++ .../documents/entity-actions/move-to/manifests.ts | 3 +++ .../entity-actions/public-access/manifests.ts | 3 +++ .../entity-actions/sort-children-of/manifests.ts | 3 +++ .../documents/recycle-bin/entity-action/manifests.ts | 10 ++++++++++ 9 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts index cd349f9e66..e553d3be3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -20,6 +20,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 873c1e202f..ad6e8c192e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -21,7 +21,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE], }, { - alias: 'Umb.Condition.IsTrashed', + alias: 'Umb.Condition.IsNotTrashed', }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index 29c31b81ec..9ff57ea5b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -21,6 +21,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts index 24411dd39d..dfdb38c680 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts @@ -17,6 +17,9 @@ export const manifests: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_DUPLICATE], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ...repositoryManifests, 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 b391ce0e7a..ed71154ce8 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 @@ -55,6 +55,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, { @@ -74,6 +77,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, { @@ -93,6 +99,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, { @@ -112,6 +121,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; 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 index dd539de2e2..5bdd6ffe31 100644 --- 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 @@ -22,6 +22,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 1ab9fb6d64..be5f75f29b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -21,6 +21,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index 0476d0180a..a1901fca46 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -24,6 +24,9 @@ export const manifests: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_SORT], }, + { + alias: 'Umb.Condition.IsNotTrashed', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 0ac0cd09be..e7398670be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -16,6 +16,11 @@ export const manifests: Array = [ itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, }, + conditions: [ + { + alias: 'Umb.Condition.IsNotTrashed', + }, + ], }, { type: 'entityAction', @@ -28,6 +33,11 @@ export const manifests: Array = [ recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, pickerModal: UMB_DOCUMENT_PICKER_MODAL, }, + conditions: [ + { + alias: 'Umb.Condition.IsTrashed', + }, + ], }, { type: 'entityAction', From cb37e42dc007188d1b13629410415bd950caac93 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 07:35:29 +0200 Subject: [PATCH 236/323] add alias consts --- .../core/recycle-bin/conditions/is-not-trashed/constants.ts | 1 + .../is-not-trashed/is-not-trashed.condition.manifest.ts | 3 ++- .../core/recycle-bin/conditions/is-trashed/constants.ts | 1 + .../conditions/is-trashed/is-trashed.condition.manifest.ts | 3 ++- .../contexts/is-trashed/is-trashed.context-token.ts | 4 ++-- .../recycle-bin/contexts/is-trashed/is-trashed.context.ts | 3 +-- .../src/packages/core/recycle-bin/index.ts | 3 +++ 7 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts new file mode 100644 index 0000000000..70c9ca8216 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts @@ -0,0 +1 @@ +export const UMB_IS_NOT_TRASHED_CONDITION_ALIAS = 'Umb.Condition.IsNotTrashed'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts index 581136049a..42616c613d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts @@ -1,8 +1,9 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './constants.js'; import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; export const manifest: ManifestCondition = { type: 'condition', name: 'Is not trashed Condition', - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, api: () => import('./is-not-trashed.condition.js'), }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts new file mode 100644 index 0000000000..43c1b76a2b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts @@ -0,0 +1 @@ +export const UMB_IS_TRASHED_CONDITION_ALIAS = 'Umb.Condition.IsTrashed'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts index 81601c7dd2..9b0d632c02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts @@ -1,8 +1,9 @@ +import { UMB_IS_TRASHED_CONDITION_ALIAS } from './constants.js'; import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; export const manifest: ManifestCondition = { type: 'condition', name: 'Is trashed Condition', - alias: 'Umb.Condition.IsTrashed', + alias: UMB_IS_TRASHED_CONDITION_ALIAS, api: () => import('./is-trashed.condition.js'), }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts index dad427c82d..e15ff7b6d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts @@ -1,4 +1,4 @@ -import type { IUmbIsTrashedContext } from './types.js'; +import type { UmbIsTrashedContext } from './is-trashed.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_IS_TRASHED_CONTEXT = new UmbContextToken('UmbIsTrashedContext'); +export const UMB_IS_TRASHED_CONTEXT = new UmbContextToken('UmbIsTrashedContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts index a5d3f5fcad..9bbd5a038b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts @@ -1,5 +1,4 @@ import { UMB_IS_TRASHED_CONTEXT } from './is-trashed.context-token.js'; -import type { IUmbIsTrashedContext } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; @@ -11,7 +10,7 @@ import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; * @extends {UmbContextBase} * @implements {UmbIsTrashedContext} */ -export class UmbIsTrashedContext extends UmbContextBase implements IUmbIsTrashedContext { +export class UmbIsTrashedContext extends UmbContextBase { #isTrashed = new UmbBooleanState(false); isTrashed = this.#isTrashed.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 89283056bc..79d5d39811 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -15,3 +15,6 @@ export type { export type { IUmbIsTrashedContext } from './contexts/is-trashed/index.js'; export { UmbIsTrashedContext, UMB_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; + +export { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; +export { UMB_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; From 6ae1ffd3927fb31c46f631e421e7a947800f78f4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 07:39:12 +0200 Subject: [PATCH 237/323] use consts --- .../entity-actions/create-blueprint/manifests.ts | 3 ++- .../documents/entity-actions/create/manifests.ts | 3 ++- .../culture-and-hostnames/manifests.ts | 3 ++- .../entity-actions/duplicate/manifests.ts | 3 ++- .../documents/entity-actions/manifests.ts | 14 +++++++++----- .../documents/entity-actions/move-to/manifests.ts | 3 ++- .../entity-actions/public-access/manifests.ts | 3 ++- .../entity-actions/sort-children-of/manifests.ts | 3 ++- .../recycle-bin/entity-action/manifests.ts | 8 ++++++-- 9 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts index e553d3be3f..da27d3d19d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT } from '../../user-permissions/constants.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -21,7 +22,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index ad6e8c192e..91e3bd893d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CREATE } from '../../user-permissions/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -21,7 +22,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index 9ff57ea5b8..c14e804427 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES } from '../../user-permissions/index.js'; import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js'; @@ -22,7 +23,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts index dfdb38c680..f257004e4a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts @@ -3,6 +3,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_DUPLICATE } from '../../user-permissions/c import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { @@ -18,7 +19,7 @@ export const manifests: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_DUPLICATE], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, 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 ed71154ce8..ee1660fef1 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 @@ -16,6 +16,10 @@ import { manifests as publicAccessManifests } from './public-access/manifests.js import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { + UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + UMB_IS_TRASHED_CONDITION_ALIAS, +} from '@umbraco-cms/backoffice/recycle-bin'; const entityActions: Array = [ { @@ -34,7 +38,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_DELETE], }, { - alias: 'Umb.Condition.IsTrashed', + alias: UMB_IS_TRASHED_CONDITION_ALIAS, }, ], }, @@ -56,7 +60,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -78,7 +82,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -100,7 +104,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -122,7 +126,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, 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 index 5bdd6ffe31..2d6127bc7d 100644 --- 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 @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; 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'; @@ -23,7 +24,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index be5f75f29b..9ca302f4c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS } from '../../user-permissions/index.js'; import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js'; @@ -22,7 +23,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index a1901fca46..a27f4a03ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; @@ -25,7 +26,7 @@ export const manifests: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_SORT], }, { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index e7398670be..775f5f4f97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -4,6 +4,10 @@ import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../../modals/document-picker-modal.token.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { + UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + UMB_IS_TRASHED_CONDITION_ALIAS, +} from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { @@ -18,7 +22,7 @@ export const manifests: Array = [ }, conditions: [ { - alias: 'Umb.Condition.IsNotTrashed', + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -35,7 +39,7 @@ export const manifests: Array = [ }, conditions: [ { - alias: 'Umb.Condition.IsTrashed', + alias: UMB_IS_TRASHED_CONDITION_ALIAS, }, ], }, From c8e997c8e1e189b2e55019da7b410823bb6354c8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 07:40:37 +0200 Subject: [PATCH 238/323] Update user.db.ts --- src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index 2c5787ac29..231e29bf0d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -183,6 +183,7 @@ const itemMapper = (item: UmbMockUserModel): UserItemResponseModel => { return { id: item.id, name: item.name, + avatarUrls: item.avatarUrls, }; }; From 79701a45de803488b7dbf93bf8b6df87c0a0f58c Mon Sep 17 00:00:00 2001 From: Kevin Jump Date: Wed, 1 May 2024 07:02:10 +0100 Subject: [PATCH 239/323] export entity types Adds exports for missing entity types --- src/Umbraco.Web.UI.Client/src/packages/dictionary/index.ts | 1 + src/Umbraco.Web.UI.Client/src/packages/language/index.ts | 1 + .../src/packages/media/media-types/index.ts | 1 + .../src/packages/members/member-group/index.ts | 1 + src/Umbraco.Web.UI.Client/src/packages/members/member/index.ts | 1 + src/Umbraco.Web.UI.Client/src/packages/static-file/index.ts | 1 + .../src/packages/templating/partial-views/index.ts | 1 + .../src/packages/templating/stylesheets/index.ts | 2 ++ .../src/packages/user/user-group/index.ts | 3 +-- src/Umbraco.Web.UI.Client/src/packages/user/user/index.ts | 1 + src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts | 1 + 11 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/index.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/index.ts index 92c746f71e..d2d620cf4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/index.ts @@ -1,3 +1,4 @@ export * from './repository/index.js'; export * from './tree/index.js'; +export * from './entity.js'; export { UMB_DICTIONARY_PICKER_MODAL } from './modals/dictionary-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/index.ts index 6e58bcd0b4..37e1e94844 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/index.ts @@ -2,6 +2,7 @@ import './components/index.js'; export { UmbInputLanguageElement } from './components/index.js'; +export * from './entity.js'; export * from './repository/index.js'; export * from './collection/index.js'; export * from './global-contexts/index.js'; 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 e746aa874e..601f28885f 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 @@ -6,6 +6,7 @@ export * from './workspace/index.js'; export * from './repository/index.js'; export * from './tree/types.js'; export * from './types.js'; +export * from './entity.js'; export * from './utils/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/index.ts index ec2441254f..9988d62677 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/index.ts @@ -1,5 +1,6 @@ import './components/index.js'; +export * from './entity.js'; export * from './repository/index.js'; export * from './components/index.js'; export type { UmbMemberGroupDetailModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/index.ts index f23e6176e5..3a751ec32f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/index.ts @@ -1,4 +1,5 @@ import './components/index.js'; +export * from './entity.js'; export * from './components/index.js'; export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/index.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/index.ts index b95b816226..6e39ab02c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/index.ts @@ -1,3 +1,4 @@ +export * from './entity.js'; export * from './components/index.js'; export * from './tree/index.js'; export * from './modals/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/index.ts index 3d76f338dd..48e5364e41 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/index.ts @@ -1 +1,2 @@ export * from './repository/index.js'; +export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts index 9155ec534f..e5ceb55bfc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts @@ -1,6 +1,8 @@ import './components/index.js'; export * from './repository/index.js'; +export * from './entity.js'; + export { UmbStylesheetTreeRepository } from './tree/index.js'; // Components diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/index.ts index dc0c3337c0..ac05b1f292 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/index.ts @@ -2,7 +2,6 @@ export * from './collection/index.js'; export * from './components/index.js'; export * from './repository/index.js'; export * from './types.js'; - -export const UMB_USER_GROUP_ENTITY_TYPE = 'user-group'; +export * from './entity.js'; export { UMB_USER_GROUP_PICKER_MODAL } from './modals/user-group-picker/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/index.ts index 0eb2746d9c..eacb70ed86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/index.ts @@ -4,3 +4,4 @@ export * from './invite/index.js'; export * from './repository/index.js'; export type * from './types.js'; export * from './utils/index.js'; +export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts index c0c5e4edd9..db0f1027eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/index.ts @@ -1,3 +1,4 @@ export * from './collection/index.js'; export type * from './types.js'; +export * from './entity.js'; From 14058e544edb289844af20ea374341da776c0b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 10:01:03 +0200 Subject: [PATCH 240/323] re-implenent tab-properties --- ...t-type-container-structure-helper.class.ts | 12 ++++----- ...nt-type-property-structure-helper.class.ts | 2 +- ...t-type-design-editor-properties.element.ts | 10 +++---- .../content-type-design-editor-tab.element.ts | 27 +++++++++++-------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts index 2688c49331..be4d8d7a23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts @@ -28,8 +28,8 @@ export class UmbContentTypeContainerStructureHelper([], (x) => x.id); + readonly hasProperties = this.#hasProperties.asObservablePart((x) => x.some((y) => y.has)); constructor(host: UmbControllerHost) { super(host); @@ -132,7 +132,7 @@ export class UmbContentTypeContainerStructureHelper { // We want to remove hasProperties of groups that does not exist anymore.: // this.#removeHasPropertiesOfGroup() - this.#hasProperties.setValue(false); + console.log('containers', containers); + this.#hasProperties.setValue([]); this.#childContainers.setValue([]); containers.forEach((container) => { @@ -203,8 +204,7 @@ export class UmbContentTypeContainerStructureHelper { - // TODO: Make this an array/map/state, so we only change the groupId. then hasProperties should be a observablePart that checks the array for true. [NL] - this.#hasProperties.setValue(hasProperties); + this.#hasProperties.appendOne({ id: groupId, has: hasProperties }); }, '_observePropertyStructureOfGroup' + groupId, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts index 0a1fd0d2f8..fec571a3d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts @@ -188,7 +188,7 @@ export class UmbContentTypePropertyStructureHelper = { getUniqueOfElement: (element) => { @@ -160,8 +156,8 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { .addUniquePaths(['container-id']) .addAdditionalPath('add-property/:sortOrder') .onSetup(async (params) => { - if (!this._ownerContentType || !this._containerId) return false; - + // TODO: Make a onInit promise, that can be awaited here. + if (!this._ownerContentType || this._containerId === undefined) return false; const propertyData = await this.#propertyStructureHelper.createPropertyScaffold(this._containerId); if (propertyData === undefined) return false; if (params.sortOrder !== undefined) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts index 58d32eb3a2..021f63b22f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts @@ -2,7 +2,7 @@ import { UMB_CONTENT_TYPE_WORKSPACE_CONTEXT } from '../../content-type-workspace import type { UmbContentTypeWorkspaceViewEditGroupElement } from './content-type-design-editor-group.element.js'; import { UMB_CONTENT_TYPE_DESIGN_EDITOR_CONTEXT } from './content-type-design-editor.context.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbContentTypeContainerStructureHelper, type UmbContentTypeModel, @@ -160,16 +160,17 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { render() { return html` - ${ - this._hasProperties - ? html` - - - - ` - : '' - } + ${ + this.#containerId + ? html` + + + + ` + : nothing + } +
${repeat( this._groups, @@ -223,6 +224,10 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { umb-content-type-design-editor-group { margin-bottom: var(--uui-size-layout-1); } + uui-box.opaque { + background-color: transparent; + border-color: transparent; + } .container-list { display: grid; From e398b3adea98c659dd2d8294fc1ef3585ce5f2ee Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 1 May 2024 09:27:49 +0100 Subject: [PATCH 241/323] Replaced hardcoded edit path with constant helper --- .../views/grid/document-grid-collection-view.element.ts | 7 +++++-- .../views/table/document-table-collection-view.element.ts | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index fb55c39022..6781ebd2cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -1,4 +1,5 @@ import { getPropertyValueByAlias } from '../index.js'; +import { UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN } from '../../../paths.js'; import type { UmbCollectionColumnConfiguration } from '../../../../../core/collection/types.js'; import type { UmbDocumentCollectionFilterModel, UmbDocumentCollectionItemModel } from '../../types.js'; import { css, customElement, html, nothing, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; @@ -75,10 +76,12 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { ); } - #onOpen(event: Event, id: string) { + #onOpen(event: Event, unique: string) { event.preventDefault(); event.stopPropagation(); - window.history.pushState(null, '', this._editDocumentPath + 'edit/' + id); + + const url = this._editDocumentPath + UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN.generateLocal({ unique }); + window.history.pushState(null, '', url); } #onSelect(item: UmbDocumentCollectionItemModel) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 54683263d1..4b019ecd61 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -1,4 +1,5 @@ import { getPropertyValueByAlias } from '../index.js'; +import { UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN } from '../../../paths.js'; import type { UmbCollectionColumnConfiguration } from '../../../../../core/collection/types.js'; import type { UmbDocumentCollectionItemModel } from '../../types.js'; import type { UmbDocumentCollectionContext } from '../../document-collection.context.js'; @@ -150,7 +151,8 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { const data = this._tableColumns?.map((column) => { const editPath = this.#routeBuilder - ? this.#routeBuilder({ entityType: item.entityType }) + `edit/${item.unique}` + ? this.#routeBuilder({ entityType: item.entityType }) + + UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN.generateLocal({ unique: item.unique }) : ''; return { From fa0049c783894bcecd5f238a21dce037e087d033 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 10:51:36 +0200 Subject: [PATCH 242/323] different null check --- .../views/info/document-workspace-view-info-history.element.ts | 2 +- .../views/info/media-workspace-view-info-history.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 37476a4a91..b96be4bfeb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -123,7 +123,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { const { text, style } = getDocumentHistoryTagStyleAndText(item.logType); const user = this.#userMap.get(item.user.unique); const userName = user?.name ?? 'Unknown'; - const avatarUrl = Array.isArray(user?.avatarUrls) ? user.avatarUrls[1] : undefined; + const avatarUrl = user && Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts index 79ea1b62b6..4d7a27b8a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts @@ -103,7 +103,7 @@ export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { const { text, style } = getMediaHistoryTagStyleAndText(item.logType); const user = this.#userMap.get(item.user.unique); const userName = user?.name ?? 'Unknown'; - const avatarUrl = Array.isArray(user?.avatarUrls) ? user.avatarUrls[1] : undefined; + const avatarUrl = user && Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; return html` Date: Wed, 1 May 2024 11:15:36 +0200 Subject: [PATCH 243/323] make name more specific --- ...-type-composition-data-source.interface.ts | 26 +++++++------------ ...t-type-composition-repository.interface.ts | 4 +-- .../core/content-type/composition/types.ts | 2 +- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts index e0a2c35635..4579915e98 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-data-source.interface.ts @@ -1,23 +1,17 @@ import type { UmbContentTypeCompositionCompatibleModel, UmbContentTypeCompositionReferenceModel, - UmbContentTypeCompositionRequestModel, + UmbContentTypeAvailableCompositionRequestModel, } from './types.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; -export interface UmbContentTypeCompositionDataSourceConstructor { - new (host: UmbControllerHost): UmbContentTypeCompositionDataSource; -} - -export interface UmbContentTypeCompositionDataSource { - availableCompositions< - ResponseType extends UmbContentTypeCompositionCompatibleModel, - ArgsType extends UmbContentTypeCompositionRequestModel, - >( - args: ArgsType, - ): Promise>>; - getReferences( - unique: string, - ): Promise>>; +export interface UmbContentTypeCompositionDataSource< + CompositionReferenceModelType extends UmbContentTypeCompositionReferenceModel, + CompositionCompatibleModelType extends UmbContentTypeCompositionCompatibleModel, + AvailableCompositionsRequestType extends UmbContentTypeAvailableCompositionRequestModel, +> { + getReferences(unique: string): Promise>>; + availableCompositions( + args: AvailableCompositionsRequestType, + ): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts index ac9fb7ce59..c9713a945d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts @@ -1,7 +1,7 @@ import type { UmbContentTypeCompositionCompatibleModel, UmbContentTypeCompositionReferenceModel, - UmbContentTypeCompositionRequestModel, + UmbContentTypeAvailableCompositionRequestModel, } from './types.js'; import type { UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; @@ -11,7 +11,7 @@ export interface UmbContentTypeCompositionRepository { ): Promise>>; availableCompositions< ResponseType extends UmbContentTypeCompositionCompatibleModel, - ArgsType extends UmbContentTypeCompositionRequestModel, + ArgsType extends UmbContentTypeAvailableCompositionRequestModel, >( args: ArgsType, ): Promise>>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts index d6530f961d..4fcd9f44f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/types.ts @@ -4,7 +4,7 @@ export interface UmbContentTypeCompositionReferenceModel { icon: string; } -export interface UmbContentTypeCompositionRequestModel { +export interface UmbContentTypeAvailableCompositionRequestModel { unique: string | null; currentPropertyAliases: Array; currentCompositeUniques: Array; From 666462318e43ec9b2b9acd1dc96136358eb9ce81 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:15:46 +0200 Subject: [PATCH 244/323] make name more specific --- .../composition/document-type-composition.repository.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts index 2f3c5fbbde..21ca2f78bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts @@ -1,7 +1,7 @@ import { UmbDocumentTypeCompositionServerDataSource } from './document-type-composition.server.data-source.js'; import type { UmbContentTypeCompositionRepository } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbDocumentTypeCompositionRequestModel } from '@umbraco-cms/backoffice/document-type'; +import type { UmbDocumentTypeAvailableCompositionRequestModel } from '@umbraco-cms/backoffice/document-type'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; export class UmbDocumentTypeCompositionRepository @@ -19,7 +19,7 @@ export class UmbDocumentTypeCompositionRepository return this.#compositionSource.getReferences(unique); } - async availableCompositions(args: UmbDocumentTypeCompositionRequestModel) { + async availableCompositions(args: UmbDocumentTypeAvailableCompositionRequestModel) { return this.#compositionSource.availableCompositions(args); } } From f16fbe45cd69b6d46a6d39f8dacee20f7f01f015 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:16:55 +0200 Subject: [PATCH 245/323] Update document-type-composition.server.data-source.ts --- .../composition/document-type-composition.server.data-source.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts index aef52c8ad2..db2e4063e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts @@ -55,7 +55,7 @@ export class UmbDocumentTypeCompositionServerDataSource implements UmbContentTyp * @return {*} * @memberof UmbDocumentTypeCompositionServerDataSource */ - async availableCompositions(args: UmbDocumentTypeCompositionRequestModel) { + async availableCompositions(args: UmbDocumentTypeAvailableCompositionRequestModel) { const requestBody: DocumentTypeCompositionRequestModel = { id: args.unique, isElement: args.isElement, From 6610ef92e87e2d6a856717022813e341da53882a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:17:00 +0200 Subject: [PATCH 246/323] Update document-type-composition.server.data-source.ts --- .../composition/document-type-composition.server.data-source.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts index db2e4063e4..a7015200ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbDocumentTypeCompositionCompatibleModel, UmbDocumentTypeCompositionReferenceModel, - UmbDocumentTypeCompositionRequestModel, + UmbDocumentTypeAvailableCompositionRequestModel, } from '../../types.js'; import { type DocumentTypeCompositionRequestModel, From a2081283ae1293b545dc7a531c302d645d7b6305 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:17:09 +0200 Subject: [PATCH 247/323] add types --- .../document-type-composition.server.data-source.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts index a7015200ff..40215f54af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts @@ -16,7 +16,14 @@ import type { UmbContentTypeCompositionDataSource } from '@umbraco-cms/backoffic * @export * @class UmbDocumentTypeCompositionServerDataSource */ -export class UmbDocumentTypeCompositionServerDataSource implements UmbContentTypeCompositionDataSource { +export class UmbDocumentTypeCompositionServerDataSource + implements + UmbContentTypeCompositionDataSource< + UmbDocumentTypeCompositionReferenceModel, + UmbDocumentTypeCompositionCompatibleModel, + UmbDocumentTypeAvailableCompositionRequestModel + > +{ #host: UmbControllerHost; /** From a4a8aa6042d07f92474ea4353444bb070696d3e8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:17:22 +0200 Subject: [PATCH 248/323] Update types.ts --- .../src/packages/documents/document-types/types.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts index a1c8ab0903..d9447c2864 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/types.ts @@ -2,7 +2,7 @@ import type { UmbDocumentTypeEntityType } from './entity.js'; import type { UmbContentTypeCompositionCompatibleModel, UmbContentTypeCompositionReferenceModel, - UmbContentTypeCompositionRequestModel, + UmbContentTypeAvailableCompositionRequestModel, UmbContentTypeModel, } from '@umbraco-cms/backoffice/content-type'; @@ -19,7 +19,8 @@ export type UmbDocumentTypeCleanupModel = { keepLatestVersionPerDayForDays?: number | null; }; -export interface UmbDocumentTypeCompositionRequestModel extends UmbContentTypeCompositionRequestModel { +export interface UmbDocumentTypeAvailableCompositionRequestModel + extends UmbContentTypeAvailableCompositionRequestModel { isElement: boolean; } From 142504cc2643674e6ec4094e4582a5996b3b3186 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:24:27 +0200 Subject: [PATCH 249/323] add defaults --- ...t-type-composition-repository.interface.ts | 22 ++++++++++--------- .../document-type-composition.repository.ts | 13 +++++++++-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts index c9713a945d..4061213d6e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/composition/content-type-composition-repository.interface.ts @@ -5,14 +5,16 @@ import type { } from './types.js'; import type { UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; -export interface UmbContentTypeCompositionRepository { - getReferences( - unique: string, - ): Promise>>; - availableCompositions< - ResponseType extends UmbContentTypeCompositionCompatibleModel, - ArgsType extends UmbContentTypeAvailableCompositionRequestModel, - >( - args: ArgsType, - ): Promise>>; +export interface UmbContentTypeCompositionRepository< + CompositionReferenceModelType extends + UmbContentTypeCompositionReferenceModel = UmbContentTypeCompositionReferenceModel, + CompositionCompatibleModelType extends + UmbContentTypeCompositionCompatibleModel = UmbContentTypeCompositionCompatibleModel, + AvailableCompositionsRequestType extends + UmbContentTypeAvailableCompositionRequestModel = UmbContentTypeAvailableCompositionRequestModel, +> { + getReferences(unique: string): Promise>>; + availableCompositions( + args: AvailableCompositionsRequestType, + ): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts index 21ca2f78bc..81de3d55d6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.repository.ts @@ -1,12 +1,21 @@ import { UmbDocumentTypeCompositionServerDataSource } from './document-type-composition.server.data-source.js'; import type { UmbContentTypeCompositionRepository } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbDocumentTypeAvailableCompositionRequestModel } from '@umbraco-cms/backoffice/document-type'; +import type { + UmbDocumentTypeAvailableCompositionRequestModel, + UmbDocumentTypeCompositionCompatibleModel, + UmbDocumentTypeCompositionReferenceModel, +} from '@umbraco-cms/backoffice/document-type'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; export class UmbDocumentTypeCompositionRepository extends UmbRepositoryBase - implements UmbContentTypeCompositionRepository + implements + UmbContentTypeCompositionRepository< + UmbDocumentTypeCompositionReferenceModel, + UmbDocumentTypeCompositionCompatibleModel, + UmbDocumentTypeAvailableCompositionRequestModel + > { #compositionSource: UmbDocumentTypeCompositionServerDataSource; From ab18453a2604afc9d8e207b2434006c762b2271e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 11:24:46 +0200 Subject: [PATCH 250/323] temp typescript ignore --- .../composition-picker/composition-picker-modal.element.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts index 562d59ed27..0f56da20fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/composition-picker/composition-picker-modal.element.ts @@ -74,6 +74,9 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement< const { data } = await this.#compositionRepository.availableCompositions({ unique: this.#unique, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + // TODO: isElement is not available on all types that can be composed. isElement: isElement ?? false, currentCompositeUniques: this._selection, currentPropertyAliases: currentPropertyAliases ?? [], From b177c9d98e44aa7b2dc65d3281f7b2a5cb38bd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 12:51:03 +0200 Subject: [PATCH 251/323] dont show label for block type --- .../components/block-type-card/block-type-card.element.ts | 5 +---- .../modals/block-catalogue/block-catalogue-modal.element.ts | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts index f2bbc5b626..da664eabd4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts @@ -18,9 +18,6 @@ export class UmbBlockTypeCardElement extends UmbLitElement { @property({ type: String, attribute: false }) href?: string; - @property({ type: String, attribute: false }) - name?: string; - @property({ type: String, attribute: false }) iconColor?: string; @@ -66,7 +63,7 @@ export class UmbBlockTypeCardElement extends UmbLitElement { return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts index 7765df3f9c..a84acce3f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts @@ -115,7 +115,7 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< label=${this.localize.term('general_search')} placeholder=${this.localize.term('placeholders_search')}> - ` + ` : nothing} ${this._filtered.map( (group) => html` @@ -126,7 +126,6 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< (block) => block.contentElementTypeKey, (block) => html` Date: Wed, 1 May 2024 12:51:12 +0200 Subject: [PATCH 252/323] use parent path for edit path --- .../src/packages/documents/documents/paths.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/paths.ts index 6a24a7f361..ebd4f507b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/paths.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/paths.ts @@ -24,4 +24,7 @@ export const UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ documentTypeUnique: string; }>('create/parent/:parentEntityType/:parentUnique/:documentTypeUnique', UMB_DOCUMENT_WORKSPACE_PATH); -export const UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>('edit/:unique'); +export const UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>( + 'edit/:unique', + UMB_DOCUMENT_WORKSPACE_PATH, +); From 8d2695e62535040dde74d787e4351134e6df2675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 12:59:27 +0200 Subject: [PATCH 253/323] remove debugger --- .../workspace/document-type-workspace-editor.element.ts | 1 - 1 file changed, 1 deletion(-) 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 6782b20ccd..7c3ec7184e 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 @@ -62,7 +62,6 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { #onAliasChange(event: UUIInputEvent) { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string') { this.#workspaceContext?.setAlias(target.value); } From 0aef50fd2dd1e0e395a7622b78498ea7f99dfd84 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:06:05 +0200 Subject: [PATCH 254/323] change property to group --- .../views/design/content-type-design-editor-group.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 7a4271bf66..01e3d1cba3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -132,8 +132,8 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { // TODO: Do proper localization here: [NL] await umbConfirmModal(this, { - headline: `${this.localize.term('actions_delete')} property`, - content: html` Are you sure you want to delete the group ${this._group.name ?? this._group.id} From 0163f247dca0b9c4cd794f77bc9454918ee80d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 13:22:26 +0200 Subject: [PATCH 255/323] fix property inherited url --- .../views/design/content-type-design-editor-group.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 01e3d1cba3..e22ef369a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -152,6 +152,7 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { ${this.#renderContainerHeader()} ` From 91ec2722d7c7723f38ef536b7b34109b895da2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 13:32:56 +0200 Subject: [PATCH 256/323] update comment --- .../views/design/content-type-design-editor-group.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 7a4271bf66..0809c01b27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -158,7 +158,7 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { : ''; } - // TODO: impl UMB_EDIT_DOCUMENT_TYPE_PATH_PATTERN + // TODO: impl UMB_EDIT_DOCUMENT_TYPE_PATH_PATTERN, but we need either a generic type or a way to get the path pattern.... [NL] #renderContainerHeader() { return html`
From 3717596fe9a2f149d555631a6e1657c178f36f53 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:34:46 +0200 Subject: [PATCH 257/323] generate server models --- .../src/external/backend-api/src/models.ts | 17 +++++++++++--- .../src/external/backend-api/src/services.ts | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index 9ef7b35807..ebeb40e21e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -113,7 +113,7 @@ export type CopyMediaTypeRequestModel = { export type CreateDataTypeRequestModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array id?: string | null parent?: ReferenceByIdModel | null @@ -384,6 +384,7 @@ key?: string | null export type CreateUserGroupRequestModel = { name: string +alias: string icon?: string | null sections: Array languages: Array @@ -394,6 +395,7 @@ mediaStartNode?: ReferenceByIdModel | null mediaRootAccess: boolean fallbackPermissions: Array permissions: Array +id?: string | null }; export type CreateUserRequestModel = { @@ -479,7 +481,7 @@ properties: Array export type DataTypeResponseModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array id: string isDeletable: boolean @@ -2263,7 +2265,7 @@ export type UnpublishDocumentRequestModel = { export type UpdateDataTypeRequestModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array }; @@ -2488,6 +2490,7 @@ key: string export type UpdateUserGroupRequestModel = { name: string +alias: string icon?: string | null sections: Array languages: Array @@ -2560,10 +2563,12 @@ export type UserGroupItemResponseModel = { id: string name: string icon?: string | null +alias?: string | null }; export type UserGroupResponseModel = { name: string +alias: string icon?: string | null sections: Array languages: Array @@ -5221,6 +5226,11 @@ requestBody?: UpdateWebhookRequestModel DeleteWebhookById: { id: string + }; +GetWebhookEvents: { + skip?: number +take?: number + }; } @@ -5232,6 +5242,7 @@ DeleteWebhookById: { ,GetWebhookById: WebhookResponseModel ,PutWebhookById: string ,DeleteWebhookById: string + ,GetWebhookEvents: PagedWebhookResponseModel } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts index 476f2ab3c6..503eeca574 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -9071,4 +9071,26 @@ requestBody }); } + /** + * @returns unknown Success + * @throws ApiError + */ + public static getWebhookEvents(data: WebhookData['payloads']['GetWebhookEvents'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook/events', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + } \ No newline at end of file From ee3ae225518f2e91e7ec8ed15216a912000704b4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:37:26 +0200 Subject: [PATCH 258/323] add alias to user group detail model --- .../src/packages/user/user-group/types.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts index 4d16b465ba..3cc7e7d4e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts @@ -1,19 +1,20 @@ import type { UmbUserGroupEntityType } from './entity.js'; export interface UmbUserGroupDetailModel { - unique: string; - entityType: UmbUserGroupEntityType; - isSystemGroup: boolean; - name: string; - icon: string | null; - sections: Array; - languages: Array; - hasAccessToAllLanguages: boolean; - documentStartNode: { unique: string } | null; + alias: string; documentRootAccess: boolean; - mediaStartNode: { unique: string } | null; - mediaRootAccess: boolean; + documentStartNode: { unique: string } | null; + entityType: UmbUserGroupEntityType; fallbackPermissions: Array; + hasAccessToAllLanguages: boolean; + icon: string | null; + isSystemGroup: boolean; + languages: Array; + mediaRootAccess: boolean; + mediaStartNode: { unique: string } | null; + name: string; // TODO: add type permissions: Array; + sections: Array; + unique: string; } From 6d8b58e5587856851a1e8c3c4c7492cefcaa6241 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:38:47 +0200 Subject: [PATCH 259/323] fix data type mocks --- .../src/mocks/data/data-type/data-type.data.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts index f26833d53e..c794c4a871 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts @@ -14,6 +14,7 @@ export const data: Array = [ isFolder: true, hasChildren: false, editorAlias: '', + editorUiAlias: '', values: [], isDeletable: true, canIgnoreStartNodes: false, @@ -25,6 +26,7 @@ export const data: Array = [ isFolder: true, hasChildren: true, editorAlias: '', + editorUiAlias: '', values: [], isDeletable: true, canIgnoreStartNodes: false, @@ -308,6 +310,7 @@ export const data: Array = [ id: 'dt-datePicker-time', parent: null, editorAlias: 'Umbraco.DateTime', + editorUiAlias: 'Umb.PropertyEditorUi.DatePicker', hasChildren: false, isFolder: false, isDeletable: true, From 8abbc5b63919a0007ca3890df3509f5da4e053d7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:40:00 +0200 Subject: [PATCH 260/323] add user group alias to mock data --- .../src/mocks/data/user-group/user-group.data.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 10f4fcdda9..15086fb40f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -6,6 +6,7 @@ export const data: Array = [ { id: 'user-group-administrators-id', name: 'Administrators', + alias: 'administrators', icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: [ @@ -50,6 +51,7 @@ export const data: Array = [ { id: 'user-group-editors-id', name: 'Editors', + alias: 'editors', icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: [ @@ -78,6 +80,7 @@ export const data: Array = [ { id: 'user-group-sensitive-data-id', name: 'Sensitive data', + alias: 'sensitive-data', icon: 'icon-lock', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: [], @@ -92,6 +95,7 @@ export const data: Array = [ { id: 'user-group-translators-id', name: 'Translators', + alias: 'translators', icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: ['Umb.Document.Read', 'Umb.Document.Update'], @@ -106,6 +110,7 @@ export const data: Array = [ { id: 'user-group-writers-id', name: 'Writers', + alias: 'writers', icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: [ From 1794d509978dd1e8907846ce1e01c56832b9dcb5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 13:44:51 +0200 Subject: [PATCH 261/323] map alias --- .../mocks/data/user-group/user-group.db.ts | 1 + .../user-group-detail.server.data-source.ts | 57 ++++++++++--------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 29d72987dc..061dd7fc63 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -78,6 +78,7 @@ const createMockMapper = (item: CreateUserGroupRequestModel): UmbMockUserGroupMo const detailResponseMapper = (item: UmbMockUserGroupModel): UserGroupResponseModel => { return { + alias: item.alias, documentRootAccess: item.documentRootAccess, documentStartNode: item.documentStartNode, hasAccessToAllLanguages: item.hasAccessToAllLanguages, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index ec1fbf77d8..62e2edadbe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -72,20 +72,21 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource Date: Wed, 1 May 2024 14:03:02 +0200 Subject: [PATCH 262/323] fix update propeties that changed in the propertyStructure state --- ...nt-type-property-structure-helper.class.ts | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts index fec571a3d5..3699a93cbe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts @@ -23,6 +23,7 @@ export class UmbContentTypePropertyStructureHelper([], (x) => x.id); readonly propertyStructure = this.#propertyStructure.asObservable(); @@ -86,7 +87,7 @@ export class UmbContentTypePropertyStructureHelper { @@ -152,20 +153,14 @@ export class UmbContentTypePropertyStructureHelper { - // Lets remove the properties that does not exists any longer: - const _propertyStructure = this.#propertyStructure + // Lets remove the properties that does not exists any longer: [NL] + const uniquesToRemove = this.#propertyStructure .getValue() - .filter((x) => !(x.container?.id === groupId && !properties.some((y) => y.id === x.id))); + .filter((x) => !(x.container?.id === groupId && !properties.some((y) => y.id === x.id))) + .map((X) => X.id); - // Lets append the properties that does not exists already: - properties?.forEach((property) => { - if (!_propertyStructure.find((x) => x.id === property.id)) { - _propertyStructure.push(property); - } - }); - - // Fire update to subscribers: - this.#propertyStructure.setValue(_propertyStructure); + this.#propertyStructure.remove(uniquesToRemove); + this.#propertyStructure.append(properties); }, '_observePropertyStructureOfGroup' + groupId, ); From 0a7cbd1fed98785883b48308f03721c2d2251edc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 14:05:51 +0200 Subject: [PATCH 263/323] mapping --- .../src/mocks/data/data-type/data-type.db.ts | 1 + .../mocks/data/user-group/user-group.db.ts | 1 + .../src/packages/data-type/types.ts | 2 +- ...ser-group-collection.server.data-source.ts | 23 ++++++++++--------- .../user-group-detail.server.data-source.ts | 23 ++++++++++--------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts index fad4ede41a..8880e64ff8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts @@ -44,6 +44,7 @@ const createFolderMockMapper = (request: CreateFolderRequestModel): UmbMockDataT isFolder: true, hasChildren: false, editorAlias: '', + editorUiAlias: '', isDeletable: true, canIgnoreStartNodes: false, values: [], diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 061dd7fc63..c05bd99f48 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -60,6 +60,7 @@ const itemMapper = (item: UmbMockUserGroupModel): UserGroupItemResponseModel => const createMockMapper = (item: CreateUserGroupRequestModel): UmbMockUserGroupModel => { return { + alias: item.alias, documentRootAccess: item.documentRootAccess, documentStartNode: item.documentStartNode, hasAccessToAllLanguages: item.hasAccessToAllLanguages, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts index 366f7823f3..77e3bd99f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts @@ -5,7 +5,7 @@ export interface UmbDataTypeDetailModel { unique: string; name: string; editorAlias: string | undefined; - editorUiAlias: string | null; + editorUiAlias: string; values: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index fa5f6d9b0c..c656550ed3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -33,20 +33,21 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData if (data) { const mappedItems = data.items.map((item) => { const userGroup: UmbUserGroupDetailModel = { - unique: item.id, - entityType: UMB_USER_GROUP_ENTITY_TYPE, - isSystemGroup: item.isSystemGroup, - name: item.name, - icon: item.icon || null, - sections: item.sections, - languages: item.languages, - hasAccessToAllLanguages: item.hasAccessToAllLanguages, - documentStartNode: item.documentStartNode ? { unique: item.documentStartNode.id } : null, + alias: item.alias, documentRootAccess: item.documentRootAccess, - mediaStartNode: item.mediaStartNode ? { unique: item.mediaStartNode.id } : null, - mediaRootAccess: item.mediaRootAccess, + documentStartNode: item.documentStartNode ? { unique: item.documentStartNode.id } : null, + entityType: UMB_USER_GROUP_ENTITY_TYPE, fallbackPermissions: item.fallbackPermissions, + hasAccessToAllLanguages: item.hasAccessToAllLanguages, + icon: item.icon || null, + isSystemGroup: item.isSystemGroup, + languages: item.languages, + mediaRootAccess: item.mediaRootAccess, + mediaStartNode: item.mediaStartNode ? { unique: item.mediaStartNode.id } : null, + name: item.name, permissions: item.permissions, + sections: item.sections, + unique: item.id, }; return userGroup; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index 62e2edadbe..32d6660a13 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -36,20 +36,21 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource Date: Wed, 1 May 2024 14:11:36 +0200 Subject: [PATCH 264/323] allow null as we need it for the scaffold --- src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts index 77e3bd99f5..366f7823f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/types.ts @@ -5,7 +5,7 @@ export interface UmbDataTypeDetailModel { unique: string; name: string; editorAlias: string | undefined; - editorUiAlias: string; + editorUiAlias: string | null; values: Array; } From 257413dba1da4b60f08d1b103ff6a63adec07e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 14:13:42 +0200 Subject: [PATCH 265/323] impl mergeObservables for propertyStructure composition --- ...nt-type-property-structure-helper.class.ts | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts index 3699a93cbe..8784968913 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts @@ -7,7 +7,7 @@ import type { import type { UmbContentTypeStructureManager } from './content-type-structure-manager.class.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState, mergeObservables } from '@umbraco-cms/backoffice/observable-api'; type UmbPropertyTypeId = UmbPropertyTypeModel['id']; @@ -77,7 +77,14 @@ export class UmbContentTypePropertyStructureHelper { + this.#propertyStructure.setValue(properties); + }, + 'observePropertyStructures', + ); this.removeUmbControllerByAlias('_observeContainers'); } else { this.observe( @@ -140,13 +147,24 @@ export class UmbContentTypePropertyStructureHelper this.#observePropertyStructureOf(group.id)); + this.observe( + mergeObservables( + groupContainers.map((group) => this.#structure!.propertyStructuresOf(group.id)), + (sources) => { + return sources.flatMap((x) => x); + }, + ), + (properties) => { + this.#propertyStructure.setValue(properties); + }, + 'observePropertyStructures', + ); this.#containers = groupContainers; }, '_observeContainers', ); } - + /* #observePropertyStructureOf(groupId?: string | null) { if (!this.#structure || groupId === undefined) return; @@ -164,7 +182,7 @@ export class UmbContentTypePropertyStructureHelper Date: Wed, 1 May 2024 14:13:53 +0200 Subject: [PATCH 266/323] remove unused code --- ...nt-type-property-structure-helper.class.ts | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts index 8784968913..7253d4f84f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-property-structure-helper.class.ts @@ -77,7 +77,6 @@ export class UmbContentTypePropertyStructureHelper { @@ -164,25 +163,6 @@ export class UmbContentTypePropertyStructureHelper { - // Lets remove the properties that does not exists any longer: [NL] - const uniquesToRemove = this.#propertyStructure - .getValue() - .filter((x) => !(x.container?.id === groupId && !properties.some((y) => y.id === x.id))) - .map((X) => X.id); - - this.#propertyStructure.remove(uniquesToRemove); - this.#propertyStructure.append(properties); - }, - '_observePropertyStructureOfGroup' + groupId, - ); - }*/ async isOwnerProperty(propertyId: UmbPropertyTypeId) { await this.#init; From d26549b89e55b7af0a9137eae77fc74ba3ae6a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 14:20:22 +0200 Subject: [PATCH 267/323] clean up --- .../structure/content-type-container-structure-helper.class.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts index be4d8d7a23..8314a667fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts @@ -2,7 +2,7 @@ import type { UmbContentTypeModel, UmbPropertyContainerTypes, UmbPropertyTypeCon import type { UmbContentTypeStructureManager } from './content-type-structure-manager.class.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; /** * This class is a helper class for managing the structure of containers in a content type. @@ -152,7 +152,6 @@ export class UmbContentTypeContainerStructureHelper { // We want to remove hasProperties of groups that does not exist anymore.: // this.#removeHasPropertiesOfGroup() - console.log('containers', containers); this.#hasProperties.setValue([]); this.#childContainers.setValue([]); From b06aa4d1646d2f41278c5dadcfe40f35f46ed83d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 14:23:12 +0200 Subject: [PATCH 268/323] clean up --- .../design/content-type-design-editor-properties.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts index 7da84ab742..cb8159c22f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts @@ -96,7 +96,6 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { } #addPropertyModal: UmbModalRouteRegistrationController; - #workspaceModal?: UmbModalRouteRegistrationController; #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); From c42862d92f5ee1a1fd5e18cef257a3cb01f5d7a0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 May 2024 14:33:20 +0200 Subject: [PATCH 269/323] add null check --- .../repository/detail/data-type-detail.server.data-source.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts index 0fbed19899..f0eb179c63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -86,6 +86,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource Date: Wed, 1 May 2024 19:14:37 +0200 Subject: [PATCH 270/323] remove props when removing container --- .../structure/content-type-structure-manager.class.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts index e0a0601348..c6218caef2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts @@ -425,10 +425,15 @@ export class UmbContentTypeStructureManager< throw new Error('Could not find the Content Type to remove container from'); } const frozenContainers = contentType.containers ?? []; + const removedContainerIds = frozenContainers + .filter((x) => x.id === containerId || x.parent?.id === containerId) + .map((x) => x.id); const containers = frozenContainers.filter((x) => x.id !== containerId && x.parent?.id !== containerId); - const frozenProperties = contentType.properties ?? []; - const properties = frozenProperties.filter((x) => x.container?.id !== containerId); + const frozenProperties = contentType.properties; + const properties = frozenProperties.filter((x) => + x.container ? !removedContainerIds.some((ids) => ids === x.container?.id) : true, + ); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore From 8c8add05c022b85ab5db5ce0fa335e4f1613b142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 1 May 2024 20:09:06 +0200 Subject: [PATCH 271/323] canCreate for Block editors --- .../block-grid-entries.element.ts | 54 ++++++++++--------- .../block-grid-entry.element.ts | 32 ++++++----- .../context/block-grid-entries.context.ts | 1 + .../context/block-list-entries.context.ts | 4 ++ .../block/context/block-entries.context.ts | 4 +- .../block/context/block-entry.context.ts | 15 ++++-- 6 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts index 32c12e08b0..fece6fb327 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.ts @@ -7,7 +7,7 @@ import { } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid'; -import { html, customElement, state, repeat, css, property } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, repeat, css, property, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../block-grid-entry/index.js'; import { UmbSorterController, type UmbSorterConfig, type resolvePlacementArgs } from '@umbraco-cms/backoffice/sorter'; @@ -214,32 +214,38 @@ export class UmbBlockGridEntriesElement extends UmbLitElement { `, )}
- ${this._canCreate && (this._areaKey === null || this._layoutEntries.length === 0) - ? html` - - ${this._areaKey === null - ? html` - - ` - : ''} - ` - : html` - - `} + ${this._canCreate ? this.#renderCreateButton() : nothing} `; } + #renderCreateButton() { + if (this._areaKey === null || this._layoutEntries.length === 0) { + return html` + + ${this._areaKey === null + ? html` + + ` + : nothing} + `; + } else { + return html` + + `; + } + } + static styles = [ UmbTextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entry/block-grid-entry.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entry/block-grid-entry.element.ts index 36725cdb5e..c1b6eeb54c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entry/block-grid-entry.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-entry/block-grid-entry.element.ts @@ -1,6 +1,6 @@ import { UmbBlockGridEntryContext } from '../../context/block-grid-entry.context.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { html, css, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, css, customElement, property, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbBlockViewPropsType } from '@umbraco-cms/backoffice/block'; import type { UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid'; @@ -48,6 +48,8 @@ export class UmbBlockGridEntryElement extends UmbLitElement implements UmbProper _showContentEdit = false; @state() _hasSettings = false; + + // If _createPath is undefined, its because no blocks are allowed to be created here[NL] @state() _createPath?: string; @@ -123,12 +125,6 @@ export class UmbBlockGridEntryElement extends UmbLitElement implements UmbProper }); } - /* - createRenderRoot() { - return this; - } - */ - connectedCallback(): void { super.connectedCallback(); // element styling: @@ -173,9 +169,11 @@ export class UmbBlockGridEntryElement extends UmbLitElement implements UmbProper } #renderBlock() { - return this.contentUdi && this._createPath + return this.contentUdi ? html` - + ${this._createPath + ? html`` + : nothing}
- ` - : ''} + ` + : nothing} ${this._hasSettings && this._workspaceEditSettingsPath ? html` - ` - : ''} + ` + : nothing} this.#context.requestDelete()}> @@ -203,11 +201,11 @@ export class UmbBlockGridEntryElement extends UmbLitElement implements UmbProper ? html` this.#context.scaleManager.onScaleMouseDown(e)}> ${this._columnSpan}x${this._rowSpan} - ` - : ''} + ` + : nothing}
- ` - : ''; + ` + : nothing; } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts index bbe74d4452..96a700d236 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts @@ -34,6 +34,7 @@ export class UmbBlockGridEntriesContext #allowedBlockTypes = new UmbArrayState([], (x) => x.contentElementTypeKey); public readonly allowedBlockTypes = this.#allowedBlockTypes.asObservable(); public readonly amountOfAllowedBlockTypes = this.#allowedBlockTypes.asObservablePart((x) => x.length); + public readonly canCreate = this.#allowedBlockTypes.asObservablePart((x) => x.length > 0); firstAllowedBlockTypeName() { if (!this._manager) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list-entries.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list-entries.context.ts index 6cc117c7bf..b34f6285cf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list-entries.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list-entries.context.ts @@ -3,6 +3,7 @@ import { UMB_BLOCK_CATALOGUE_MODAL, UmbBlockEntriesContext } from '../../block/i import type { UmbBlockListWorkspaceData } from '../index.js'; import type { UmbBlockListLayoutModel, UmbBlockListTypeModel } from '../types.js'; import { UMB_BLOCK_LIST_MANAGER_CONTEXT } from './block-list-manager.context.js'; +import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; @@ -15,6 +16,9 @@ export class UmbBlockListEntriesContext extends UmbBlockEntriesContext< // #catalogueModal: UmbModalRouteRegistrationController; + // We will just say its always allowed for list for now: [NL] + public readonly canCreate = new UmbBooleanState(true).asObservable(); + constructor(host: UmbControllerHost) { super(host, UMB_BLOCK_LIST_MANAGER_CONTEXT); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entries.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entries.context.ts index 6ff493d5a0..0430a35b12 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entries.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entries.context.ts @@ -6,7 +6,7 @@ import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type'; import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbArrayState, UmbBasicState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { type Observable, UmbArrayState, UmbBasicState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import { type UmbModalRouteBuilder, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; export abstract class UmbBlockEntriesContext< @@ -29,6 +29,8 @@ export abstract class UmbBlockEntriesContext< #workspacePath = new UmbStringState(undefined); workspacePath = this.#workspacePath.asObservable(); + public abstract readonly canCreate: Observable; + protected _layoutEntries = new UmbArrayState([], (x) => x.contentUdi); readonly layoutEntries = this._layoutEntries.asObservable(); readonly layoutEntriesLength = this._layoutEntries.asObservablePart((x) => x.length); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entry.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entry.context.ts index b005594824..1517afa740 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entry.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entry.context.ts @@ -5,7 +5,12 @@ import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type'; import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbNumberState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { + UmbNumberState, + UmbObjectState, + UmbStringState, + observeMultiple, +} from '@umbraco-cms/backoffice/observable-api'; import { encodeFilePath } from '@umbraco-cms/backoffice/utils'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; @@ -180,10 +185,12 @@ export abstract class UmbBlockEntryContext< const index = this.#index.value; if (this._entries && index !== undefined) { this.observe( - this._entries.catalogueRouteBuilder, - (catalogueRouteBuilder) => { - if (catalogueRouteBuilder) { + observeMultiple([this._entries.catalogueRouteBuilder, this._entries.canCreate]), + ([catalogueRouteBuilder, canCreate]) => { + if (catalogueRouteBuilder && canCreate) { this.#createPath.setValue(this._entries!.getPathForCreateBlock(index)); + } else { + this.#createPath.setValue(undefined); } }, 'observeRouteBuilderCreate', From a910edbfceef4ec466932a68dde8cf8ccc4ff6bb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 08:56:09 +0200 Subject: [PATCH 272/323] add null check --- .../repository/detail/data-type-detail.server.data-source.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts index f0eb179c63..0902e37c11 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -121,6 +121,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource Date: Wed, 1 May 2024 10:07:19 +0000 Subject: [PATCH 273/323] Bump ejs from 3.1.9 to 3.1.10 Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 3a51ab3741..ac61c7ef96 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -10760,9 +10760,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" From 75daa16262c856badd353a6cf3b64abb62144ecf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 09:44:52 +0200 Subject: [PATCH 274/323] add is trashed context to document workspace --- .../workspace/document-workspace.context.ts | 4 ++++ .../documents/workspace/manifests.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) 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 f8a3f1a47d..4bce5e6a63 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 @@ -58,6 +58,7 @@ import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/do import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; +import { UmbIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; type EntityType = UmbDocumentDetailModel; export class UmbDocumentWorkspaceContext @@ -155,6 +156,8 @@ export class UmbDocumentWorkspaceContext // TODO: this should be set up for all entity workspace contexts in a base class #entityContext = new UmbEntityContext(this); + // TODO: this might not be the correct place to spin this up + #isTrashedContext = new UmbIsTrashedContext(this); constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_WORKSPACE_ALIAS); @@ -231,6 +234,7 @@ export class UmbDocumentWorkspaceContext if (data) { this.#entityContext.setEntityType(UMB_DOCUMENT_ENTITY_TYPE); this.#entityContext.setUnique(unique); + this.#isTrashedContext.setIsTrashed(data.isTrashed); this.setIsNew(false); this.#persistedData.setValue(data); this.#currentData.setValue(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 2423cb77f4..50ceeef88d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -4,6 +4,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH, } from '../user-permissions/index.js'; +import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import type { ManifestWorkspaces, ManifestWorkspaceActions, @@ -102,6 +103,9 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, { @@ -121,6 +125,9 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, { @@ -138,6 +145,9 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, ]; @@ -160,6 +170,9 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, { @@ -179,6 +192,9 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, { @@ -198,6 +214,9 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, + { + alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, ]; From 3bb57b687791bbadd80970315a0f74fcd11cc255 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 09:47:48 +0200 Subject: [PATCH 275/323] include entity in name context name --- .../is-trashed/entity-is-trashed.context-token.ts | 6 ++++++ ...trashed.context.ts => entity-is-trashed.context.ts} | 10 +++++----- .../core/recycle-bin/contexts/is-trashed/index.ts | 4 ++-- .../contexts/is-trashed/is-trashed.context-token.ts | 4 ---- 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts rename src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/{is-trashed.context.ts => entity-is-trashed.context.ts} (70%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts new file mode 100644 index 0000000000..be593a1038 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts @@ -0,0 +1,6 @@ +import type { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_ENTITY_IS_TRASHED_CONTEXT = new UmbContextToken( + 'UmbEntityIsTrashedContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts index 9bbd5a038b..740c62cdc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts @@ -1,4 +1,4 @@ -import { UMB_IS_TRASHED_CONTEXT } from './is-trashed.context-token.js'; +import { UMB_ENTITY_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; @@ -7,15 +7,15 @@ import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; * Represents the context for the isTrashed state * @export * @class UmbIsTrashedContext - * @extends {UmbContextBase} - * @implements {UmbIsTrashedContext} + * @extends {UmbContextBase} + * @implements {UmbEntityIsTrashedContext} */ -export class UmbIsTrashedContext extends UmbContextBase { +export class UmbEntityIsTrashedContext extends UmbContextBase { #isTrashed = new UmbBooleanState(false); isTrashed = this.#isTrashed.asObservable(); constructor(host: UmbControllerHost) { - super(host, UMB_IS_TRASHED_CONTEXT); + super(host, UMB_ENTITY_IS_TRASHED_CONTEXT); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts index c5d31906ee..131804df9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts @@ -1,3 +1,3 @@ -export { UmbIsTrashedContext } from './is-trashed.context.js'; -export { UMB_IS_TRASHED_CONTEXT } from './is-trashed.context-token.js'; +export { UmbEntityIsTrashedContext as UmbIsTrashedContext } from './entity-is-trashed.context.js'; +export { UMB_ENTITY_IS_TRASHED_CONTEXT as UMB_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; export type { IUmbIsTrashedContext } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts deleted file mode 100644 index e15ff7b6d3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.context-token.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { UmbIsTrashedContext } from './is-trashed.context.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; - -export const UMB_IS_TRASHED_CONTEXT = new UmbContextToken('UmbIsTrashedContext'); From 2813f9f2813c73ac090cb591934fc0236f390139 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 09:48:32 +0200 Subject: [PATCH 276/323] remove unused interface --- .../core/recycle-bin/contexts/is-trashed/index.ts | 1 - .../core/recycle-bin/contexts/is-trashed/types.ts | 8 -------- .../src/packages/core/recycle-bin/index.ts | 1 - 3 files changed, 10 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts index 131804df9c..02e1c9c77c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts @@ -1,3 +1,2 @@ export { UmbEntityIsTrashedContext as UmbIsTrashedContext } from './entity-is-trashed.context.js'; export { UMB_ENTITY_IS_TRASHED_CONTEXT as UMB_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; -export type { IUmbIsTrashedContext } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/types.ts deleted file mode 100644 index 50e8a09fb7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; - -export interface IUmbIsTrashedContext extends UmbContextBase { - isTrashed: Observable; - getIsTrashed(): boolean; - setIsTrashed(isTrashed: boolean): void; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 79d5d39811..804b947e5b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -13,7 +13,6 @@ export type { UmbRecycleBinOriginalParentRequestArgs, } from './types.js'; -export type { IUmbIsTrashedContext } from './contexts/is-trashed/index.js'; export { UmbIsTrashedContext, UMB_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; export { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; From 0fc1722207c463abb48ead17a903f6d5b27470c0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 09:52:14 +0200 Subject: [PATCH 277/323] append entity to name --- .../recycle-bin/conditions/is-not-trashed/constants.ts | 2 +- .../entity-is-not-trashed.condition.manifest.ts | 9 +++++++++ ...d.condition.ts => entity-is-not-trashed.condition.ts} | 4 ++-- .../is-not-trashed/is-not-trashed.condition.manifest.ts | 9 --------- .../core/recycle-bin/conditions/is-trashed/constants.ts | 2 +- .../is-trashed/entity-is-trashed.condition.manifest.ts | 9 +++++++++ ...ashed.condition.ts => entity-is-trashed.condition.ts} | 0 .../is-trashed/is-trashed.condition.manifest.ts | 9 --------- .../packages/core/recycle-bin/conditions/manifests.ts | 4 ++-- .../src/packages/core/recycle-bin/index.ts | 4 ++-- 10 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.manifest.ts rename src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/{is-not-trashed.condition.ts => entity-is-not-trashed.condition.ts} (90%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.manifest.ts rename src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/{is-trashed.condition.ts => entity-is-trashed.condition.ts} (100%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts index 70c9ca8216..beec68cbaf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/constants.ts @@ -1 +1 @@ -export const UMB_IS_NOT_TRASHED_CONDITION_ALIAS = 'Umb.Condition.IsNotTrashed'; +export const UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS = 'Umb.Condition.EntityIsNotTrashed'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.manifest.ts new file mode 100644 index 0000000000..425d59c64a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.manifest.ts @@ -0,0 +1,9 @@ +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from './constants.js'; +import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Entity Is not trashed Condition', + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + api: () => import('./entity-is-not-trashed.condition.js'), +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts index e4b8e04aa6..0dc7a52878 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts @@ -7,7 +7,7 @@ import type { UmbExtensionCondition, } from '@umbraco-cms/backoffice/extension-api'; -export class UmbIsNotTrashedCondition +export class UmbEntityIsNotTrashedCondition extends UmbConditionBase implements UmbExtensionCondition { @@ -26,4 +26,4 @@ export class UmbIsNotTrashedCondition } } -export { UmbIsNotTrashedCondition as api }; +export { UmbEntityIsNotTrashedCondition as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts deleted file mode 100644 index 42616c613d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/is-not-trashed.condition.manifest.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './constants.js'; -import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; - -export const manifest: ManifestCondition = { - type: 'condition', - name: 'Is not trashed Condition', - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, - api: () => import('./is-not-trashed.condition.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts index 43c1b76a2b..a1239d4d08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/constants.ts @@ -1 +1 @@ -export const UMB_IS_TRASHED_CONDITION_ALIAS = 'Umb.Condition.IsTrashed'; +export const UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS = 'Umb.Condition.EntityIsTrashed'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.manifest.ts new file mode 100644 index 0000000000..0f7a4c14e9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.manifest.ts @@ -0,0 +1,9 @@ +import { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from './constants.js'; +import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Entity Is trashed Condition', + alias: UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, + api: () => import('./entity-is-trashed.condition.js'), +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts deleted file mode 100644 index 9b0d632c02..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/is-trashed.condition.manifest.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { UMB_IS_TRASHED_CONDITION_ALIAS } from './constants.js'; -import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; - -export const manifest: ManifestCondition = { - type: 'condition', - name: 'Is trashed Condition', - alias: UMB_IS_TRASHED_CONDITION_ALIAS, - api: () => import('./is-trashed.condition.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts index 093a0c39c2..0f52e2054e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/manifests.ts @@ -1,4 +1,4 @@ -import { manifest as isTrashedManifest } from './is-trashed/is-trashed.condition.manifest.js'; -import { manifest as isNotTrashedManifest } from './is-not-trashed/is-not-trashed.condition.manifest.js'; +import { manifest as isTrashedManifest } from './is-trashed/entity-is-trashed.condition.manifest.js'; +import { manifest as isNotTrashedManifest } from './is-not-trashed/entity-is-not-trashed.condition.manifest.js'; export const manifests = [isTrashedManifest, isNotTrashedManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 804b947e5b..5168d20300 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -15,5 +15,5 @@ export type { export { UmbIsTrashedContext, UMB_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; -export { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; -export { UMB_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; +export { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS as UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; +export { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS as UMB_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; From a3783eb094db970b3371a91451f510c58eb209be Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 09:55:29 +0200 Subject: [PATCH 278/323] remove renamed exports --- .../packages/core/recycle-bin/contexts/is-trashed/index.ts | 4 ++-- .../src/packages/core/recycle-bin/index.ts | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts index 02e1c9c77c..18e16130d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts @@ -1,2 +1,2 @@ -export { UmbEntityIsTrashedContext as UmbIsTrashedContext } from './entity-is-trashed.context.js'; -export { UMB_ENTITY_IS_TRASHED_CONTEXT as UMB_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; +export { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; +export { UMB_ENTITY_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 5168d20300..1760df1229 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -13,7 +13,6 @@ export type { UmbRecycleBinOriginalParentRequestArgs, } from './types.js'; -export { UmbIsTrashedContext, UMB_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; - -export { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS as UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; -export { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS as UMB_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; +export { UmbEntityIsTrashedContext, UMB_ENTITY_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; +export { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; +export { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; From 2fbe1bb07a294a060b4d66919001d8890911415f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:01:03 +0200 Subject: [PATCH 279/323] fix imports --- .../entity-actions/create-blueprint/manifests.ts | 4 ++-- .../documents/entity-actions/create/manifests.ts | 4 ++-- .../culture-and-hostnames/manifests.ts | 4 ++-- .../entity-actions/duplicate/manifests.ts | 4 ++-- .../documents/entity-actions/manifests.ts | 14 +++++++------- .../documents/entity-actions/move-to/manifests.ts | 4 ++-- .../entity-actions/public-access/manifests.ts | 4 ++-- .../entity-actions/sort-children-of/manifests.ts | 4 ++-- .../recycle-bin/entity-action/manifests.ts | 8 ++++---- .../tree/tree-item/document-tree-item.context.ts | 4 ++-- .../workspace/document-workspace.context.ts | 4 ++-- .../documents/documents/workspace/manifests.ts | 14 +++++++------- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts index da27d3d19d..b0f829a239 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT } from '../../user-permissions/constants.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -22,7 +22,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 91e3bd893d..b4259e792d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CREATE } from '../../user-permissions/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -22,7 +22,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index c14e804427..3f231d47b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES } from '../../user-permissions/index.js'; import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js'; @@ -23,7 +23,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts index f257004e4a..2af31405a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/duplicate/manifests.ts @@ -3,7 +3,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_DUPLICATE } from '../../user-permissions/c import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { @@ -19,7 +19,7 @@ export const manifests: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_DUPLICATE], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, 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 ee1660fef1..20d27937ed 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 @@ -17,8 +17,8 @@ import { manifests as sortChildrenOfManifests } from './sort-children-of/manifes import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; import { - UMB_IS_NOT_TRASHED_CONDITION_ALIAS, - UMB_IS_TRASHED_CONDITION_ALIAS, + UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, } from '@umbraco-cms/backoffice/recycle-bin'; const entityActions: Array = [ @@ -38,7 +38,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_DELETE], }, { - alias: UMB_IS_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, }, ], }, @@ -60,7 +60,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -82,7 +82,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -104,7 +104,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -126,7 +126,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, 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 index 2d6127bc7d..8511e1f400 100644 --- 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 @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; 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'; @@ -24,7 +24,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 9ca302f4c0..f242922492 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS } from '../../user-permissions/index.js'; import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js'; @@ -23,7 +23,7 @@ const entityActions: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index a27f4a03ea..cc9d8284c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; @@ -26,7 +26,7 @@ export const manifests: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_SORT], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 775f5f4f97..809bafbfff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -5,8 +5,8 @@ import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../../modals/document-picker-modal.token.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; import { - UMB_IS_NOT_TRASHED_CONDITION_ALIAS, - UMB_IS_TRASHED_CONDITION_ALIAS, + UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ @@ -22,7 +22,7 @@ export const manifests: Array = [ }, conditions: [ { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -39,7 +39,7 @@ export const manifests: Array = [ }, conditions: [ { - alias: UMB_IS_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts index 7ff848de1f..9bd0d67e57 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts @@ -1,10 +1,10 @@ import type { UmbDocumentTreeItemModel } from '../types.js'; import { UmbDefaultTreeItemContext } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; export class UmbDocumentTreeItemContext extends UmbDefaultTreeItemContext { - #isTrashedContext = new UmbIsTrashedContext(this); + #isTrashedContext = new UmbEntityIsTrashedContext(this); constructor(host: UmbControllerHost) { super(host); 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 4bce5e6a63..c7b06607e7 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 @@ -58,7 +58,7 @@ import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/do import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; -import { UmbIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; type EntityType = UmbDocumentDetailModel; export class UmbDocumentWorkspaceContext @@ -157,7 +157,7 @@ export class UmbDocumentWorkspaceContext // TODO: this should be set up for all entity workspace contexts in a base class #entityContext = new UmbEntityContext(this); // TODO: this might not be the correct place to spin this up - #isTrashedContext = new UmbIsTrashedContext(this); + #isTrashedContext = new UmbEntityIsTrashedContext(this); constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_WORKSPACE_ALIAS); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 50ceeef88d..15c0479ee3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -4,7 +4,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH, } from '../user-permissions/index.js'; -import { UMB_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import type { ManifestWorkspaces, ManifestWorkspaceActions, @@ -104,7 +104,7 @@ const workspaceActions: Array = [ match: workspace.alias, }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -126,7 +126,7 @@ const workspaceActions: Array = [ match: workspace.alias, }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -146,7 +146,7 @@ const workspaceActions: Array = [ match: workspace.alias, }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -171,7 +171,7 @@ const workspaceActionMenuItems: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -193,7 +193,7 @@ const workspaceActionMenuItems: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, @@ -215,7 +215,7 @@ const workspaceActionMenuItems: Array = [ allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, { - alias: UMB_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, ], }, From 18f352c6e796fca10a6c11aab6f053671fae7156 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:01:58 +0200 Subject: [PATCH 280/323] update imports --- .../is-not-trashed/entity-is-not-trashed.condition.ts | 4 ++-- .../conditions/is-trashed/entity-is-trashed.condition.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts index 0dc7a52878..9911a42daf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts @@ -1,4 +1,4 @@ -import { UMB_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; +import { UMB_ENTITY_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { @@ -18,7 +18,7 @@ export class UmbEntityIsNotTrashedCondition // and therefore the condition is permitted this.permitted = true; - this.consumeContext(UMB_IS_TRASHED_CONTEXT, (context) => { + this.consumeContext(UMB_ENTITY_IS_TRASHED_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === false; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts index 6c1e5307eb..1c62dc2852 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts @@ -1,4 +1,4 @@ -import { UMB_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; +import { UMB_ENTITY_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbConditionConfigBase, @@ -11,7 +11,7 @@ export class UmbIsTrashedCondition extends UmbConditionBase) { super(host, args); - this.consumeContext(UMB_IS_TRASHED_CONTEXT, (context) => { + this.consumeContext(UMB_ENTITY_IS_TRASHED_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === true; }); From cffda64773a608028b58add713ee53760ba83110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:03:59 +0200 Subject: [PATCH 281/323] input with alias --- .../src/packages/core/components/index.ts | 1 + .../input-with-alias.element.ts | 117 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts index 368ad64743..21185774e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts @@ -25,6 +25,7 @@ export * from './input-radio-button-list/index.js'; export * from './input-slider/index.js'; export * from './input-toggle/index.js'; export * from './input-upload-field/index.js'; +export * from './input-with-alias/input-with-alias.element.js'; export * from './multiple-color-picker-input/index.js'; export * from './multiple-text-string-input/index.js'; export * from './popover-layout/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts new file mode 100644 index 0000000000..8db01ae06d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts @@ -0,0 +1,117 @@ +import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { type UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { generateAlias } from '@umbraco-cms/backoffice/utils'; + +@customElement('umb-input-with-alias') +export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLitElement) { + @property({ type: String }) + label: string = ''; + + @property({ type: String, reflect: false }) + alias?: string; + + @state() + private _aliasLocked = true; + + firstUpdated() { + this.shadowRoot?.querySelectorAll('uui-input').forEach((x) => this.addFormControlElement(x)); + } + + focus() { + return this.shadowRoot?.querySelector('uui-input')?.focus(); + } + + #onNameChange(event: UUIInputEvent) { + if (event instanceof UUIInputEvent) { + const target = event.composedPath()[0] as UUIInputElement; + + if (typeof target?.value === 'string') { + const oldName = this.value; + const oldAlias = this.alias ?? ''; + this.value = event.target.value.toString(); + if (this._aliasLocked) { + // If locked we will update the alias, but only if it matches the generated alias of the old name [NL] + const expectedOldAlias = generateAlias(oldName ?? ''); + // Only update the alias if the alias matches a generated alias of the old name (otherwise the alias is considered one written by the user.) [NL] + if (expectedOldAlias === oldAlias) { + this.alias = generateAlias(this.value); + } + } + this.dispatchEvent(new UmbChangeEvent()); + } + } + } + + #onAliasChange(e: UUIInputEvent) { + if (event instanceof UUIInputEvent) { + const target = event.composedPath()[0] as UUIInputElement; + if (typeof target?.value === 'string') { + this.alias = target.value; + this.dispatchEvent(new UmbChangeEvent()); + } + } + e.stopPropagation(); + } + + #onToggleAliasLock() { + this._aliasLocked = !this._aliasLocked; + } + + render() { + // Localizations: [NL] + return html` + + + + +
''} id="alias-lock" slot="prepend"> + +
+
+
+ `; + } + + static styles = css` + #name { + width: 100%; + flex: 1 1 auto; + align-items: center; + } + + :host(:invalid:not([pristine])) { + color: var(--uui-color-danger); + } + :host(:invalid:not([pristine])) > uui-input { + border-color: var(--uui-color-danger); + } + + #alias-lock { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + } + #alias-lock uui-icon { + margin-bottom: 2px; + } + `; +} + +export default UmbInputWithAliasElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-with-alias': UmbInputWithAliasElement; + } +} From e6576dc1730cfc4af4287de73659ad76c79d05b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:04:09 +0200 Subject: [PATCH 282/323] update change event of slider --- .../core/components/input-slider/input-slider.element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts index 7e7cc81dca..cbb92e39f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts @@ -2,6 +2,7 @@ import { html, customElement, property } from '@umbraco-cms/backoffice/external/ import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UUISliderEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-input-slider') export class UmbInputSliderElement extends UUIFormControlMixin(UmbLitElement, '') { @@ -30,7 +31,7 @@ export class UmbInputSliderElement extends UUIFormControlMixin(UmbLitElement, '' #onChange(e: UUISliderEvent) { e.stopPropagation(); this.value = e.target.value as string; - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + this.dispatchEvent(new UmbChangeEvent()); } render() { From ff986b1103679f1e1775a1892d630affdaa2fe96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:04:16 +0200 Subject: [PATCH 283/323] implement document-type workspace --- .../document-type-workspace-editor.element.ts | 82 +++---------------- 1 file changed, 12 insertions(+), 70 deletions(-) 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 7c3ec7184e..274b34825e 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,10 +1,8 @@ import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from './document-type-workspace.context-token.js'; +import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/components'; 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 { 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') export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @state() @@ -13,9 +11,6 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @state() private _alias?: string; - @state() - private _aliasLocked = true; - @state() private _icon?: string; @@ -37,42 +32,6 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { this.observe(this.#workspaceContext.icon, (icon) => (this._icon = icon), '_observeIcon'); } - // TODO. find a way where we don't have to do this for all workspaces. - #onNameChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - const oldName = this._name; - const oldAlias = this._alias; - const newName = event.target.value.toString(); - if (this._aliasLocked) { - const expectedOldAlias = generateAlias(oldName ?? ''); - // Only update the alias if the alias matches a generated alias of the old name (otherwise the alias is considered one written by the user.) - if (expectedOldAlias === oldAlias) { - this.#workspaceContext?.setAlias(generateAlias(newName)); - } - } - this.#workspaceContext?.setName(target.value); - } - } - } - - // TODO. find a way where we don't have to do this for all workspaces. - #onAliasChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string') { - this.#workspaceContext?.setAlias(target.value); - } - } - event.stopPropagation(); - } - - #onToggleAliasLock() { - this._aliasLocked = !this._aliasLocked; - } - private async _handleIconClick() { const [alias, color] = this._icon?.replace('color-', '')?.split(' ') ?? []; const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); @@ -92,6 +51,11 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { }); } + #onNameAndAliasChange(event: InputEvent & { target: UmbInputWithAliasElement }) { + this.#workspaceContext?.setName(event.target.value ?? ''); + this.#workspaceContext?.setAlias(event.target.alias ?? ''); + } + render() { return html` @@ -100,22 +64,12 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { - - - - -
''} id="alias-lock" slot="prepend"> - -
-
-
+
`; @@ -136,18 +90,6 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { #name { width: 100%; - flex: 1 1 auto; - align-items: center; - } - - #alias-lock { - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - } - #alias-lock uui-icon { - margin-bottom: 2px; } #icon { From f97ee340ee14c3815637c10278726b3868b826c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:04:22 +0200 Subject: [PATCH 284/323] implement media-type --- .../media-type-workspace-editor.element.ts | 76 +++---------------- 1 file changed, 11 insertions(+), 65 deletions(-) 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 66c3009968..7bc4dedd8f 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 @@ -39,43 +39,6 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { this.observe(this.#workspaceContext.icon, (icon) => (this._icon = icon), '_observeIcon'); } - // TODO: find a way where we don't have to do this for all workspaces. - #onNameChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - const oldName = this._name; - const oldAlias = this._alias; - const newName = event.target.value.toString(); - if (this._aliasLocked) { - const expectedOldAlias = generateAlias(oldName ?? ''); - // Only update the alias if the alias matches a generated alias of the old name (otherwise the alias is considered one written by the user.) - if (expectedOldAlias === oldAlias) { - this.#workspaceContext?.setAlias(generateAlias(newName)); - } - } - this.#workspaceContext?.setName(target.value); - } - } - } - - // TODO: find a way where we don't have to do this for all workspaces. - #onAliasChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - this.#workspaceContext?.setAlias(target.value); - } - } - event.stopPropagation(); - } - - #onToggleAliasLock() { - this._aliasLocked = !this._aliasLocked; - } - private async _handleIconClick() { const [alias, color] = this._icon?.replace('color-', '')?.split(' ') ?? []; @@ -96,6 +59,11 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { }); } + #onNameAndAliasChange(event: InputEvent & { target: UmbInputWithAliasElement }) { + this.#workspaceContext?.setName(event.target.value ?? ''); + this.#workspaceContext?.setAlias(event.target.alias ?? ''); + } + render() { return html` `; } @@ -138,18 +96,6 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { #name { width: 100%; - flex: 1 1 auto; - align-items: center; - } - - #alias-lock { - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - } - #alias-lock uui-icon { - margin-bottom: 2px; } #icon { From 81981b888f23a4fc4189c1ea25c8d39733ca39be Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:04:43 +0200 Subject: [PATCH 285/323] add conditions to all media entity actions + workspace actions --- .../packages/media/media/entity-actions/create/manifests.ts | 6 ++++++ .../src/packages/media/media/entity-actions/manifests.ts | 6 ++++++ .../media/media/entity-actions/move-to/manifests.ts | 6 ++++++ .../src/packages/media/media/workspace/manifests.ts | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts index c1ed315604..8b20476839 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts @@ -1,5 +1,6 @@ import { UMB_MEDIA_ENTITY_TYPE, UMB_MEDIA_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UmbCreateMediaEntityAction } from './create.action.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -15,6 +16,11 @@ const entityActions: Array = [ icon: 'icon-add', label: '#actions_create', }, + conditions: [ + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], }, ]; 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 05b0de44cf..c74e9dc44e 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 @@ -3,6 +3,7 @@ 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'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; const entityActions: Array = [ ...createManifests, @@ -16,6 +17,11 @@ const entityActions: Array = [ itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, detailRepositoryAlias: UMB_MEDIA_DETAIL_REPOSITORY_ALIAS, }, + conditions: [ + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], }, ]; 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 index 64715a063c..53da2d5484 100644 --- 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 @@ -2,6 +2,7 @@ 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 { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ @@ -16,6 +17,11 @@ const entityActions: Array = [ moveRepositoryAlias: UMB_MOVE_MEDIA_REPOSITORY_ALIAS, treeAlias: UMB_MEDIA_TREE_ALIAS, }, + conditions: [ + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts index 491acb51b1..b26fbb35d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts @@ -5,6 +5,7 @@ import type { ManifestWorkspaceView, ManifestTypes, } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; const workspace: ManifestWorkspaces = { type: 'workspace', @@ -93,6 +94,9 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, ], }, ]; From ea259d8d90d0f4e91caef53d03383222a8daa7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:05:42 +0200 Subject: [PATCH 286/323] member type + focus --- .../document-type-workspace-editor.element.ts | 4 +- .../media-type-workspace-editor.element.ts | 6 +- .../member-type-workspace-editor.element.ts | 71 ++++--------------- 3 files changed, 17 insertions(+), 64 deletions(-) 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 274b34825e..ad180d854a 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 @@ -3,6 +3,7 @@ import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/component import { umbFocus, UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; + @customElement('umb-document-type-workspace-editor') export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @state() @@ -69,7 +70,8 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { label="name" value=${this._name} alias=${this._alias} - @change="${this.#onNameAndAliasChange}"> + @change="${this.#onNameAndAliasChange}" + ${umbFocus()}>
`; 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 7bc4dedd8f..5e9305199c 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 @@ -1,11 +1,8 @@ import type { UmbMediaTypeWorkspaceContext } from './media-type-workspace.context.js'; import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from './media-type-workspace.context-token.js'; -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, 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'; @customElement('umb-media-type-workspace-editor') export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { @@ -76,7 +73,8 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { label="name" value=${this._name} alias=${this._alias} - @change="${this.#onNameAndAliasChange}"> + @change="${this.#onNameAndAliasChange}" + ${umbFocus()}>
`; } 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 37f3e59b7b..e10fedb763 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,10 +1,7 @@ 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, 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'; -import { generateAlias } from '@umbraco-cms/backoffice/utils'; @customElement('umb-member-type-workspace-editor') export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { @@ -14,9 +11,6 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { @state() private _alias?: string; - @state() - private _aliasLocked = true; - @state() private _icon?: string; @@ -54,43 +48,6 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { ); } - // TODO. find a way where we don't have to do this for all workspaces. - #onNameChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - const oldName = this._name; - const oldAlias = this._alias; - const newName = event.target.value.toString(); - if (this._aliasLocked) { - const expectedOldAlias = generateAlias(oldName ?? ''); - // Only update the alias if the alias matches a generated alias of the old name (otherwise the alias is considered one written by the user.) - if (expectedOldAlias === oldAlias) { - this.#workspaceContext?.set('alias', generateAlias(newName)); - } - } - this.#workspaceContext?.setName(target.value); - } - } - } - - // TODO. find a way where we don't have to do this for all workspaces. - #onAliasChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - this.#workspaceContext?.set('alias', target.value); - } - } - event.stopPropagation(); - } - - #onToggleAliasLock() { - this._aliasLocked = !this._aliasLocked; - } - private async _handleIconClick() { const [alias, color] = this._icon?.replace('color-', '')?.split(' ') ?? []; const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); @@ -110,6 +67,11 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { }); } + #onNameAndAliasChange(event: InputEvent & { target: UmbInputWithAliasElement }) { + this.#workspaceContext?.setName(event.target.value ?? ''); + this.#workspaceContext?.setAlias(event.target.alias ?? ''); + } + render() { return html` @@ -118,22 +80,13 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { - - - - -
''} id="alias-lock" slot="prepend"> - -
-
-
+
- (location.href = '')}> + ${this.hideBackButton + ? nothing + : html` + (location.href = '')}> + `}
${this.errorHeadline ? this.errorHeadline diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 9ec240e899..598f8e2ad6 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -64,6 +64,7 @@ export class UmbAppElement extends UmbLitElement { setup: (component) => { const searchParams = new URLSearchParams(window.location.search); const hasCode = searchParams.has('code'); + (component as UmbAppErrorElement).hideBackButton = true; (component as UmbAppErrorElement).errorHeadline = this.localize.term('general_login'); (component as UmbAppErrorElement).errorMessage = hasCode ? this.localize.term('errors_externalLoginSuccess') From 715135006611c4cd4494a6a0463dfab0c5c8e293 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 16:12:04 +0100 Subject: [PATCH 215/323] Adds loading state on the context --- .../core/collection/default/collection-default.context.ts | 7 +++++++ .../views/grid/document-grid-collection-view.element.ts | 2 ++ .../views/table/document-table-collection-view.element.ts | 2 ++ 3 files changed, 11 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts index 11247ffae2..088b17a742 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts @@ -31,6 +31,9 @@ export class UmbDefaultCollectionContext< #manifest?: ManifestCollection; #repository?: UmbCollectionRepository; + #loading = new UmbObjectState(false); + public readonly loading = this.#loading.asObservable(); + #items = new UmbArrayState([], (x) => x); public readonly items = this.#items.asObservable(); @@ -176,6 +179,8 @@ export class UmbDefaultCollectionContext< if (!this.#repository) throw new Error(`Missing repository for ${this.#manifest}`); + this.#loading.setValue(true); + const filter = this.#filter.getValue(); const { data } = await this.#repository.requestCollection(filter); @@ -184,6 +189,8 @@ export class UmbDefaultCollectionContext< this.#totalItems.setValue(data.total); this.pagination.setTotalItems(data.total); } + + this.#loading.setValue(false); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index 8ec535ba7f..01b818fb1b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -39,6 +39,8 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { #observeCollectionContext() { if (!this.#collectionContext) return; + this.observe(this.#collectionContext.loading, (loading) => (this._loading = loading), '_observeLoading'); + this.observe( this.#collectionContext.userDefinedProperties, (userDefinedProperties) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 943588f16e..6764068675 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -75,6 +75,8 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { #observeCollectionContext() { if (!this.#collectionContext) return; + this.observe(this.#collectionContext.loading, (loading) => (this._loading = loading), '_observeLoading'); + this.observe( this.#collectionContext.userDefinedProperties, (userDefinedProperties) => { From 3f724e481a941fabf0a6efc2028c3bc865d48bda Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 16:15:04 +0100 Subject: [PATCH 216/323] Registers the Route Builder on the Document Collection Views --- .../documents/documents/collection/types.ts | 5 +++ .../document-grid-collection-view.element.ts | 23 +++++++++--- .../document-table-column-name.element.ts | 33 ++++------------- .../document-table-column-state.element.ts | 11 +++--- .../document-table-collection-view.element.ts | 35 +++++++++++++++++-- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts index ffcbcb13d3..6539b5c5e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts @@ -23,3 +23,8 @@ export interface UmbDocumentCollectionItemModel { updater?: string | null; values: Array<{ alias: string; value: string }>; } + +export interface UmbEditableDocumentCollectionItemModel { + item: UmbDocumentCollectionItemModel; + editPath: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index 01b818fb1b..c7405ddbcc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -7,9 +7,13 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; @customElement('umb-document-grid-collection-view') export class UmbDocumentGridCollectionViewElement extends UmbLitElement { + @state() + private _editDocumentPath = ''; + @state() private _items: Array = []; @@ -34,6 +38,15 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { this.#collectionContext = collectionContext; this.#observeCollectionContext(); }); + + new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath('document') + .onSetup(() => { + return { data: { entityType: 'document', preset: {} } }; + }) + .observeRouteBuilder((routeBuilder) => { + this._editDocumentPath = routeBuilder({}); + }); } #observeCollectionContext() { @@ -66,10 +79,10 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { ); } - // TODO: How should we handle url stuff? [?] - #onOpen(id: string) { - // TODO: this will not be needed when cards works as links with href [?] - history.pushState(null, '', 'section/content/workspace/document/edit/' + id); + #onOpen(event: Event, id: string) { + event.preventDefault(); + event.stopPropagation(); + window.history.pushState(null, '', this._editDocumentPath + 'edit/' + id); } #onSelect(item: UmbDocumentCollectionItemModel) { @@ -111,7 +124,7 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { selectable ?select-only=${this._selection.length > 0} ?selected=${this.#isSelected(item)} - @open=${() => this.#onOpen(item.unique ?? '')} + @open=${(event: Event) => this.#onOpen(event, item.unique ?? '')} @selected=${() => this.#onSelect(item)} @deselected=${() => this.#onDeselect(item)}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts index 1d9e39d4b3..0801145f11 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-name.element.ts @@ -1,49 +1,30 @@ -import type { UmbDocumentCollectionItemModel } from '../../../types.js'; -import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbEditableDocumentCollectionItemModel } from '../../../types.js'; +import { css, customElement, html, nothing, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import type { UmbTableColumn, UmbTableColumnLayoutElement, UmbTableItem } from '@umbraco-cms/backoffice/components'; import type { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-document-table-column-name') export class UmbDocumentTableColumnNameElement extends UmbLitElement implements UmbTableColumnLayoutElement { - @state() - private _editDocumentPath = ''; - - @property({ type: Object, attribute: false }) column!: UmbTableColumn; - - @property({ type: Object, attribute: false }) item!: UmbTableItem; @property({ attribute: false }) - value!: UmbDocumentCollectionItemModel; - - constructor() { - super(); - - new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) - .addAdditionalPath('document') - .onSetup(() => { - return { data: { entityType: 'document', preset: {} } }; - }) - .observeRouteBuilder((routeBuilder) => { - this._editDocumentPath = routeBuilder({}); - }); - } + value!: UmbEditableDocumentCollectionItemModel; #onClick(event: Event & { target: UUIButtonElement }) { event.preventDefault(); event.stopPropagation(); - window.history.pushState({}, '', event.target.href); + window.history.pushState(null, '', event.target.href); } render() { + if (!this.value) return nothing; return html` `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-state.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-state.element.ts index 1a44194e82..11c1e6985b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-state.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/column-layouts/document-table-column-state.element.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentCollectionItemModel } from '../../../types.js'; +import type { UmbEditableDocumentCollectionItemModel } from '../../../types.js'; import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; import { fromCamelCase } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -6,17 +6,14 @@ import type { UmbTableColumn, UmbTableColumnLayoutElement, UmbTableItem } from ' @customElement('umb-document-table-column-state') export class UmbDocumentTableColumnStateElement extends UmbLitElement implements UmbTableColumnLayoutElement { - @property({ type: Object, attribute: false }) column!: UmbTableColumn; - - @property({ type: Object, attribute: false }) item!: UmbTableItem; @property({ attribute: false }) - value!: UmbDocumentCollectionItemModel; + value!: UmbEditableDocumentCollectionItemModel; render() { - switch (this.value.state) { + switch (this.value.item.state) { case 'Published': return html`${this.localize.term('content_published')}`; case 'PublishedPendingChanges': @@ -26,7 +23,7 @@ export class UmbDocumentTableColumnStateElement extends UmbLitElement implements case 'NotCreated': return html`${this.localize.term('content_notCreated')}`; default: - return html`${fromCamelCase(this.value.state)}`; + return html`${fromCamelCase(this.value.item.state)}`; } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 6764068675..175918e86a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -6,6 +6,8 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/externa import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal'; import type { UmbTableColumn, UmbTableConfig, @@ -64,12 +66,36 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { #collectionContext?: UmbDocumentCollectionContext; + #routeBuilder?: UmbModalRouteBuilder; + constructor() { super(); this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; - this.#observeCollectionContext(); }); + + this.#registerModalRoute(); + } + + #registerModalRoute() { + new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath(':entityType') + .onSetup((params) => { + return { data: { entityType: params.entityType, preset: {} } }; + }) + .onReject(() => { + this.#collectionContext?.requestCollection(); + }) + .onSubmit(() => { + this.#collectionContext?.requestCollection(); + }) + .observeRouteBuilder((routeBuilder) => { + this.#routeBuilder = routeBuilder; + + // NOTE: Configuring the observations AFTER the route builder is ready, + // otherwise there is a race condition and `#collectionContext.items` tends to win. [LK] + this.#observeCollectionContext(); + }); } #observeCollectionContext() { @@ -133,15 +159,20 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { const data = this._tableColumns?.map((column) => { + const editPath = this.#routeBuilder + ? this.#routeBuilder({ entityType: item.entityType }) + `edit/${item.unique}` + : ''; + return { columnAlias: column.alias, - value: column.elementName ? item : getPropertyValueByAlias(item, column.alias), + value: column.elementName ? { item, editPath } : getPropertyValueByAlias(item, column.alias), }; }) ?? []; return { id: item.unique, icon: item.icon, + entityType: 'document', data: data, }; }); From 4410c76aac637a88f77378e69526adbb8f35ab3a Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 16:15:16 +0100 Subject: [PATCH 217/323] Code tidy-up --- .../default/collection-default.element.ts | 2 +- .../documents/documents/collection/types.ts | 2 +- .../document-grid-collection-view.element.ts | 8 ++++---- .../document-table-collection-view.element.ts | 18 ++++-------------- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts index 087dd2e362..d4923f45cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts @@ -57,7 +57,7 @@ export class UmbCollectionDefaultElement extends UmbLitElement { return html` ${this.renderToolbar()} - + ${this.renderPagination()} ${this.renderSelectionActions()} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts index 6539b5c5e6..c3a7b16517 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts @@ -6,7 +6,7 @@ export interface UmbDocumentCollectionFilterModel extends UmbCollectionFilterMod orderBy?: string; orderCulture?: string; orderDirection?: 'asc' | 'desc'; - userDefinedProperties: Array<{alias: string, header: string, isSystem: boolean}>; + userDefinedProperties: Array<{ alias: string; header: string; isSystem: boolean }>; } export interface UmbDocumentCollectionItemModel { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index c7405ddbcc..d3d11169a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -59,15 +59,15 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { (userDefinedProperties) => { this._userDefinedProperties = userDefinedProperties; }, - 'umbCollectionUserDefinedPropertiesObserver', + '_observeUserDefinedProperties', ); - this.observe(this.#collectionContext.items, (items) => (this._items = items), 'umbCollectionItemsObserver'); + this.observe(this.#collectionContext.items, (items) => (this._items = items), '_observeItems'); this.observe( this.#collectionContext.selection.selection, (selection) => (this._selection = selection), - 'umbCollectionSelectionObserver', + '_observeSelection', ); this.observe( @@ -75,7 +75,7 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { (skip) => { this._skip = skip; }, - 'umbCollectionSkipObserver', + '_observePaginationSkip', ); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 175918e86a..93534ff9ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -61,15 +61,13 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { @state() private _selection: Array = []; - @state() - private _skip: number = 0; - #collectionContext?: UmbDocumentCollectionContext; #routeBuilder?: UmbModalRouteBuilder; constructor() { super(); + this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; }); @@ -109,7 +107,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { this._userDefinedProperties = userDefinedProperties; this.#createTableHeadings(); }, - 'umbCollectionUserDefinedPropertiesObserver', + '_observeUserDefinedProperties', ); this.observe( @@ -118,7 +116,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { this._items = items; this.#createTableItems(this._items); }, - 'umbCollectionItemsObserver', + '_observeItems', ); this.observe( @@ -126,15 +124,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { (selection) => { this._selection = selection as string[]; }, - 'umbCollectionSelectionObserver', - ); - - this.observe( - this.#collectionContext.pagination.skip, - (skip) => { - this._skip = skip; - }, - 'umbCollectionSkipObserver', + '_observeSelection', ); } From 07d7e7ebfdc00694e7dd27f4921eb6b2ef75d39d Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 16:52:21 +0100 Subject: [PATCH 218/323] Refactored the loading state It previously caused a bug with the sort ordering feature. Because the `` was being removed from the DOM. It now uses an alternative loading bar. --- .../document-grid-collection-view.element.ts | 41 ++++++++++++------- .../document-table-collection-view.element.ts | 31 +++++++++----- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index d3d11169a5..b94e2d9b85 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -1,7 +1,7 @@ import { getPropertyValueByAlias } from '../index.js'; import type { UmbCollectionColumnConfiguration } from '../../../../../core/collection/types.js'; import type { UmbDocumentCollectionFilterModel, UmbDocumentCollectionItemModel } from '../../types.js'; -import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, nothing, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; import { fromCamelCase } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -98,26 +98,37 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { } render() { - if (this._loading) { - return html`
`; - } - - if (this._items.length === 0) { - return html`

${this.localize.term('content_listViewNoItems')}

`; - } + return this._items.length === 0 ? this.#renderEmpty() : this.#renderItems(); + } + #renderEmpty() { + if (this._items.length > 0) return nothing; return html` -
- ${repeat( - this._items, - (item) => item.unique, - (item) => this.#renderCard(item), +
+ ${when( + this._loading, + () => html``, + () => html`

${this.localize.term('content_listViewNoItems')}

`, )}
`; } - #renderCard(item: UmbDocumentCollectionItemModel) { + #renderItems() { + if (this._items.length === 0) return nothing; + return html` +
+ ${repeat( + this._items, + (item) => item.unique, + (item) => this.#renderItem(item), + )} +
+ ${when(this._loading, () => html``)} + `; + } + + #renderItem(item: UmbDocumentCollectionItemModel) { return html` `; default: return html`${fromCamelCase(item.state)}`; - } + } } #renderProperties(item: UmbDocumentCollectionItemModel) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 93534ff9ee..54683263d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -2,7 +2,7 @@ import { getPropertyValueByAlias } from '../index.js'; import type { UmbCollectionColumnConfiguration } from '../../../../../core/collection/types.js'; import type { UmbDocumentCollectionItemModel } from '../../types.js'; import type { UmbDocumentCollectionContext } from '../../document-collection.context.js'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, nothing, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; @@ -193,23 +193,34 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { } render() { - if (this._loading) { - return html`
`; - } + return this._tableItems.length === 0 ? this.#renderEmpty() : this.#renderItems(); + } - if (this._tableItems.length === 0) { - return html`

${this.localize.term('content_listViewNoItems')}

`; - } + #renderEmpty() { + if (this._tableItems.length > 0) return nothing; + return html` +
+ ${when( + this._loading, + () => html``, + () => html`

${this.localize.term('content_listViewNoItems')}

`, + )} +
+ `; + } + #renderItems() { + if (this._tableItems.length === 0) return nothing; return html` + @selected=${this.#handleSelect} + @deselected=${this.#handleDeselect} + @ordered=${this.#handleOrdering}> + ${when(this._loading, () => html``)} `; } From 707aaa4a9c429c945df95152b6929b35818c1eb3 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 16:52:49 +0100 Subject: [PATCH 219/323] Grid: Simplifies the `state` tag code --- .../document-grid-collection-view.element.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index b94e2d9b85..d4d23e2d5e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -7,6 +7,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import type { UUIInterfaceColor } from '@umbraco-cms/backoffice/external/uui'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; @customElement('umb-document-grid-collection-view') @@ -144,27 +145,24 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { `; } - #renderState(item: UmbDocumentCollectionItemModel) { - switch (item.state) { + #getStateTagConfig(state: string): { color: UUIInterfaceColor; label: string } { + switch (state) { case 'Published': - return html`${this.localize.term('content_published')}`; + return { color: 'positive', label: this.localize.term('content_published') }; case 'PublishedPendingChanges': - return html`${this.localize.term('content_publishedPendingChanges')}`; + return { color: 'warning', label: this.localize.term('content_publishedPendingChanges') }; case 'Draft': - return html`${this.localize.term('content_unpublished')}`; + return { color: 'default', label: this.localize.term('content_unpublished') }; case 'NotCreated': - return html`${this.localize.term('content_notCreated')}`; + return { color: 'danger', label: this.localize.term('content_notCreated') }; default: - return html`${fromCamelCase(item.state)}`; + return { color: 'danger', label: fromCamelCase(state) }; + } } + + #renderState(item: UmbDocumentCollectionItemModel) { + const tagConfig = this.#getStateTagConfig(item.state); + return html`${tagConfig.label}`; } #renderProperties(item: UmbDocumentCollectionItemModel) { From 980ae8d35f625dc334bf2eae9d6189d3f35034b2 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 15:07:00 +0100 Subject: [PATCH 220/323] Renames `UMB_DEFAULT_COLLECTION_CONTEXT` to `UMB_COLLECTION_CONTEXT` We'll keep `UMB_DEFAULT_COLLECTION_CONTEXT` available, but marked as deprecated. --- .../core/collection/collection-alias.condition.ts | 4 ++-- .../collection-bulk-action-permission.condition.ts | 4 ++-- .../components/collection-action-bundle.element.ts | 4 ++-- .../components/collection-selection-actions.element.ts | 6 +++--- .../components/collection-view-bundle.element.ts | 4 ++-- .../pagination/collection-pagination.element.ts | 4 ++-- .../collection/default/collection-default.context.ts | 9 +++++++-- .../collection/default/collection-default.element.ts | 4 ++-- .../collection/extension-collection.element.ts | 4 ++-- .../extension-table-action-column-layout.element.ts | 4 ++-- .../table/extension-table-collection-view.element.ts | 4 ++-- .../table/dictionary-table-collection-view.element.ts | 4 ++-- .../action/create-document-collection-action.element.ts | 4 ++-- .../collection/document-collection-toolbar.element.ts | 4 ++-- .../views/grid/document-grid-collection-view.element.ts | 4 ++-- .../table/document-table-collection-view.element.ts | 4 ++-- .../table/language-table-collection-view.element.ts | 4 ++-- .../action/create-media-collection-action.element.ts | 4 ++-- .../media/collection/media-collection-toolbar.element.ts | 4 ++-- .../media/media/collection/media-collection.element.ts | 4 ++-- .../views/grid/media-grid-collection-view.element.ts | 4 ++-- .../views/table/media-table-collection-view.element.ts | 4 ++-- .../table/member-group-table-collection-view.element.ts | 4 ++-- .../collection/member-collection-header.element.ts | 4 ++-- .../views/table/member-table-collection-view.element.ts | 4 ++-- .../table/relation-type-table-collection-view.element.ts | 4 ++-- .../views/user-group-table-collection-view.element.ts | 4 ++-- .../user/collection/user-collection-header.element.ts | 4 ++-- .../views/grid/user-grid-collection-view.element.ts | 4 ++-- .../views/table/user-table-collection-view.element.ts | 4 ++-- .../views/table/webhook-table-collection-view.element.ts | 4 ++-- 31 files changed, 68 insertions(+), 63 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts index 1327d72ef6..55c24bca7b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts @@ -1,4 +1,4 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT } from './default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from './default/collection-default.context.js'; import type { CollectionAliasConditionConfig } from './collection-alias.manifest.js'; import type { UmbConditionControllerArguments, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; @@ -10,7 +10,7 @@ export class UmbCollectionAliasCondition { constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { super(host, args); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => { this.permitted = context.getManifest()?.alias === this.config.match; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-bulk-action-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-bulk-action-permission.condition.ts index c12120ce54..b96ab7e9b7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-bulk-action-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-bulk-action-permission.condition.ts @@ -1,4 +1,4 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT } from './default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from './default/collection-default.context.js'; import type { CollectionBulkActionPermissionConditionConfig } from './collection-bulk-action-permission.manifest.js'; import type { UmbConditionControllerArguments, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,7 +14,7 @@ export class UmbCollectionBulkActionPermissionCondition ) { super(host, args); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => { const allowedActions = context.getConfig()?.allowedEntityBulkActions; this.permitted = allowedActions ? this.config.match(allowedActions) : false; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts index 4f90d68f5f..618bd45126 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts @@ -1,5 +1,5 @@ import type { UmbDefaultCollectionContext } from '../default/collection-default.context.js'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; import { html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -13,7 +13,7 @@ export class UmbCollectionActionBundleElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => { this.#collectionContext = context; if (!this.#collectionContext) return; this._collectionAlias = this.#collectionContext.getManifest()?.alias; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts index 79cdb886eb..4b5cb7ebff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts @@ -1,4 +1,4 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; import type { ManifestEntityBulkAction, MetaEntityBulkAction } from '../../extension-registry/models/index.js'; import type { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -22,11 +22,11 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { private _selection: Array = []; - private _collectionContext?: typeof UMB_DEFAULT_COLLECTION_CONTEXT.TYPE; + private _collectionContext?: typeof UMB_COLLECTION_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this._collectionContext = instance; this._observeCollectionContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts index 276c742c57..fa6fbf6d63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts @@ -1,5 +1,5 @@ import type { UmbDefaultCollectionContext } from '../default/collection-default.context.js'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; import type { UmbCollectionLayoutConfiguration } from '../types.js'; import { css, html, customElement, state, nothing, repeat, query } from '@umbraco-cms/backoffice/external/lit'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; @@ -35,7 +35,7 @@ export class UmbCollectionViewBundleElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => { this.#collectionContext = context; this.#observeCollection(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts index 7b128ac0db..f2df8ee11b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts @@ -1,4 +1,4 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../../default/collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT } from '../../default/collection-default.context.js'; import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, nothing, state } from '@umbraco-cms/backoffice/external/lit'; @@ -17,7 +17,7 @@ export class UmbCollectionPaginationElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this._collectionContext = instance; this.#observeCurrentPage(); this.#observerTotalPages(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts index 11247ffae2..4a2df0b6c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts @@ -61,7 +61,7 @@ export class UmbDefaultCollectionContext< }); constructor(host: UmbControllerHost, defaultViewAlias: string, defaultFilter: Partial = {}) { - super(host, UMB_DEFAULT_COLLECTION_CONTEXT); + super(host, UMB_COLLECTION_CONTEXT); this.#defaultViewAlias = defaultViewAlias; this.#defaultFilter = defaultFilter; @@ -217,4 +217,9 @@ export class UmbDefaultCollectionContext< } } -export const UMB_DEFAULT_COLLECTION_CONTEXT = new UmbContextToken('UmbCollectionContext'); +export const UMB_COLLECTION_CONTEXT = new UmbContextToken('UmbCollectionContext'); + +/** + * @deprecated Use UMB_COLLECTION_CONTEXT instead. + */ +export { UMB_COLLECTION_CONTEXT as UMB_DEFAULT_COLLECTION_CONTEXT }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts index 087dd2e362..49fa7629b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts @@ -1,4 +1,4 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js'; +import { UMB_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -30,7 +30,7 @@ export class UmbCollectionDefaultElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => { this.#collectionContext = context; this.#observeCollectionRoutes(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts index 771e816dc9..a9aa2ffb23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts @@ -1,7 +1,7 @@ import { umbExtensionsRegistry } from '../registry.js'; import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { fromCamelCase } from '@umbraco-cms/backoffice/utils'; -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbCollectionDefaultElement } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT, UmbCollectionDefaultElement } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; @@ -17,7 +17,7 @@ export class UmbExtensionCollectionElement extends UmbCollectionDefaultElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/extension-table-action-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/extension-table-action-column-layout.element.ts index 21e61f9820..a647801b7e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/extension-table-action-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/extension-table-action-column-layout.element.ts @@ -1,5 +1,5 @@ import { umbExtensionsRegistry } from '../../index.js'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; @@ -16,7 +16,7 @@ export class UmbExtensionTableActionColumnLayoutElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/table/extension-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/table/extension-table-collection-view.element.ts index a6bca34155..302fb89c2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/table/extension-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/table/extension-table-collection-view.element.ts @@ -1,5 +1,5 @@ import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -48,7 +48,7 @@ export class UmbExtensionTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/views/table/dictionary-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/views/table/dictionary-table-collection-view.element.ts index d5ca96d178..3b79c11925 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/views/table/dictionary-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/views/table/dictionary-table-collection-view.element.ts @@ -1,6 +1,6 @@ import type { UmbDictionaryCollectionModel } from '../../types.js'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -32,7 +32,7 @@ export class UmbDictionaryTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/action/create-document-collection-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/action/create-document-collection-action.element.ts index bd5c34ceeb..334daf9de0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/action/create-document-collection-action.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/action/create-document-collection-action.element.ts @@ -1,7 +1,7 @@ import { html, customElement, property, state, map } from '@umbraco-cms/backoffice/external/lit'; import { UmbDocumentTypeStructureRepository } from '@umbraco-cms/backoffice/document-type'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN, UMB_DOCUMENT_ENTITY_TYPE, @@ -58,7 +58,7 @@ export class UmbCreateDocumentCollectionActionElement extends UmbLitElement { }); }); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.observe(collectionContext.filter, (filter) => { this._useInfiniteEditor = filter.useInfiniteEditor == true; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/document-collection-toolbar.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/document-collection-toolbar.element.ts index b053244865..3eaab38a73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/document-collection-toolbar.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/document-collection-toolbar.element.ts @@ -1,6 +1,6 @@ import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; @customElement('umb-document-collection-toolbar') @@ -13,7 +13,7 @@ export class UmbDocumentCollectionToolbarElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index 8ec535ba7f..673c99e34c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -5,7 +5,7 @@ import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice import { fromCamelCase } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; @customElement('umb-document-grid-collection-view') @@ -30,7 +30,7 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; this.#observeCollectionContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts index 943588f16e..41851a1a6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -5,7 +5,7 @@ import type { UmbDocumentCollectionContext } from '../../document-collection.con import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, @@ -66,7 +66,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; this.#observeCollectionContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/views/table/language-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/views/table/language-table-collection-view.element.ts index 3e3359dc27..7763526f86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/views/table/language-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/views/table/language-table-collection-view.element.ts @@ -1,6 +1,6 @@ import type { UmbLanguageDetailModel } from '../../../types.js'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -58,7 +58,7 @@ export class UmbLanguageTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/action/create-media-collection-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/action/create-media-collection-action.element.ts index 5ba5107c1d..03536dcebb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/action/create-media-collection-action.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/action/create-media-collection-action.element.ts @@ -1,7 +1,7 @@ import { html, customElement, property, state, map } from '@umbraco-cms/backoffice/external/lit'; import { UmbMediaTypeStructureRepository } from '@umbraco-cms/backoffice/media-type'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UMB_MEDIA_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/media'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import type { ManifestCollectionAction } from '@umbraco-cms/backoffice/extension-registry'; @@ -53,7 +53,7 @@ export class UmbCreateMediaCollectionActionElement extends UmbLitElement { }); }); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.observe(collectionContext.filter, (filter) => { this._useInfiniteEditor = filter.useInfiniteEditor == true; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection-toolbar.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection-toolbar.element.ts index 6e791e0c55..a94a8e7ac0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection-toolbar.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection-toolbar.element.ts @@ -1,7 +1,7 @@ import type { UmbMediaCollectionContext } from './media-collection.context.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; @customElement('umb-media-collection-toolbar') export class UmbMediaCollectionToolbarElement extends UmbLitElement { @@ -13,7 +13,7 @@ export class UmbMediaCollectionToolbarElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance as UmbMediaCollectionContext; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection.element.ts index dd74cf2241..a636d72ac1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/media-collection.element.ts @@ -1,6 +1,6 @@ import type { UmbMediaCollectionContext } from './media-collection.context.js'; import { customElement, html, state, when } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbCollectionDefaultElement } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT, UmbCollectionDefaultElement } from '@umbraco-cms/backoffice/collection'; import type { UmbProgressEvent } from '@umbraco-cms/backoffice/event'; import './media-collection-toolbar.element.js'; @@ -14,7 +14,7 @@ export class UmbMediaCollectionElement extends UmbCollectionDefaultElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#mediaCollection = instance as UmbMediaCollectionContext; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/grid/media-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/grid/media-grid-collection-view.element.ts index 9174a1f707..6a77f11469 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/grid/media-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/grid/media-grid-collection-view.element.ts @@ -2,7 +2,7 @@ import type { UmbMediaCollectionFilterModel, UmbMediaCollectionItemModel } from import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; @customElement('umb-media-grid-collection-view') @@ -20,7 +20,7 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; this.#observeCollectionContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts index 044508a91e..a3a4cef9a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts @@ -3,7 +3,7 @@ import type { UmbMediaCollectionFilterModel, UmbMediaCollectionItemModel } from import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, @@ -58,7 +58,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (collectionContext) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (collectionContext) => { this.#collectionContext = collectionContext; this.#observeCollectionContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/views/table/member-group-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/views/table/member-group-table-collection-view.element.ts index 2065ad1bdb..5b37dbb1f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/views/table/member-group-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/views/table/member-group-table-collection-view.element.ts @@ -1,6 +1,6 @@ import type { UmbMemberGroupCollectionModel } from '../../types.js'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -29,7 +29,7 @@ export class UmbMemberGroupTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/member-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/member-collection-header.element.ts index 073675600f..071681fa9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/member-collection-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/member-collection-header.element.ts @@ -3,7 +3,7 @@ import type { UmbMemberTypeItemModel } from '../../member-type/repository/item/t import type { UmbMemberCollectionContext } from './member-collection.context.js'; import { css, customElement, html, ifDefined, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; @customElement('umb-member-collection-header') export class UmbMemberCollectionHeaderElement extends UmbLitElement { @@ -23,7 +23,7 @@ export class UmbMemberCollectionHeaderElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance as UmbMemberCollectionContext; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/views/table/member-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/views/table/member-table-collection-view.element.ts index 3abaafa076..f59782c4fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/views/table/member-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/views/table/member-table-collection-view.element.ts @@ -1,7 +1,7 @@ import type { UmbMemberCollectionModel } from '../../types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -29,7 +29,7 @@ export class UmbMemberTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/views/table/relation-type-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/views/table/relation-type-table-collection-view.element.ts index da7f76d599..30b5652341 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/views/table/relation-type-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/views/table/relation-type-table-collection-view.element.ts @@ -1,6 +1,6 @@ import type { UmbRelationTypeDetailModel } from '../../../types.js'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -29,7 +29,7 @@ export class UmbRelationTypeTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts index a1f71aff04..25dbeb6eb7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts @@ -3,7 +3,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, @@ -67,7 +67,7 @@ export class UmbUserGroupCollectionTableViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.observe( this.#collectionContext.selection.selection, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts index 4147e35f1d..c55d9b6352 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts @@ -5,7 +5,7 @@ import { UmbUserStateFilter } from './utils/index.js'; import type { UUIBooleanInputEvent, UUICheckboxElement } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbUserGroupDetailModel } from '@umbraco-cms/backoffice/user-group'; import { UmbUserGroupCollectionRepository } from '@umbraco-cms/backoffice/user-group'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; @@ -39,7 +39,7 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance as UmbUserCollectionContext; this.#observeOrderByOptions(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts index 9dc4c11ec5..6e51254508 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts @@ -3,7 +3,7 @@ import type { UmbUserCollectionContext } from '../../user-collection.context.js' import type { UmbUserDetailModel } from '../../../types.js'; import { css, html, nothing, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UserStateModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbUserGroupDetailModel } from '@umbraco-cms/backoffice/user-group'; @@ -29,7 +29,7 @@ export class UmbUserGridCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance as UmbUserCollectionContext; this.observe( this.#collectionContext.selection.selection, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts index 1a9e9959aa..8b93ced715 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts @@ -11,7 +11,7 @@ import type { UmbTableConfig, UmbTableOrderedEvent, } from '@umbraco-cms/backoffice/components'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbUserGroupItemModel } from '@umbraco-cms/backoffice/user-group'; import { UmbUserGroupItemRepository } from '@umbraco-cms/backoffice/user-group'; @@ -67,7 +67,7 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance as UmbUserCollectionContext; this.observe( this.#collectionContext.selection.selection, diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts index c70a6e2e80..0a80718dbc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/views/table/webhook-table-collection-view.element.ts @@ -1,6 +1,6 @@ import type { UmbWebhookDetailModel } from '../../../types.js'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -51,7 +51,7 @@ export class UmbWebhookTableCollectionViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DEFAULT_COLLECTION_CONTEXT, (instance) => { + this.consumeContext(UMB_COLLECTION_CONTEXT, (instance) => { this.#collectionContext = instance; this.#observeCollectionItems(); }); From 9662cc5b5031339bc4fe62b2fc9aff89658ef763 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 30 Apr 2024 17:53:19 +0100 Subject: [PATCH 221/323] Document Grid: fixes refresh on modal cancel/submit --- .../document-grid-collection-view.element.ts | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts index d4d23e2d5e..fb55c39022 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/views/grid/document-grid-collection-view.element.ts @@ -6,9 +6,9 @@ import { fromCamelCase } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; import type { UUIInterfaceColor } from '@umbraco-cms/backoffice/external/uui'; -import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; @customElement('umb-document-grid-collection-view') export class UmbDocumentGridCollectionViewElement extends UmbLitElement { @@ -24,9 +24,6 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { @state() private _selection: Array = []; - @state() - private _skip: number = 0; - @state() private _userDefinedProperties?: Array; @@ -45,6 +42,12 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { .onSetup(() => { return { data: { entityType: 'document', preset: {} } }; }) + .onReject(() => { + this.#collectionContext?.requestCollection(); + }) + .onSubmit(() => { + this.#collectionContext?.requestCollection(); + }) .observeRouteBuilder((routeBuilder) => { this._editDocumentPath = routeBuilder({}); }); @@ -70,14 +73,6 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { (selection) => (this._selection = selection), '_observeSelection', ); - - this.observe( - this.#collectionContext.pagination.skip, - (skip) => { - this._skip = skip; - }, - '_observePaginationSkip', - ); } #onOpen(event: Event, id: string) { @@ -136,7 +131,7 @@ export class UmbDocumentGridCollectionViewElement extends UmbLitElement { selectable ?select-only=${this._selection.length > 0} ?selected=${this.#isSelected(item)} - @open=${(event: Event) => this.#onOpen(event, item.unique ?? '')} + @open=${(event: Event) => this.#onOpen(event, item.unique)} @selected=${() => this.#onSelect(item)} @deselected=${() => this.#onDeselect(item)}> From 561bbdb0249cdd53fa9871f981ae098dc2dc6719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 20:08:13 +0200 Subject: [PATCH 222/323] clean up --- .../section-sidebar-context-menu.element.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts index 7e4c545168..c1cdbe7762 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts @@ -107,11 +107,6 @@ export class UmbSectionSidebarContextMenuElement extends UmbLitElement { : nothing; } - disconnectedCallback(): void { - super.disconnectedCallback(); - this.removeEventListener(UMB_CONTENT_REQUEST_EVENT_TYPE, this.#proxyContextRequests as EventListener); - } - static styles = [ UmbTextStyles, css` From 0a85f3a8bff28f2e92c56d814ee500a199ce452f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 21:34:28 +0200 Subject: [PATCH 223/323] generate new server models --- .../src/external/backend-api/src/models.ts | 57 ++++++++++++- .../src/external/backend-api/src/services.ts | 80 ++++++++++++++++++- 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index 1ea8d622d6..9ef7b35807 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -1379,6 +1379,14 @@ id: string compositions: Array }; +export type MemberTypeTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string +icon: string + }; + export type MemberValueModel = { culture?: string | null segment?: string | null @@ -1460,6 +1468,10 @@ category: string type: EventMessageTypeModel }; +export type OEmbedResponseModel = { + markup: string + }; + export type ObjectTypeResponseModel = { name?: string | null id: string @@ -1659,6 +1671,11 @@ export type PagedMemberResponseModel = { items: Array }; +export type PagedMemberTypeTreeItemResponseModel = { + total: number +items: Array + }; + export type PagedModelDataTypeItemResponseModel = { items: Array total: number @@ -2571,6 +2588,7 @@ readonly subscribeToNewsletter: boolean export type UserItemResponseModel = { id: string name: string +avatarUrls: Array }; export enum UserOrderModel { @@ -3647,6 +3665,12 @@ export type MediaTypeData = { GetItemMediaType: { id?: Array + }; +GetItemMediaTypeAllowed: { + fileExtension?: string +skip?: number +take?: number + }; GetItemMediaTypeSearch: { query?: string @@ -3739,6 +3763,7 @@ take?: number responses: { GetItemMediaType: Array + ,GetItemMediaTypeAllowed: PagedModelMediaTypeItemResponseModel ,GetItemMediaTypeSearch: PagedModelMediaTypeItemResponseModel ,PostMediaType: string ,GetMediaTypeById: MediaTypeResponseModel @@ -4041,7 +4066,7 @@ take?: number ,GetMemberTypeByIdCompositionReferences: Array ,PostMemberTypeByIdCopy: string ,PostMemberTypeAvailableCompositions: Array - ,GetTreeMemberTypeRoot: PagedNamedEntityTreeItemResponseModel + ,GetTreeMemberTypeRoot: PagedMemberTypeTreeItemResponseModel } @@ -4147,6 +4172,25 @@ take?: number } +export type OembedData = { + + payloads: { + GetOembedQuery: { + maxHeight?: number +maxWidth?: number +url?: string + + }; + } + + + responses: { + GetOembedQuery: OEmbedResponseModel + + } + + } + export type PackageData = { payloads: { @@ -4904,7 +4948,13 @@ GetUserDataById: { export type UserGroupData = { payloads: { - GetItemUserGroup: { + GetFilterUserGroup: { + filter?: string +skip?: number +take?: number + + }; +GetItemUserGroup: { id?: Array }; @@ -4948,7 +4998,8 @@ requestBody?: Array responses: { - GetItemUserGroup: Array + GetFilterUserGroup: PagedUserGroupResponseModel + ,GetItemUserGroup: Array ,DeleteUserGroup: string ,PostUserGroup: string ,GetUserGroup: PagedUserGroupResponseModel diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts index e50c387513..476f2ab3c6 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -1,7 +1,7 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; +import type { CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, OembedData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; export class CultureService { @@ -3508,6 +3508,30 @@ export class MediaTypeService { }); } + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMediaTypeAllowed(data: MediaTypeData['payloads']['GetItemMediaTypeAllowed'] = {}): CancelablePromise { + const { + + fileExtension, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media-type/allowed', + query: { + fileExtension, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + /** * @returns unknown Success * @throws ApiError @@ -5364,6 +5388,34 @@ take } +export class OEmbedService { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getOembedQuery(data: OembedData['payloads']['GetOembedQuery'] = {}): CancelablePromise { + const { + + url, +maxWidth, +maxHeight + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/oembed/query', + query: { + url, maxWidth, maxHeight + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + +} + export class PackageService { /** @@ -7820,6 +7872,32 @@ take export class UserGroupService { + /** + * @returns unknown Success + * @throws ApiError + */ + public static getFilterUserGroup(data: UserGroupData['payloads']['GetFilterUserGroup'] = {}): CancelablePromise { + const { + + skip, +take, +filter + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/filter/user-group', + query: { + skip, take, filter + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns unknown Success * @throws ApiError From 8b2a3a333bffa047538c96d5d31884fe50b4b5eb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 21:39:14 +0200 Subject: [PATCH 224/323] update user item type --- .../src/packages/user/user/repository/item/types.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts index d2811e5d91..9c89d8e36e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts @@ -1,4 +1,8 @@ +import type { UmbUserEntityType } from '../../entity.js'; + export interface UmbUserItemModel { - unique: string; + avatarUrls: Array; + entityType: UmbUserEntityType; name: string; + unique: string; } From 18472b016e487112e16d34ea9f74a335fe6c68b2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 21:39:20 +0200 Subject: [PATCH 225/323] map data --- .../user/repository/item/user-item.server.data-source.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts index 129efe6181..d5045edfb2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts @@ -1,3 +1,4 @@ +import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; import type { UmbUserItemModel } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UserItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,7 +30,9 @@ const getItems = (uniques: Array) => UserService.getItemUser({ id: uniqu const mapper = (item: UserItemResponseModel): UmbUserItemModel => { return { - unique: item.id, + avatarUrls: item.avatarUrls, + entityType: UMB_USER_ENTITY_TYPE, name: item.name, + unique: item.id, }; }; From 8c10090e7bfa993b9f4e1a7be9398aacccf36e80 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 21:42:57 +0200 Subject: [PATCH 226/323] render avatar --- .../info/media-workspace-view-info-history.element.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts index 528c1aff52..79ea1b62b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-history.element.ts @@ -2,7 +2,7 @@ import type { UmbMediaAuditLogModel } from '../../../audit-log/types.js'; import { UmbMediaAuditLogRepository } from '../../../audit-log/index.js'; import { UMB_MEDIA_WORKSPACE_CONTEXT } from '../../media-workspace.context-token.js'; import { TimeOptions, getMediaHistoryTagStyleAndText } from './utils.js'; -import { css, html, customElement, state, nothing, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, nothing, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; @@ -102,13 +102,14 @@ export class UmbMediaWorkspaceViewInfoHistoryElement extends UmbLitElement { (item) => { const { text, style } = getMediaHistoryTagStyleAndText(item.logType); const user = this.#userMap.get(item.user.unique); - //const avatar = Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; - // TODO: we need to get the absolute url for the avatars from the server - //const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; + const userName = user?.name ?? 'Unknown'; + const avatarUrl = Array.isArray(user?.avatarUrls) ? user.avatarUrls[1] : undefined; return html` + + ${this.localize.term(text.label)} ${this.localize.term(text.desc, item.parameters)} From d393ae527ba4f218fb9d36642344d2e0d3a572b5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Apr 2024 21:43:04 +0200 Subject: [PATCH 227/323] render avatar --- .../document-workspace-view-info-history.element.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 3ac888ec79..37476a4a91 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -3,7 +3,7 @@ import type { UmbDocumentAuditLogModel } from '../../../audit-log/types.js'; import { UmbDocumentAuditLogRepository } from '../../../audit-log/index.js'; import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context-token.js'; import { TimeOptions, getDocumentHistoryTagStyleAndText } from './utils.js'; -import { css, html, customElement, state, nothing, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, nothing, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @@ -122,13 +122,12 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { (item) => { const { text, style } = getDocumentHistoryTagStyleAndText(item.logType); const user = this.#userMap.get(item.user.unique); - //const avatar = Array.isArray(user.avatarUrls) ? user.avatarUrls[1] : undefined; - // TODO: we need to get the absolute url for the avatars from the server - //const avatarUrl = avatar ? `${this._serverUrl}${avatar}` : undefined; + const userName = user?.name ?? 'Unknown'; + const avatarUrl = Array.isArray(user?.avatarUrls) ? user.avatarUrls[1] : undefined; + + return html` + - return html` ${this.localize.term(text.label)} ${this.localize.term(text.desc, item.parameters)} From c71c6c1a5bb50833037446b18badf5da2c7abdf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 22:24:03 +0200 Subject: [PATCH 228/323] delete group + inheritance display + links --- ...t-type-container-structure-helper.class.ts | 5 ++ .../content-type-structure-manager.class.ts | 6 ++ ...ontent-type-design-editor-group.element.ts | 86 +++++++++++++++---- ...t-type-design-editor-properties.element.ts | 20 +---- ...ent-type-design-editor-property.element.ts | 2 +- .../content-type-design-editor-tab.element.ts | 38 +++++--- .../content-type-design-editor.element.ts | 18 ++-- 7 files changed, 118 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts index c3afe98927..2688c49331 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-container-structure-helper.class.ts @@ -240,6 +240,11 @@ export class UmbContentTypeContainerStructureHelper x.id === containerId); } + getContentTypeOfContainer(containerId?: string) { + if (!this.#structure || !containerId) return; + return this.#structure.getContentTypeOfContainer(containerId); + } + containersByNameAndType(name: string, type: UmbPropertyContainerTypes) { return this.#childContainers.asObservablePart((cons) => cons.filter((x) => x.name === name && x.type === type)); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts index 26d96f45a8..e0a0601348 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/structure/content-type-structure-manager.class.ts @@ -704,6 +704,12 @@ export class UmbContentTypeStructureManager< }); } + getContentTypeOfContainer(containerId: string) { + return this.#contentTypes + .getValue() + .find((contentType) => contentType.containers.some((c) => c.id === containerId)); + } + contentTypeOfProperty(propertyId: UmbPropertyTypeId) { return this.#contentTypes.asObservablePart((contentTypes) => contentTypes.find((contentType) => contentType.properties.some((p) => p.id === propertyId)), diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 540d32257f..db90c71576 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -1,6 +1,6 @@ import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; -import { css, html, customElement, property, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, nothing, repeat } from '@umbraco-cms/backoffice/external/lit'; import type { UmbContentTypeContainerStructureHelper, UmbContentTypeModel, @@ -8,6 +8,7 @@ import type { } from '@umbraco-cms/backoffice/content-type'; import './content-type-design-editor-properties.element.js'; +import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; @customElement('umb-content-type-design-editor-group') export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { @@ -37,6 +38,9 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { @property({ type: Boolean, attribute: 'sort-mode-active', reflect: true }) sortModeActive = false; + @property({ attribute: false }) + editContentTypePath?: string; + @state() _groupId?: string; @@ -46,6 +50,9 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { @state() _inherited?: boolean; + @state() + _inheritedFrom?: Array; + #checkInherited() { if (this.groupStructureHelper && this.group) { // Check is this container matches with any other group. If so it is inherited aka. merged with others. [NL] @@ -54,18 +61,22 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { this.observe( this.groupStructureHelper.containersByNameAndType(this.group.name, 'Group'), (containers) => { - const hasAOwnerContainer = containers.some((con) => - this.groupStructureHelper!.isOwnerChildContainer(con.id), - ); + const ownerContainer = containers.find((con) => this.groupStructureHelper!.isOwnerChildContainer(con.id)); + const hasAOwnerContainer = !!ownerContainer; const pureOwnerContainer = hasAOwnerContainer && containers.length === 1; - // TODO: Check if requstUpdate is needed here, I do not think it is when i added it, but I just wanted to be safe when debugging [NL] + // TODO: Check if requestUpdate is needed here, I do not think it is when i added it, but I just wanted to be safe when debugging [NL] const oldHasOwnerContainer = this._hasOwnerContainer; const oldInherited = this._inherited; + const oldInheritedFrom = this._inheritedFrom; this._hasOwnerContainer = hasAOwnerContainer; this._inherited = !pureOwnerContainer; + this._inheritedFrom = containers + .filter((con) => con.id !== this.group!.id) + .map((con) => this.groupStructureHelper!.getContentTypeOfContainer(con.id)); this.requestUpdate('_hasOwnerContainer', oldHasOwnerContainer); this.requestUpdate('_inherited', oldInherited); + this.requestUpdate('_inheritedFrom', oldInheritedFrom); }, 'observeGroupContainers', ); @@ -112,6 +123,27 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { } } + async #requestRemove(e: Event) { + e.preventDefault(); + e.stopImmediatePropagation(); + if (!this.groupStructureHelper || !this._group) return; + + // TODO: Do proper localization here: [NL] + await umbConfirmModal(this, { + headline: `${this.localize.term('actions_delete')} property`, + content: html` + Are you sure you want to delete the group ${this._group.name ?? this._group.id} + +
`, + confirmLabel: this.localize.term('actions_delete'), + color: 'danger', + }); + + this.groupStructureHelper.removeContainer(this._group.id); + } + render() { return this._inherited !== undefined && this._groupId ? html` @@ -124,10 +156,9 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { : ''; } + // TODO: impl UMB_EDIT_DOCUMENT_TYPE_PATH_PATTERN #renderContainerHeader() { return html`
- - ${this.sortModeActive - ? html` - this._singleValueUpdate('sortOrder', parseInt(e.target.value as string) || 0)} - .value=${this.group!.sortOrder ?? 0} - ?disabled=${!this._hasOwnerContainer}>` - : ''} -
`; +
+ ${this._inherited + ? null + : html` + + `} + ${this.sortModeActive + ? html` + this._singleValueUpdate('sortOrder', parseInt(e.target.value as string) || 0)} + .value=${this.group!.sortOrder ?? 0} + ?disabled=${!this._hasOwnerContainer}>` + : ''} +
`; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts index 06e96bfb28..4f433510d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-properties.element.ts @@ -104,6 +104,9 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); + @property({ attribute: false }) + editContentTypePath?: string; + @state() private _propertyStructure: Array = []; @@ -113,9 +116,6 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { @state() private _modalRouteBuilderNewProperty?: UmbModalRouteBuilder; - @state() - private _editContentTypePath?: string; - @state() private _sortModeActive?: boolean; @@ -142,18 +142,6 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { this.consumeContext(UMB_CONTENT_TYPE_WORKSPACE_CONTEXT, async (workspaceContext) => { this.#propertyStructureHelper.setStructureManager(workspaceContext.structure); - const entityType = workspaceContext.getEntityType(); - - this.#workspaceModal?.destroy(); - this.#workspaceModal = new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) - .addAdditionalPath(entityType) - .onSetup(async () => { - return { data: { entityType: entityType, preset: {} } }; - }) - .observeRouteBuilder((routeBuilder) => { - this._editContentTypePath = routeBuilder({}); - }); - this.observe( workspaceContext.structure.ownerContentType, (contentType) => { @@ -208,7 +196,7 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts index 4a2a857964..df53221a18 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts @@ -258,6 +258,7 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement {
${this.renderPropertyTags()} @@ -415,7 +416,6 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement { #editor { position: relative; - background-color: var(--uui-color-background); } #alias-input, #label-input, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts index d11766797a..58d32eb3a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-tab.element.ts @@ -12,6 +12,7 @@ import { import './content-type-design-editor-properties.element.js'; import './content-type-design-editor-group.element.js'; import { type UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; const SORTER_CONFIG: UmbSorterConfig = { getUniqueOfElement: (element) => element.group?.id, @@ -71,16 +72,17 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { }, }); - private _containerId?: string | null; + #workspaceModal?: UmbModalRouteRegistrationController; + #containerId?: string | null; @property({ type: String }) public get containerId(): string | null | undefined { - return this._containerId; + return this.#containerId; } public set containerId(value: string | null | undefined) { - const oldValue = this._containerId; - if (value === this._containerId) return; - this._containerId = value; + const oldValue = this.#containerId; + if (value === this.#containerId) return; + this.#containerId = value; this.#groupStructureHelper.setContainerId(value); this.requestUpdate('containerId', oldValue); } @@ -94,6 +96,9 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { @state() _sortModeActive?: boolean; + @state() + _editContentTypePath?: string; + #groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); constructor() { @@ -101,6 +106,18 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { this.consumeContext(UMB_CONTENT_TYPE_WORKSPACE_CONTEXT, (context) => { this.#groupStructureHelper.setStructureManager(context.structure); + + const entityType = context.getEntityType(); + + this.#workspaceModal?.destroy(); + this.#workspaceModal = new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath(entityType) + .onSetup(async () => { + return { data: { entityType: entityType, preset: {} } }; + }) + .observeRouteBuilder((routeBuilder) => { + this._editContentTypePath = routeBuilder({}); + }); }); this.consumeContext(UMB_CONTENT_TYPE_DESIGN_EDITOR_CONTEXT, (context) => { this.observe( @@ -138,19 +155,11 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { // Idea, maybe we can gather the sortOrder from the last group rendered and add 1 to it? const len = this._groups.length; const sortOrder = len === 0 ? 0 : this._groups[len - 1].sortOrder + 1; - this.#groupStructureHelper.addContainer(this._containerId, sortOrder); + this.#groupStructureHelper.addContainer(this.#containerId, sortOrder); }; render() { return html` - ${ - this._sortModeActive - ? html`` - : '' - } ${ this._hasProperties ? html` @@ -169,6 +178,7 @@ export class UmbContentTypeDesignEditorTabElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts index 0431c3e3c3..720c6c6b34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts @@ -276,7 +276,6 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements if (tab) { const path = this._routerPath + '/tab/' + encodeFolderName(tab.name && tab.name !== '' ? tab.name : '-'); window.history.replaceState(null, '', path); - console.log('new tab', path); this.#focusInput(); } } @@ -525,14 +524,6 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements static styles = [ UmbTextStyles, css` - #buttons-wrapper { - flex: 1; - display: flex; - align-items: center; - justify-content: space-between; - align-items: stretch; - } - :host { position: relative; display: flex; @@ -541,6 +532,14 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements --uui-tab-background: var(--uui-color-surface); } + #buttons-wrapper { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; + align-items: stretch; + } + [drag-placeholder] { opacity: 0.5; } @@ -553,6 +552,7 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements #header { width: 100%; + min-height: var(--uui-size-15); display: flex; align-items: center; justify-content: space-between; From e4923c8db0c84b09ae130c1e9918cd9a3d0e7e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 22:39:39 +0200 Subject: [PATCH 229/323] polish group inheritance --- .../design/content-type-design-editor-group.element.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index db90c71576..8cfb8aa1f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -9,6 +9,7 @@ import type { import './content-type-design-editor-properties.element.js'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-content-type-design-editor-group') export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { @@ -72,8 +73,9 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { this._hasOwnerContainer = hasAOwnerContainer; this._inherited = !pureOwnerContainer; this._inheritedFrom = containers - .filter((con) => con.id !== this.group!.id) - .map((con) => this.groupStructureHelper!.getContentTypeOfContainer(con.id)); + .filter((con) => con.id !== ownerContainer?.id) + .map((con) => this.groupStructureHelper!.getContentTypeOfContainer(con.id)) + .filter((contentType) => contentType !== undefined) as Array; this.requestUpdate('_hasOwnerContainer', oldHasOwnerContainer); this.requestUpdate('_inherited', oldInherited); this.requestUpdate('_inheritedFrom', oldInheritedFrom); @@ -202,6 +204,7 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { } static styles = [ + UmbTextStyles, css` :host([drag-placeholder]) { opacity: 0.5; From 8ad2aced4e960badc71e3fce68a26c8d54410d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2024 22:56:15 +0200 Subject: [PATCH 230/323] only show inheritance if pure composition ownership --- .../views/design/content-type-design-editor-group.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 8cfb8aa1f2..9695f79952 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -169,7 +169,7 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { @change=${this.#renameGroup} @blur=${this.#blurGroup} ${this._group!.name === '' ? umbFocus() : nothing}> - ${this._inherited && this._inheritedFrom + ${this._hasOwnerContainer === false && this._inheritedFrom ? html` Date: Tue, 30 Apr 2024 23:34:45 +0200 Subject: [PATCH 231/323] polishing --- ...ontent-type-design-editor-group.element.ts | 37 ++++++++++------- ...ent-type-design-editor-property.element.ts | 40 +++++++++++-------- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts index 9695f79952..7a4271bf66 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-group.element.ts @@ -161,14 +161,19 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { // TODO: impl UMB_EDIT_DOCUMENT_TYPE_PATH_PATTERN #renderContainerHeader() { return html`
- +
+ ${this.sortModeActive && this._hasOwnerContainer ? html`` : null} + +
+
+
${this._hasOwnerContainer === false && this._inheritedFrom ? html` @@ -184,13 +189,11 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { ` : null} -
-
- ${this._inherited - ? null - : html` + ${!this._inherited && !this.sortModeActive + ? html` - `} + ` + : nothing} ${this.sortModeActive ? html` ` - : ''} + : nothing}
`; } @@ -231,6 +234,10 @@ export class UmbContentTypeWorkspaceViewEditGroupElement extends UmbLitElement { max-width: 75px; } + .inherited uui-icon { + vertical-align: sub; + } + :host([sort-mode-active]) div[slot='header'] { cursor: grab; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts index df53221a18..be72037e82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor-property.element.ts @@ -65,10 +65,10 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement { @property({ type: Boolean, reflect: true, attribute: 'sort-mode-active' }) public sortModeActive = false; - @property({ type: String, attribute: 'edit-content-type-path' }) + @property({ attribute: false }) public editContentTypePath?: string; - @state() + @property({ type: Boolean, reflect: true, attribute: '_inherited' }) public _inherited?: boolean; @state() @@ -213,15 +213,17 @@ export class UmbContentTypeDesignEditorPropertyElement extends UmbLitElement {
`; From f45531a102e983008cf0862d527a694d6b9adac8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:13:15 +0200 Subject: [PATCH 287/323] provide context from media workspace --- .../media/media/workspace/media-workspace.context.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index e3db616da6..1b4201e3f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -25,6 +25,8 @@ import { UmbRequestReloadTreeItemChildrenEvent } from '@umbraco-cms/backoffice/t import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; import type { UmbMediaTypeDetailModel } from '@umbraco-cms/backoffice/media-type'; import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; +import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; +import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; type EntityType = UmbMediaDetailModel; export class UmbMediaWorkspaceContext @@ -107,6 +109,11 @@ export class UmbMediaWorkspaceContext }, ); + // TODO: this should be set up for all entity workspace contexts in a base class + #entityContext = new UmbEntityContext(this); + // TODO: this might not be the correct place to spin this up + #isTrashedContext = new UmbEntityIsTrashedContext(this); + constructor(host: UmbControllerHost) { super(host, 'Umb.Workspace.Media'); @@ -162,6 +169,9 @@ export class UmbMediaWorkspaceContext const { data, asObservable } = (await this.#getDataPromise) as GetDataType; if (data) { + this.#entityContext.setEntityType(UMB_MEDIA_ENTITY_TYPE); + this.#entityContext.setUnique(unique); + this.#isTrashedContext.setIsTrashed(data.isTrashed); this.setIsNew(false); this.#persistedData.update(data); this.#currentData.update(data); @@ -184,6 +194,8 @@ export class UmbMediaWorkspaceContext const { data } = await this.#getDataPromise; if (!data) return undefined; + this.#entityContext.setEntityType(UMB_MEDIA_ENTITY_TYPE); + this.#entityContext.setUnique(data.unique); this.setIsNew(true); this.#persistedData.setValue(data); this.#currentData.setValue(data); From 6b6469297fdadec354e5c031e137bb857238de88 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:13:26 +0200 Subject: [PATCH 288/323] provide context from media tree item --- .../media/media/tree/tree-item/media-tree-item.context.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts index 8b63e2563f..5df9fa848a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts @@ -1,10 +1,17 @@ import type { UmbMediaTreeItemModel } from '../types.js'; import { UmbDefaultTreeItemContext } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; export class UmbMediaTreeItemContext extends UmbDefaultTreeItemContext { + #isTrashedContext = new UmbEntityIsTrashedContext(this); + constructor(host: UmbControllerHost) { super(host); + + this.observe(this.treeItem, (item) => { + this.#isTrashedContext.setIsTrashed(item?.isTrashed || false); + }); } } From 96db4a3ba3a5790aa3979ac677d374bc8a8ff105 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:16:52 +0200 Subject: [PATCH 289/323] remove debugger --- .../workspace/conditions/document-is-not-trashed.condition.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/conditions/document-is-not-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/conditions/document-is-not-trashed.condition.ts index 18dd26028f..b7fd771f44 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/conditions/document-is-not-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/conditions/document-is-not-trashed.condition.ts @@ -17,7 +17,6 @@ export class UmbDocumentIsNotTrashedWorkspaceCondition this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === false; - debugger; }); }); } From 89bde4421e9042ae00225a0253cf157e2540c95f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:19:28 +0200 Subject: [PATCH 290/323] apply condition to recycle bin entity actions --- .../media/recycle-bin/entity-action/manifests.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 f587d2449d..f96ef05bb1 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 @@ -4,6 +4,10 @@ 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 '../../tree/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { + UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, +} from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { @@ -16,6 +20,11 @@ export const manifests: Array = [ itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, }, + conditions: [ + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], }, { type: 'entityAction', @@ -28,6 +37,11 @@ export const manifests: Array = [ recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, pickerModal: UMB_MEDIA_TREE_PICKER_MODAL, }, + conditions: [ + { + alias: UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, + }, + ], }, { type: 'entityAction', From 41ff89cb60a620ba7ae43ff889cb10fe9a7597b4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 10:21:03 +0200 Subject: [PATCH 291/323] only delete items when they are trashed --- .../src/packages/media/media/entity-actions/manifests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 c74e9dc44e..8a0b6d6c60 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 @@ -3,7 +3,7 @@ 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'; -import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; const entityActions: Array = [ ...createManifests, @@ -19,7 +19,7 @@ const entityActions: Array = [ }, conditions: [ { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + alias: UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, }, ], }, From 8058f011ed8b54dca2ce11f567bd0f13435da115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:41:39 +0200 Subject: [PATCH 292/323] auto generate alias --- .../components/input-with-alias/input-with-alias.element.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts index 8db01ae06d..24f5c0cab7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts @@ -13,6 +13,9 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit @property({ type: String, reflect: false }) alias?: string; + @property({ type: Boolean, attribute: 'auto-generate-alias' }) + autoGenerateAlias?: boolean; + @state() private _aliasLocked = true; @@ -32,7 +35,7 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit const oldName = this.value; const oldAlias = this.alias ?? ''; this.value = event.target.value.toString(); - if (this._aliasLocked) { + if (this.autoGenerateAlias && this._aliasLocked) { // If locked we will update the alias, but only if it matches the generated alias of the old name [NL] const expectedOldAlias = generateAlias(oldName ?? ''); // Only update the alias if the alias matches a generated alias of the old name (otherwise the alias is considered one written by the user.) [NL] From 89a71a5ba0ade8cdc55e7282711276c96671cd3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:42:00 +0200 Subject: [PATCH 293/323] refactor isNew content-type implementations --- .../document-type-workspace-editor.element.ts | 5 +++++ .../document-type-workspace.context.ts | 22 +++++++++---------- .../media-type-workspace-editor.element.ts | 5 +++++ .../workspace/media-type-workspace.context.ts | 18 +++++++-------- .../member-type-workspace-editor.element.ts | 17 +++++--------- .../member-type-workspace.context.ts | 21 +++++++++--------- 6 files changed, 44 insertions(+), 44 deletions(-) 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 ad180d854a..fdb08154b1 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 @@ -15,6 +15,9 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @state() private _icon?: string; + @state() + private _isNew?: string; + #workspaceContext?: typeof UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { @@ -31,6 +34,7 @@ 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) => (this._isNew = isNew), '_observeIsNew'); } private async _handleIconClick() { @@ -70,6 +74,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { label="name" value=${this._name} alias=${this._alias} + ?auto-generate-alias=${this._isNew} @change="${this.#onNameAndAliasChange}" ${umbFocus()}>
diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index a52c8fc1b2..af9b15e7c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -287,18 +287,18 @@ export class UmbDocumentTypeWorkspaceContext this.setDefaultTemplate(templateEntity); } - if ((await this.structure.create(parent.unique)) === true) { - // TODO: this might not be the right place to alert the tree, but it works for now - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadTreeItemChildrenEvent({ - entityType: parent.entityType, - unique: parent.unique, - }); - eventContext.dispatchEvent(event); + await this.structure.create(parent.unique); - this.setIsNew(false); - this.createTemplateMode = false; - } + // TODO: this might not be the right place to alert the tree, but it works for now + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadTreeItemChildrenEvent({ + entityType: parent.entityType, + unique: parent.unique, + }); + eventContext.dispatchEvent(event); + + this.setIsNew(false); + this.createTemplateMode = false; } else { await this.structure.save(); 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 5e9305199c..b9a8c1cc54 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 @@ -18,6 +18,9 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { @state() private _icon?: string; + @state() + private _isNew?: string; + #workspaceContext?: UmbMediaTypeWorkspaceContext; constructor() { @@ -34,6 +37,7 @@ 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) => (this._isNew = isNew), '_observeIsNew'); } private async _handleIconClick() { @@ -73,6 +77,7 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { label="name" value=${this._name} alias=${this._alias} + ?auto-generate-alias=${this._isNew} @change="${this.#onNameAndAliasChange}" ${umbFocus()}>
diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts index 5ee915d1ce..e17f605597 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts @@ -173,31 +173,30 @@ export class UmbMemberTypeWorkspaceContext } } + /** + * Save or creates the member type, based on wether its a new one or existing. + */ async submit() { const data = this.getData(); - if (data === undefined) throw new Error('Cannot save, no data'); + if (!data) { + throw new Error('Something went wrong, there is no data for media type you want to save...'); + } if (this.getIsNew()) { const parent = this.#parent.getValue(); if (!parent) throw new Error('Parent is not set'); - const { error } = await this.repository.create(data, parent.unique); - if (error) { - throw new Error(error.message); - } - this.setIsNew(false); - // TODO: this might not be the right place to alert the tree, but it works for now + await this.structure.create(parent.unique); + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadTreeItemChildrenEvent({ entityType: parent.entityType, unique: parent.unique, }); eventContext.dispatchEvent(event); + this.setIsNew(false); } else { - const { error } = await this.structure.save(); - if (error) { - throw new Error(error.message); - } + await this.structure.save(); const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadStructureForEntityEvent({ From c973e718e5540e588f37e605f37931d9ca2205a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 10:48:44 +0200 Subject: [PATCH 294/323] boolean prop --- .../workspace/document-type-workspace-editor.element.ts | 2 +- .../workspace/media-type-workspace-editor.element.ts | 2 +- .../workspace/member-type-workspace-editor.element.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 fdb08154b1..28bd6283bc 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 @@ -16,7 +16,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { private _icon?: string; @state() - private _isNew?: string; + private _isNew?: boolean; #workspaceContext?: typeof UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT.TYPE; 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 b9a8c1cc54..f2d91c4b49 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 @@ -19,7 +19,7 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { private _icon?: string; @state() - private _isNew?: string; + private _isNew?: boolean; #workspaceContext?: UmbMediaTypeWorkspaceContext; 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 bdf789c2a6..e3581adc00 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 @@ -15,7 +15,7 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { private _icon?: string; @state() - private _isNew?: string; + private _isNew?: boolean; @state() private _iconColorAlias?: string; From ddaebc8c8ab57a04e61cacf4650c55b8a79de227 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 11:09:50 +0200 Subject: [PATCH 295/323] send the timeout signal even earlier if UmbAuthFlow detects that the token has expired or it failed to use the refresh token --- .../src/packages/core/auth/auth-flow.ts | 17 ++++++++++++----- .../src/packages/core/auth/auth.context.ts | 7 ++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts index 89e4f0a1e0..42073f1f9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts @@ -93,6 +93,7 @@ export class UmbAuthFlow { readonly #postLogoutRedirectUri: string; readonly #clientId: string; readonly #scope: string; + readonly #timeoutSignal; // tokens #tokenResponse?: TokenResponse; @@ -101,17 +102,19 @@ export class UmbAuthFlow { * This signal will emit when the authorization flow is complete. * @remark It will also emit if there is an error during the authorization flow. */ - authorizationSignal = new Subject(); + readonly authorizationSignal = new Subject(); constructor( openIdConnectUrl: string, redirectUri: string, postLogoutRedirectUri: string, + timeoutSignal: Subject, clientId = 'umbraco-back-office', scope = 'offline_access', ) { this.#redirectUri = redirectUri; this.#postLogoutRedirectUri = postLogoutRedirectUri; + this.#timeoutSignal = timeoutSignal; this.#clientId = clientId; this.#scope = scope; @@ -310,7 +313,8 @@ export class UmbAuthFlow { // if the refresh token is not set (maybe the provider doesn't support them) if (!this.#tokenResponse?.refreshToken) { - return Promise.resolve('Missing refreshToken.'); + this.#timeoutSignal.next(); + return Promise.reject('Missing refreshToken.'); } const request = new TokenRequest({ @@ -324,9 +328,12 @@ export class UmbAuthFlow { await this.#performTokenRequest(request); - return this.#tokenResponse - ? Promise.resolve(this.#tokenResponse.accessToken) - : Promise.reject('Missing accessToken.'); + if (!this.#tokenResponse) { + this.#timeoutSignal.next(); + return Promise.reject('Missing tokenResponse.'); + } + + return Promise.resolve(this.#tokenResponse.accessToken); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index 3ce24cd508..f38c2d8853 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -51,7 +51,12 @@ export class UmbAuthContext extends UmbContextBase { this.#serverUrl = serverUrl; this.#backofficePath = backofficePath; - this.#authFlow = new UmbAuthFlow(serverUrl, this.getRedirectUrl(), this.getPostLogoutRedirectUrl()); + this.#authFlow = new UmbAuthFlow( + serverUrl, + this.getRedirectUrl(), + this.getPostLogoutRedirectUrl(), + this.#isTimeout, + ); // Observe the authorization signal and close the auth window this.observe( From b23e63094f7e226821167658e7af662dd4dd7525 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 11:19:08 +0200 Subject: [PATCH 296/323] add extra check to prevent vanilla 'validate' request to fail on ApiErrors --- .../context/server-model-validation.context.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/server-model-validation.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/server-model-validation.context.ts index 21f0d827fc..6feba69aa1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/server-model-validation.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/server-model-validation.context.ts @@ -60,9 +60,12 @@ export class UmbServerModelValidationContext if (!this.#isValid) { // We are missing some typing here, but we will just go wild with 'as any': [NL] const readErrorBody = (error as any).body; - Object.keys(readErrorBody.errors).forEach((path) => { - this.#serverFeedback.push({ path, messages: readErrorBody.errors[path] }); - }); + // Check if there are validation errors, since the error might be a generic ApiError + if (readErrorBody?.errors) { + Object.keys(readErrorBody.errors).forEach((path) => { + this.#serverFeedback.push({ path, messages: readErrorBody.errors[path] }); + }); + } } this.#validatePromiseResolve?.(); From 2d3d7beadff10ef2f913164d2ed5006f9af34f5b Mon Sep 17 00:00:00 2001 From: LFLaverty Date: Thu, 2 May 2024 10:38:19 +0100 Subject: [PATCH 297/323] Adds different content for `Community` and `Support` items in the Settings->Welcome dashboard https://github.com/umbraco/Umbraco-CMS/issues/16209 --- src/Umbraco.Web.UI.Client/.github/localization_overview.md | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts | 2 +- src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 4 +++- src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 3 ++- .../welcome-dashboard/settings-welcome-dashboard.element.ts | 4 ++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/.github/localization_overview.md b/src/Umbraco.Web.UI.Client/.github/localization_overview.md index 740cebe2c9..3277e268fa 100644 --- a/src/Umbraco.Web.UI.Client/.github/localization_overview.md +++ b/src/Umbraco.Web.UI.Client/.github/localization_overview.md @@ -201,6 +201,7 @@ Then we need your help! With Bellissima we added new localization keys, and we s - documentationHeader - documentationDescription - communityHeader +- communityDescription - trainingHeader - trainingDescription - supportHeader diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index a823ed5684..aded186cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -2464,10 +2464,10 @@ export default { }, settingsDashboard: { communityHeader: 'Community', + communityDescription: 'Stil et spørgsmål i community forummet eller i vores Discord community', trainingHeader: 'Træning', trainingDescription: 'Se mulighederne for real-life træning og certificering', supportHeader: 'Support', - supportDescription: 'Stil et spørgsmål i community forummet eller i vores Discord community', videosHeader: 'Videoer', videosDescription: 'Se vores gratis tutortial videoer på Umbraco Learning Base YouTube-kanel, for hurtigt at komme i gang med Umbraco.', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 4a2d45e517..30664cc52f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -2305,10 +2305,12 @@ export default { documentationHeader: 'Documentation', documentationDescription: 'Read more about working with the items in Settings in our Documentation.', communityHeader: 'Community', + communitytDescription: 'Ask a question in the community forum or our Discord community.', + trainingHeader: 'Training', trainingDescription: 'Find out about real-life training and certification opportunities', supportHeader: 'Support', - supportDescription: 'Ask a question in the community forum or our Discord community.', + supportDescription: 'Extend your team with a highly skilled and passionate bunch of Umbraco know-it-alls.', videosHeader: 'Videos', videosDescription: 'Watch our free tutorial videos on the Umbraco Learning Base YouTube channel, to get up to speed quickly with Umbraco.', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 8a6ec29075..4dfb93fdd5 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2379,10 +2379,11 @@ export default { documentationHeader: 'Documentation', documentationDescription: 'Read more about working with the items in Settings in our Documentation.', communityHeader: 'Community', + communityDescription: 'Ask a question in the community forum or our Discord community.', trainingHeader: 'Training', trainingDescription: 'Find out about real-life training and certification opportunities', supportHeader: 'Support', - supportDescription: 'Ask a question in the community forum or our Discord community.', + supportDescription: 'Extend your team with a highly skilled and passionate bunch of Umbraco know-it-alls', videosHeader: 'Videos', videosDescription: 'Watch our free tutorial videos on the Umbraco Learning Base YouTube channel, to get up to speed quickly with Umbraco.', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/settings-welcome-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/settings-welcome-dashboard.element.ts index b08ede7807..cfc95105db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/settings-welcome-dashboard.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/settings-welcome-dashboard.element.ts @@ -25,7 +25,7 @@ export class UmbSettingsWelcomeDashboardElement extends UmbLitElement {

Community

- + Ask a question in the community forum or our Discord community

@@ -64,7 +64,7 @@ export class UmbSettingsWelcomeDashboardElement extends UmbLitElement {

- Ask a question in the community forum or our Discord community. + Extend your team with a highly skilled and passionate bunch of Umbraco know-it-alls

Date: Thu, 2 May 2024 11:53:09 +0200 Subject: [PATCH 298/323] do not automatically call the `signOut` method since we now handle it with the timeoutSignal --- .../src/packages/core/auth/auth-flow.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts index 42073f1f9e..3d1091854d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts @@ -173,8 +173,6 @@ export class UmbAuthFlow { const response = new TokenResponse(JSON.parse(tokenResponseJson)); if (response.isValid()) { this.#tokenResponse = response; - } else { - this.signOut(); } } } @@ -376,9 +374,8 @@ export class UmbAuthFlow { try { this.#tokenResponse = await this.#tokenHandler.performTokenRequest(this.#configuration, request); } catch (error) { - // If the token request fails, it means the refresh token is invalid, so we sign the user out. + // If the token request fails, it means the refresh token is invalid console.error('Token request error', error); - this.signOut(); } } } From 7d7e2afc77d8ac55b779cef41b26df140dca339c Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 12:46:05 +0200 Subject: [PATCH 299/323] construct the redirect uris probably --- .../src/packages/core/auth/auth.context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index f38c2d8853..922a66ea83 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -258,10 +258,10 @@ export class UmbAuthContext extends UmbContextBase { } getRedirectUrl() { - return `${window.location.origin}${this.#backofficePath}oauth_complete`; + return `${window.location.origin}${this.#backofficePath}${this.#backofficePath.endsWith('/') ? '' : '/'}oauth_complete`; } getPostLogoutRedirectUrl() { - return `${window.location.origin}${this.#backofficePath.endsWith('/') ? this.#backofficePath : this.#backofficePath + '/'}logout`; + return `${window.location.origin}${this.#backofficePath}${this.#backofficePath.endsWith('/') ? '' : '/'}logout`; } } From 6a60005d6ca43177e691b3ac5f811bdc4b979321 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 12:46:06 +0200 Subject: [PATCH 300/323] add observable alias --- .../user/user-group/workspace/user-group-workspace.context.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index b39828ffe4..f2690e03ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -23,6 +23,7 @@ export class UmbUserGroupWorkspaceContext readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name || ''); + readonly alias = this.#data.asObservablePart((data) => data?.alias || ''); readonly icon = this.#data.asObservablePart((data) => data?.icon || null); readonly sections = this.#data.asObservablePart((data) => data?.sections || []); readonly languages = this.#data.asObservablePart((data) => data?.languages || []); From 361ea1ad8ae5d56e9f12416bbdd50b4cdc76e66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 12:46:58 +0200 Subject: [PATCH 301/323] change token to fit iwth entity context context alias --- .../contexts/is-trashed/entity-is-trashed.context-token.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts index be593a1038..fee62ff802 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts @@ -2,5 +2,6 @@ import type { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_ENTITY_IS_TRASHED_CONTEXT = new UmbContextToken( - 'UmbEntityIsTrashedContext', + 'UmbEntityContext', + 'isTrashed', ); From 8ed15767b888cad5ecf997108414cf552404085b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 12:47:37 +0200 Subject: [PATCH 302/323] render alias --- .../user-group-workspace-editor.element.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) 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 462d9c9f0c..f9f40d8fb1 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 @@ -1,8 +1,7 @@ import type { UmbUserGroupDetailModel } from '../index.js'; import { UMB_USER_GROUP_ENTITY_TYPE } from '../index.js'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context-token.js'; -import type { UUIBooleanInputEvent, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -15,15 +14,22 @@ import type { UmbInputLanguageElement } from '@umbraco-cms/backoffice/language'; import './components/user-group-entity-user-permission-list.element.js'; import './components/user-group-granular-permission-list.element.js'; +import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/components'; @customElement('umb-user-group-workspace-editor') export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { + @state() + private _isNew?: boolean = false; + @state() private _unique?: UmbUserGroupDetailModel['unique']; @state() private _name?: UmbUserGroupDetailModel['name']; + @state() + private _alias?: UmbUserGroupDetailModel['alias']; + @state() private _icon: UmbUserGroupDetailModel['icon'] = null; @@ -61,8 +67,10 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { #observeUserGroup() { if (!this.#workspaceContext) return; + this.observe(this.#workspaceContext.isNew, (value) => (this._isNew = value), '_observeIsNew'); this.observe(this.#workspaceContext.unique, (value) => (this._unique = value), '_observeUnique'); this.observe(this.#workspaceContext.name, (value) => (this._name = value), '_observeName'); + this.observe(this.#workspaceContext.alias, (value) => (this._alias = value), '_observeAlias'); this.observe(this.#workspaceContext.icon, (value) => (this._icon = value), '_observeIcon'); this.observe(this.#workspaceContext.sections, (value) => (this._sections = value), '_observeSections'); this.observe(this.#workspaceContext.languages, (value) => (this._languages = value), '_observeLanguages'); @@ -150,16 +158,6 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { this.#workspaceContext?.updateProperty('mediaStartNode', selected ? { unique: selected } : null); } - #onNameChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; - - if (typeof target?.value === 'string') { - this.#workspaceContext?.updateProperty('name', target.value); - } - } - } - render() { if (!this._unique) return nothing; @@ -196,19 +194,26 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { }); } + #onNameAndAliasChange(event: InputEvent & { target: UmbInputWithAliasElement }) { + this.#workspaceContext?.updateProperty('name', event.target.value ?? ''); + this.#workspaceContext?.updateProperty('alias', event.target.alias ?? ''); + } + #renderHeader() { return html` `; } From 30e70346b36c3b0182a62c286fdb25d3e88631a4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 12:49:47 +0200 Subject: [PATCH 303/323] redirect to the root without an opener --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 598f8e2ad6..8304a81d16 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -74,7 +74,7 @@ export class UmbAppElement extends UmbLitElement { this.#authContext?.completeAuthorizationRequest().finally(() => { // If we don't have an opener, redirect to the root if (!window.opener) { - //history.replaceState(null, '', ''); + history.replaceState(null, '', ''); } }); }, From 8223c35cc2893f9bce9635d23da7bfdeefa1a6e4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 12:59:16 +0200 Subject: [PATCH 304/323] make exemptions for the oauth_complete and error pages (they should always show without any runtime redirects) --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 8304a81d16..5e1e385e08 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -195,6 +195,15 @@ export class UmbAppElement extends UmbLitElement { } #redirect() { + const pathname = pathWithoutBasePath({ start: true, end: false }); + + // If we are on the oauth_complete or error page, we should not redirect + if (pathname === '/oauth_complete' || pathname === '/error') { + // Initialize the router + history.replaceState(null, '', location.href); + return; + } + switch (this.#serverConnection?.getStatus()) { case RuntimeLevelModel.INSTALL: history.replaceState(null, '', 'install'); @@ -209,8 +218,6 @@ export class UmbAppElement extends UmbLitElement { break; case RuntimeLevelModel.RUN: { - const pathname = pathWithoutBasePath({ start: true, end: false }); - // If we are on installer or upgrade page, redirect to the root since we are in the RUN state if (pathname === '/install' || pathname === '/upgrade') { history.replaceState(null, '', '/'); From 5b3e6536c46c741813eba4fab4749a8231f7851e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 13:10:08 +0200 Subject: [PATCH 305/323] add alias readonly state to input with alias --- .../input-with-alias.element.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts index 24f5c0cab7..fb75b79bdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts @@ -1,4 +1,4 @@ -import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, nothing, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -13,6 +13,9 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit @property({ type: String, reflect: false }) alias?: string; + @property({ type: Boolean, reflect: true, attribute: 'alias-readonly' }) + aliasReadonly = false; + @property({ type: Boolean, attribute: 'auto-generate-alias' }) autoGenerateAlias?: boolean; @@ -75,11 +78,14 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit @input=${this.#onAliasChange} .value=${this.alias} placeholder="Enter alias..." - ?disabled=${this._aliasLocked}> + ?disabled=${this._aliasLocked && !this.aliasReadonly} + ?readonly=${this.aliasReadonly}> -
''} id="alias-lock" slot="prepend"> - -
+ ${this.aliasReadonly + ? nothing + : html`
''} id="alias-lock" slot="prepend"> + +
`} `; @@ -105,6 +111,7 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit justify-content: center; cursor: pointer; } + #alias-lock uui-icon { margin-bottom: 2px; } From 20d8116d7ed0ec1f7c89e0eab965b3584a641caf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 13:12:03 +0200 Subject: [PATCH 306/323] add missing imports --- .../media-types/workspace/media-type-workspace-editor.element.ts | 1 + .../workspace/member-type-workspace-editor.element.ts | 1 + 2 files changed, 2 insertions(+) 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 f2d91c4b49..ac79122095 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,6 +3,7 @@ import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from './media-type-workspace.context import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UMB_ICON_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/components'; @customElement('umb-media-type-workspace-editor') export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { 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 e3581adc00..065cc79855 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,4 +1,5 @@ import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from './member-type-workspace.context-token.js'; +import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/components'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UMB_ICON_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; From f537e647b0eae32072b70f95bdb0af8801431d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 13:21:38 +0200 Subject: [PATCH 307/323] rename token and context --- .../entity-actions-bundle.element.ts | 1 + .../entity-is-not-trashed.condition.ts | 4 ++-- .../is-trashed/entity-is-trashed.condition.ts | 4 ++-- .../is-trashed/entity-is-trashed.context-token.ts | 7 ------- .../core/recycle-bin/contexts/is-trashed/index.ts | 4 ++-- .../is-trashed/is-trashed.entity-context-token.ts | 7 +++++++ ...hed.context.ts => is-trashed.entity-context.ts} | 14 +++++++------- .../src/packages/core/recycle-bin/index.ts | 2 +- .../tree/tree-item/document-tree-item.context.ts | 5 +++-- .../workspace/document-workspace.context.ts | 4 ++-- .../tree/tree-item/media-tree-item.context.ts | 4 ++-- .../media/workspace/media-workspace.context.ts | 4 ++-- 12 files changed, 31 insertions(+), 29 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts rename src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/{entity-is-trashed.context.ts => is-trashed.entity-context.ts} (63%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts index 71090ba875..44e39874ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts @@ -31,6 +31,7 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { #sectionSidebarContext?: UmbSectionSidebarContext; + // TODO: provide the entity context on a higher level, like the root element of this entity, tree-item/workspace/... [NL] #entityContext = new UmbEntityContext(this); constructor() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts index 9911a42daf..56dce88cdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-not-trashed/entity-is-not-trashed.condition.ts @@ -1,4 +1,4 @@ -import { UMB_ENTITY_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; +import { UMB_IS_TRASHED_ENTITY_CONTEXT } from '../../contexts/is-trashed/index.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { @@ -18,7 +18,7 @@ export class UmbEntityIsNotTrashedCondition // and therefore the condition is permitted this.permitted = true; - this.consumeContext(UMB_ENTITY_IS_TRASHED_CONTEXT, (context) => { + this.consumeContext(UMB_IS_TRASHED_ENTITY_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === false; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts index 1c62dc2852..0c098771a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.ts @@ -1,4 +1,4 @@ -import { UMB_ENTITY_IS_TRASHED_CONTEXT } from '../../contexts/is-trashed/index.js'; +import { UMB_IS_TRASHED_ENTITY_CONTEXT } from '../../contexts/is-trashed/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbConditionConfigBase, @@ -11,7 +11,7 @@ export class UmbIsTrashedCondition extends UmbConditionBase) { super(host, args); - this.consumeContext(UMB_ENTITY_IS_TRASHED_CONTEXT, (context) => { + this.consumeContext(UMB_IS_TRASHED_ENTITY_CONTEXT, (context) => { this.observe(context.isTrashed, (isTrashed) => { this.permitted = isTrashed === true; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts deleted file mode 100644 index fee62ff802..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; - -export const UMB_ENTITY_IS_TRASHED_CONTEXT = new UmbContextToken( - 'UmbEntityContext', - 'isTrashed', -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts index 18e16130d9..fd31808557 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/index.ts @@ -1,2 +1,2 @@ -export { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; -export { UMB_ENTITY_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; +export { UmbIsTrashedEntityContext } from './is-trashed.entity-context.js'; +export { UMB_IS_TRASHED_ENTITY_CONTEXT } from './is-trashed.entity-context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts new file mode 100644 index 0000000000..ae4b9482c8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts @@ -0,0 +1,7 @@ +import type { UmbIsTrashedEntityContext } from './is-trashed.entity-context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_IS_TRASHED_ENTITY_CONTEXT = new UmbContextToken( + 'UmbEntityContext', + 'isTrashed', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context.ts index 740c62cdc2..b80ed8301f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context.ts @@ -1,21 +1,21 @@ -import { UMB_ENTITY_IS_TRASHED_CONTEXT } from './entity-is-trashed.context-token.js'; +import { UMB_IS_TRASHED_ENTITY_CONTEXT } from './is-trashed.entity-context-token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; /** - * Represents the context for the isTrashed state + * A entity context for the isTrashed state. * @export - * @class UmbIsTrashedContext - * @extends {UmbContextBase} - * @implements {UmbEntityIsTrashedContext} + * @class UmbIsTrashedEntityContext + * @extends {UmbContextBase} + * @implements {UmbIsTrashedEntityContext} */ -export class UmbEntityIsTrashedContext extends UmbContextBase { +export class UmbIsTrashedEntityContext extends UmbContextBase { #isTrashed = new UmbBooleanState(false); isTrashed = this.#isTrashed.asObservable(); constructor(host: UmbControllerHost) { - super(host, UMB_ENTITY_IS_TRASHED_CONTEXT); + super(host, UMB_IS_TRASHED_ENTITY_CONTEXT); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 1760df1229..a43b594005 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -13,6 +13,6 @@ export type { UmbRecycleBinOriginalParentRequestArgs, } from './types.js'; -export { UmbEntityIsTrashedContext, UMB_ENTITY_IS_TRASHED_CONTEXT } from './contexts/is-trashed/index.js'; +export { UmbIsTrashedEntityContext, UMB_IS_TRASHED_ENTITY_CONTEXT } from './contexts/is-trashed/index.js'; export { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from './conditions/is-not-trashed/constants.js'; export { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from './conditions/is-trashed/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts index 9bd0d67e57..52621ece9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts @@ -1,10 +1,11 @@ import type { UmbDocumentTreeItemModel } from '../types.js'; import { UmbDefaultTreeItemContext } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; export class UmbDocumentTreeItemContext extends UmbDefaultTreeItemContext { - #isTrashedContext = new UmbEntityIsTrashedContext(this); + // TODO: Provide this together with the EntityContext, ideally this takes part via a extension-type [NL] + #isTrashedContext = new UmbIsTrashedEntityContext(this); constructor(host: UmbControllerHost) { super(host); 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 c7b06607e7..a496a3a08e 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 @@ -58,7 +58,7 @@ import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/do import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; -import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; type EntityType = UmbDocumentDetailModel; export class UmbDocumentWorkspaceContext @@ -157,7 +157,7 @@ export class UmbDocumentWorkspaceContext // TODO: this should be set up for all entity workspace contexts in a base class #entityContext = new UmbEntityContext(this); // TODO: this might not be the correct place to spin this up - #isTrashedContext = new UmbEntityIsTrashedContext(this); + #isTrashedContext = new UmbIsTrashedEntityContext(this); constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_WORKSPACE_ALIAS); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts index 5df9fa848a..114805613a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.context.ts @@ -1,10 +1,10 @@ import type { UmbMediaTreeItemModel } from '../types.js'; import { UmbDefaultTreeItemContext } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; export class UmbMediaTreeItemContext extends UmbDefaultTreeItemContext { - #isTrashedContext = new UmbEntityIsTrashedContext(this); + #isTrashedContext = new UmbIsTrashedEntityContext(this); constructor(host: UmbControllerHost) { super(host); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index 1b4201e3f8..8ea7e656cf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -26,7 +26,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import type { UmbMediaTypeDetailModel } from '@umbraco-cms/backoffice/media-type'; import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; -import { UmbEntityIsTrashedContext } from '@umbraco-cms/backoffice/recycle-bin'; +import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; type EntityType = UmbMediaDetailModel; export class UmbMediaWorkspaceContext @@ -112,7 +112,7 @@ export class UmbMediaWorkspaceContext // TODO: this should be set up for all entity workspace contexts in a base class #entityContext = new UmbEntityContext(this); // TODO: this might not be the correct place to spin this up - #isTrashedContext = new UmbEntityIsTrashedContext(this); + #isTrashedContext = new UmbIsTrashedEntityContext(this); constructor(host: UmbControllerHost) { super(host, 'Umb.Workspace.Media'); From 84be3356e7ec7a60abb6d308dbd82b8de2aef3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 13:33:38 +0200 Subject: [PATCH 308/323] observable for isTrashed --- .../tree-item-base/tree-item-context-base.ts | 30 +++++++++---------- .../tree-item/document-tree-item.context.ts | 6 ++-- 2 files changed, 19 insertions(+), 17 deletions(-) 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 d86bd67532..48433be491 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 @@ -7,7 +7,7 @@ import { UMB_SECTION_CONTEXT, UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/b import type { UmbSectionContext, UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbArrayState, UmbBooleanState, UmbDeepState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState, UmbBooleanState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -31,37 +31,37 @@ export abstract class UmbTreeItemContextBase(undefined); - treeItem = this.#treeItem.asObservable(); + protected readonly _treeItem = new UmbObjectState(undefined); + readonly treeItem = this._treeItem.asObservable(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore #childItems = new UmbArrayState([], (x) => x.unique); - childItems = this.#childItems.asObservable(); + readonly childItems = this.#childItems.asObservable(); #hasChildren = new UmbBooleanState(false); - hasChildren = this.#hasChildren.asObservable(); + readonly hasChildren = this.#hasChildren.asObservable(); #isLoading = new UmbBooleanState(false); - isLoading = this.#isLoading.asObservable(); + readonly isLoading = this.#isLoading.asObservable(); #isSelectable = new UmbBooleanState(false); - isSelectable = this.#isSelectable.asObservable(); + readonly isSelectable = this.#isSelectable.asObservable(); #isSelectableContext = new UmbBooleanState(false); - isSelectableContext = this.#isSelectableContext.asObservable(); + readonly isSelectableContext = this.#isSelectableContext.asObservable(); #isSelected = new UmbBooleanState(false); - isSelected = this.#isSelected.asObservable(); + readonly isSelected = this.#isSelected.asObservable(); #isActive = new UmbBooleanState(false); - isActive = this.#isActive.asObservable(); + readonly isActive = this.#isActive.asObservable(); #hasActions = new UmbBooleanState(false); - hasActions = this.#hasActions.asObservable(); + readonly hasActions = this.#hasActions.asObservable(); #path = new UmbStringState(''); - path = this.#path.asObservable(); + readonly path = this.#path.asObservable(); treeContext?: UmbDefaultTreeContext; #sectionContext?: UmbSectionContext; @@ -130,7 +130,7 @@ export abstract class UmbTreeItemContextBase item?.isTrashed ?? false); + constructor(host: UmbControllerHost) { super(host); - this.observe(this.treeItem, (item) => { - this.#isTrashedContext.setIsTrashed(item?.isTrashed || false); + this.observe(this.isTrashed, (isTrashed) => { + this.#isTrashedContext.setIsTrashed(isTrashed); }); } } From 6705a4a2a3d6e8e034b1a5bb886f2c09aa2dcc25 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 13:56:48 +0200 Subject: [PATCH 309/323] add `supportDescription` to da-dk.ts --- src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index 0284131d52..be0653c054 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -2470,6 +2470,7 @@ export default { trainingHeader: 'Træning', trainingDescription: 'Se mulighederne for real-life træning og certificering', supportHeader: 'Support', + supportDescription: 'Udvid dit team med en højt kvalificeret og passioneret flok Umbraco-vidende mennesker.', videosHeader: 'Videoer', videosDescription: 'Se vores gratis tutortial videoer på Umbraco Learning Base YouTube-kanel, for hurtigt at komme i gang med Umbraco.', From ffbdb364658ce92a96a1fbd032db4961648d76f8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 14:39:14 +0200 Subject: [PATCH 310/323] wip can change alias --- .../user-group-collection.server.data-source.ts | 3 ++- .../detail/user-group-detail.server.data-source.ts | 6 ++++-- .../src/packages/user/user-group/types.ts | 3 ++- .../workspace/user-group-workspace-editor.element.ts | 9 +++++++++ .../user-group/workspace/user-group-workspace.context.ts | 1 + 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index c656550ed3..3626d5c4e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -34,13 +34,14 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData const mappedItems = data.items.map((item) => { const userGroup: UmbUserGroupDetailModel = { alias: item.alias, + canChangeAlias: item.canChangeAlias, documentRootAccess: item.documentRootAccess, documentStartNode: item.documentStartNode ? { unique: item.documentStartNode.id } : null, entityType: UMB_USER_GROUP_ENTITY_TYPE, fallbackPermissions: item.fallbackPermissions, hasAccessToAllLanguages: item.hasAccessToAllLanguages, icon: item.icon || null, - isSystemGroup: item.isSystemGroup, + isDeletable: item.isDeletable, languages: item.languages, mediaRootAccess: item.mediaRootAccess, mediaStartNode: item.mediaStartNode ? { unique: item.mediaStartNode.id } : null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index 32d6660a13..eede272151 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -37,13 +37,14 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource; hasAccessToAllLanguages: boolean; icon: string | null; - isSystemGroup: boolean; + isDeletable: boolean; languages: Array; mediaRootAccess: boolean; mediaStartNode: { unique: string } | null; 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 f9f40d8fb1..6454f8c037 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 @@ -30,6 +30,9 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { @state() private _alias?: UmbUserGroupDetailModel['alias']; + @state() + private _canChangeAlias: UmbUserGroupDetailModel['canChangeAlias'] = true; + @state() private _icon: UmbUserGroupDetailModel['icon'] = null; @@ -71,6 +74,11 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { this.observe(this.#workspaceContext.unique, (value) => (this._unique = value), '_observeUnique'); this.observe(this.#workspaceContext.name, (value) => (this._name = value), '_observeName'); this.observe(this.#workspaceContext.alias, (value) => (this._alias = value), '_observeAlias'); + this.observe( + this.#workspaceContext.canChangeAlias, + (value) => (this._canChangeAlias = value), + '_observeCanChangeAlias', + ); this.observe(this.#workspaceContext.icon, (value) => (this._icon = value), '_observeIcon'); this.observe(this.#workspaceContext.sections, (value) => (this._sections = value), '_observeSections'); this.observe(this.#workspaceContext.languages, (value) => (this._languages = value), '_observeLanguages'); @@ -212,6 +220,7 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { .value=${this._name} alias=${ifDefined(this._alias)} ?auto-generate-alias=${this._isNew} + alias-readonly=${!this._canChangeAlias} @change="${this.#onNameAndAliasChange}" ${umbFocus()}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index f2690e03ab..eeb6e04eac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -24,6 +24,7 @@ export class UmbUserGroupWorkspaceContext readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name || ''); readonly alias = this.#data.asObservablePart((data) => data?.alias || ''); + readonly canChangeAlias = this.#data.asObservablePart((data) => data?.canChangeAlias || true); readonly icon = this.#data.asObservablePart((data) => data?.icon || null); readonly sections = this.#data.asObservablePart((data) => data?.sections || []); readonly languages = this.#data.asObservablePart((data) => data?.languages || []); From ed4a9858a9c58a2bb0dc2f5a668bb029e3e5b311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 15:16:31 +0200 Subject: [PATCH 311/323] rename token again --- .../contexts/is-trashed/entity-is-trashed.context-token.ts | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts new file mode 100644 index 0000000000..be593a1038 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts @@ -0,0 +1,6 @@ +import type { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_ENTITY_IS_TRASHED_CONTEXT = new UmbContextToken( + 'UmbEntityIsTrashedContext', +); From 38812980edc832cf90c4df1412df2a9977d65555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 2 May 2024 15:16:59 +0200 Subject: [PATCH 312/323] revert token --- .../contexts/is-trashed/entity-is-trashed.context-token.ts | 6 ------ .../contexts/is-trashed/is-trashed.entity-context-token.ts | 3 +-- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts deleted file mode 100644 index be593a1038..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/entity-is-trashed.context-token.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { UmbEntityIsTrashedContext } from './entity-is-trashed.context.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; - -export const UMB_ENTITY_IS_TRASHED_CONTEXT = new UmbContextToken( - 'UmbEntityIsTrashedContext', -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts index ae4b9482c8..198b855a05 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/contexts/is-trashed/is-trashed.entity-context-token.ts @@ -2,6 +2,5 @@ import type { UmbIsTrashedEntityContext } from './is-trashed.entity-context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_IS_TRASHED_ENTITY_CONTEXT = new UmbContextToken( - 'UmbEntityContext', - 'isTrashed', + 'UmbEntityIsTrashedContext', ); From c5076b1ebe276a58830d63a1d93f0143b4f5a05e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 16:13:11 +0200 Subject: [PATCH 313/323] generate new server models --- .../src/external/backend-api/src/models.ts | 36 ++++-- .../src/external/backend-api/src/services.ts | 107 ++++-------------- 2 files changed, 49 insertions(+), 94 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index 36e63784e3..bb559217ec 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -113,7 +113,7 @@ export type CopyMediaTypeRequestModel = { export type CreateDataTypeRequestModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array id?: string | null parent?: ReferenceByIdModel | null @@ -333,6 +333,7 @@ stylesheets: Array scripts: Array languages: Array dictionaryItems: Array +id?: string | null }; export type CreatePartialViewFolderRequestModel = { @@ -436,9 +437,9 @@ userName: string name: string languageIsoCode?: string | null documentStartNodeIds: Array -documentRootAccess: boolean +hasDocumentRootAccess: boolean mediaStartNodeIds: Array -mediaRootAccess: boolean +hasMediaRootAccess: boolean avatarUrls: Array languages: Array hasAccessToAllLanguages: boolean @@ -481,7 +482,7 @@ properties: Array export type DataTypeResponseModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array id: string isDeletable: boolean @@ -1813,6 +1814,11 @@ export type PagedUserResponseModel = { items: Array }; +export type PagedWebhookEventModel = { + total: number +items: Array + }; + export type PagedWebhookResponseModel = { total: number items: Array @@ -2265,7 +2271,7 @@ export type UnpublishDocumentRequestModel = { export type UpdateDataTypeRequestModel = { name: string editorAlias: string -editorUiAlias?: string | null +editorUiAlias: string values: Array }; @@ -2514,9 +2520,9 @@ name: string userGroupIds: Array languageIsoCode: string documentStartNodeIds: Array -documentRootAccess: boolean +hasDocumentRootAccess: boolean mediaStartNodeIds: Array -mediaRootAccess: boolean +hasMediaRootAccess: boolean }; export type UpdateWebhookRequestModel = { @@ -2625,9 +2631,9 @@ userGroupIds: Array id: string languageIsoCode?: string | null documentStartNodeIds: Array -documentRootAccess: boolean +hasDocumentRootAccess: boolean mediaStartNodeIds: Array -mediaRootAccess: boolean +hasMediaRootAccess: boolean avatarUrls: Array state: UserStateModel failedLoginAttempts: number @@ -2682,6 +2688,12 @@ export type VerifyResetPasswordTokenRequestModel = { resetCode: string }; +export type WebhookEventModel = { + eventName: string +eventType: string +alias: string + }; + export type WebhookEventResponseModel = { eventName: string eventType: string @@ -5227,6 +5239,11 @@ requestBody?: UpdateWebhookRequestModel DeleteWebhookById: { id: string + }; +GetWebhookEvents: { + skip?: number +take?: number + }; } @@ -5238,6 +5255,7 @@ DeleteWebhookById: { ,GetWebhookById: WebhookResponseModel ,PutWebhookById: string ,DeleteWebhookById: string + ,GetWebhookEvents: PagedWebhookEventModel } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts index 90d5b8e9e0..503eeca574 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -1,91 +1,6 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { AuditLogData, CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; - -export class AuditLogService { - - /** - * @returns unknown Success - * @throws ApiError - */ - public static getAuditLog(data: AuditLogData['payloads']['GetAuditLog'] = {}): CancelablePromise { - const { - - orderDirection, -sinceDate, -skip, -take - } = data; - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log', - query: { - orderDirection, sinceDate, skip, take - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns unknown Success - * @throws ApiError - */ - public static getAuditLogById(data: AuditLogData['payloads']['GetAuditLogById']): CancelablePromise { - const { - - id, -orderDirection, -sinceDate, -skip, -take - } = data; - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log/{id}', - path: { - id - }, - query: { - orderDirection, sinceDate, skip, take - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 403: `The authenticated user do not have access to this resource`, - }, - }); - } - - /** - * @returns unknown Success - * @throws ApiError - */ - public static getAuditLogTypeByLogType(data: AuditLogData['payloads']['GetAuditLogTypeByLogType']): CancelablePromise { - const { - - logType, -sinceDate, -skip, -take - } = data; - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log/type/{logType}', - path: { - logType - }, - query: { - sinceDate, skip, take - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - -} import type { CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, OembedData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; export class CultureService { @@ -9156,4 +9071,26 @@ requestBody }); } + /** + * @returns unknown Success + * @throws ApiError + */ + public static getWebhookEvents(data: WebhookData['payloads']['GetWebhookEvents'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook/events', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + } \ No newline at end of file From 700ad481517129602e6d794c06510ff9d84b40b5 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 2 May 2024 16:51:50 +0200 Subject: [PATCH 314/323] `property-value-change` should not be hardcoded this updates (essentially search/replaces) all instances of hardcoded `property-value-change` with the `UmbPropertyValueChangeEvent` class --- .../property-editor-ui-block-grid-column-span.element.ts | 7 +++++-- ...rty-editor-ui-block-grid-group-configuration.element.ts | 7 +++++-- ...perty-editor-ui-block-grid-layout-stylesheet.element.ts | 7 +++++-- .../property-editor-ui-markdown-editor.element.ts | 2 +- ...property-editor-ui-image-crops-configuration.element.ts | 5 +++-- .../icon-picker/property-editor-ui-icon-picker.element.ts | 3 ++- .../property-editor-ui-overlay-size.element.ts | 7 +++++-- .../text-box/property-editor-ui-text-box.element.ts | 7 +++++-- .../textarea/property-editor-ui-textarea.element.ts | 7 +++++-- .../property-editor-ui-upload-field.element.ts | 7 +++++-- .../value-type/property-editor-ui-value-type.element.ts | 7 +++++-- .../property-editor-ui-static-file-picker.element.ts | 7 +++++-- .../tags/property-editor-ui-tags.element.ts | 7 +++++-- ...rty-editor-ui-tiny-mce-toolbar-configuration.element.ts | 7 +++++-- 14 files changed, 61 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts index 69bcdf527e..e635d38d9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts @@ -2,7 +2,10 @@ import type { UmbBlockGridTypeColumnSpanOption } from '../../types.js'; import { html, customElement, property, css, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-property-editor-ui-block-grid-column-span') @@ -30,7 +33,7 @@ export class UmbPropertyEditorUIBlockGridColumnSpanElement extends UmbLitElement this.value = [...value, { columnSpan: index }]; } - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts index a38f9966e8..00d7468381 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts @@ -1,7 +1,10 @@ import { html, customElement, property, css } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbBlockGridTypeGroupType } from '@umbraco-cms/backoffice/block-grid'; @@ -25,7 +28,7 @@ export class UmbPropertyEditorUIBlockGridGroupConfigurationElement #addGroup() { this.value = [...this._value, { name: 'Unnamed group', key: UmbId.new() }]; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts index b5e2ab09fe..9cd3218e1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts @@ -6,7 +6,10 @@ import '@umbraco-cms/backoffice/static-file'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-property-editor-ui-block-grid-layout-stylesheet') @@ -29,7 +32,7 @@ export class UmbPropertyEditorUIBlockGridLayoutStylesheetElement private _onChange(event: CustomEvent) { this.value = (event.target as UmbInputStaticFileElement).selection; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } // TODO: Implement mandatory? diff --git a/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/property-editors/markdown-editor/property-editor-ui-markdown-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/property-editors/markdown-editor/property-editor-ui-markdown-editor.element.ts index e224d31875..91d1abdda4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/property-editors/markdown-editor/property-editor-ui-markdown-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/markdown-editor/property-editors/markdown-editor/property-editor-ui-markdown-editor.element.ts @@ -29,7 +29,7 @@ export class UmbPropertyEditorUIMarkdownEditorElement extends UmbLitElement impl #onChange(e: Event) { this.value = (e.target as UmbInputMarkdownElement).value as string; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts index d29aa1b530..bbccbeac1f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts @@ -2,6 +2,7 @@ import { html, customElement, property, css, repeat, state } from '@umbraco-cms/ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor'; export type UmbCrop = { label: string; @@ -27,7 +28,7 @@ export class UmbPropertyEditorUIImageCropsConfigurationElement #onRemove(alias: string) { this.value = [...this.value.filter((item) => item.alias !== alias)]; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } #onEdit(crop: UmbCrop) { @@ -88,7 +89,7 @@ export class UmbPropertyEditorUIImageCropsConfigurationElement } else { this.value = [...this.value, newCrop]; } - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); form.reset(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/property-editor-ui-icon-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/property-editor-ui-icon-picker.element.ts index f34445a035..0c35c621d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/property-editor-ui-icon-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/property-editor-ui-icon-picker.element.ts @@ -3,6 +3,7 @@ import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extensi import { UMB_MODAL_MANAGER_CONTEXT, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { extractUmbColorVariable } from '@umbraco-cms/backoffice/resources'; +import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor'; /** * @element umb-property-editor-ui-icon-picker @@ -46,7 +47,7 @@ export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implemen this.value = data.icon as string; } - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/overlay-size/property-editor-ui-overlay-size.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/overlay-size/property-editor-ui-overlay-size.element.ts index e807ef8bbe..831ddbdd3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/overlay-size/property-editor-ui-overlay-size.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/overlay-size/property-editor-ui-overlay-size.element.ts @@ -1,7 +1,10 @@ import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import type { UUIModalSidebarSize, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; /** @@ -33,7 +36,7 @@ export class UmbPropertyEditorUIOverlaySizeElement extends UmbLitElement impleme #onChange(event: UUISelectEvent) { this.value = event.target.value as string; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/text-box/property-editor-ui-text-box.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/text-box/property-editor-ui-text-box.element.ts index 19663c22dc..91e235229e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/text-box/property-editor-ui-text-box.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/text-box/property-editor-ui-text-box.element.ts @@ -9,7 +9,10 @@ import { } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; @@ -50,7 +53,7 @@ export class UmbPropertyEditorUITextBoxElement const newValue = (e.target as HTMLInputElement).value; if (newValue === this.value) return; this.value = newValue; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/textarea/property-editor-ui-textarea.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/textarea/property-editor-ui-textarea.element.ts index 6ab34bcdf6..b7a050689b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/textarea/property-editor-ui-textarea.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/textarea/property-editor-ui-textarea.element.ts @@ -2,7 +2,10 @@ import { css, html, customElement, property, state, ifDefined, styleMap } from ' import type { UUITextareaElement } from '@umbraco-cms/backoffice/external/uui'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; @customElement('umb-property-editor-ui-textarea') export class UmbPropertyEditorUITextareaElement extends UmbLitElement implements UmbPropertyEditorUiElement { @@ -38,7 +41,7 @@ export class UmbPropertyEditorUITextareaElement extends UmbLitElement implements private onInput(e: InputEvent) { this.value = (e.target as UUITextareaElement).value as string; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/upload-field/property-editor-ui-upload-field.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/upload-field/property-editor-ui-upload-field.element.ts index 1b55630fb5..31e223a69b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/upload-field/property-editor-ui-upload-field.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/upload-field/property-editor-ui-upload-field.element.ts @@ -2,7 +2,10 @@ import type { UmbInputUploadFieldElement } from '../../core/components/input-upl import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; /** * @element umb-property-editor-ui-upload-field @@ -28,7 +31,7 @@ export class UmbPropertyEditorUIUploadFieldElement extends UmbLitElement impleme private _onChange(event: CustomEvent) { this.value = (event.target as unknown as UmbInputUploadFieldElement).value as string; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/value-type/property-editor-ui-value-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/value-type/property-editor-ui-value-type.element.ts index 02cd33ec60..645332cfa7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/value-type/property-editor-ui-value-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/value-type/property-editor-ui-value-type.element.ts @@ -2,7 +2,10 @@ import { html, customElement, property, state, query } from '@umbraco-cms/backof import type { UUISelectElement, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; /** * @element umb-property-editor-ui-value-type @@ -46,7 +49,7 @@ export class UmbPropertyEditorUIValueTypeElement extends UmbLitElement implement #onChange(e: UUISelectEvent) { this.value = e.target.value as string; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/property-editors/static-file-picker/property-editor-ui-static-file-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/property-editors/static-file-picker/property-editor-ui-static-file-picker.element.ts index 1ef62bbb86..84fbb7315a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/property-editors/static-file-picker/property-editor-ui-static-file-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/property-editors/static-file-picker/property-editor-ui-static-file-picker.element.ts @@ -2,7 +2,10 @@ import type { UmbInputStaticFileElement } from '../../components/index.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import '../../components/input-static-file/index.js'; @customElement('umb-property-editor-ui-static-file-picker') @@ -31,7 +34,7 @@ export class UmbPropertyEditorUIStaticFilePickerElement extends UmbLitElement im private _onChange(event: CustomEvent) { this.value = (event.target as UmbInputStaticFileElement).selection; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } // TODO: Implement mandatory? diff --git a/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts index 7c25a6004f..1f6b321345 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts @@ -1,7 +1,10 @@ import type { UmbTagsInputElement } from '../../components/tags-input/tags-input.element.js'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -51,7 +54,7 @@ export class UmbPropertyEditorUITagsElement extends UmbLitElement implements Umb #onChange(event: CustomEvent) { this.value = ((event.target as UmbTagsInputElement).value as string).split(','); - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts index 6d49f9ba0c..1ce12335fb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.ts @@ -5,7 +5,10 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; -import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import { tinymce } from '@umbraco-cms/backoffice/external/tinymce'; const tinyIconSet = tinymce.IconManager.get('default'); @@ -106,7 +109,7 @@ export class UmbPropertyEditorUITinyMceToolbarConfigurationElement this.value = value; - this.dispatchEvent(new CustomEvent('property-value-change')); + this.dispatchEvent(new UmbPropertyValueChangeEvent()); } render() { From 702cd619e46291f036853a124e2e0a4e6bf94add Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 18:44:34 +0200 Subject: [PATCH 315/323] update field names --- .../mocks/data/data-type/data-type.data.ts | 2 ++ .../src/mocks/data/user/user.data.ts | 20 +++++------ .../src/mocks/data/user/user.db.ts | 12 +++---- .../user-collection.server.data-source.ts | 4 +-- .../detail/user-detail.server.data-source.ts | 12 +++---- .../src/packages/user/user/types.ts | 34 +++++++++---------- .../user-workspace-assign-access.element.ts | 12 +++---- .../user/workspace/user-workspace.context.ts | 4 +-- 8 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts index f26833d53e..dbd3bd2e7d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts @@ -14,6 +14,7 @@ export const data: Array = [ isFolder: true, hasChildren: false, editorAlias: '', + editorUiAlias: '', values: [], isDeletable: true, canIgnoreStartNodes: false, @@ -25,6 +26,7 @@ export const data: Array = [ isFolder: true, hasChildren: true, editorAlias: '', + editorUiAlias: '', values: [], isDeletable: true, canIgnoreStartNodes: false, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts index bf37e74fbe..27b5ce7669 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts @@ -11,9 +11,9 @@ export const data: Array = [ { id: 'bca6c733-a63d-4353-a271-9a8b6bcca8bd', documentStartNodeIds: [], - documentRootAccess: true, + hasDocumentRootAccess: true, mediaStartNodeIds: [], - mediaRootAccess: true, + hasMediaRootAccess: true, name: 'Umbraco User', email: 'noreply@umbraco.com', languageIsoCode: 'en-us', @@ -32,9 +32,9 @@ export const data: Array = [ { id: '82e11d3d-b91d-43c9-9071-34d28e62e81d', documentStartNodeIds: ['simple-document-id'], - documentRootAccess: true, + hasDocumentRootAccess: true, mediaStartNodeIds: ['f2f81a40-c989-4b6b-84e2-057cecd3adc1'], - mediaRootAccess: true, + hasMediaRootAccess: true, name: 'Amelie Walker', email: 'awalker1@domain.com', languageIsoCode: 'da-dk', @@ -54,8 +54,8 @@ export const data: Array = [ id: 'aa1d83a9-bc7f-47d2-b288-58d8a31f5017', documentStartNodeIds: [], mediaStartNodeIds: [], - documentRootAccess: true, - mediaRootAccess: true, + hasDocumentRootAccess: true, + hasMediaRootAccess: true, name: 'Oliver Kim', email: 'okim1@domain.com', languageIsoCode: 'da-dk', @@ -75,8 +75,8 @@ export const data: Array = [ id: 'ff2f4a50-d3d4-4bc4-869d-c7948c160e54', documentStartNodeIds: [], mediaStartNodeIds: [], - documentRootAccess: true, - mediaRootAccess: true, + hasDocumentRootAccess: true, + hasMediaRootAccess: true, name: 'Eliana Nieves', email: 'enieves1@domain.com', languageIsoCode: 'en-us', @@ -96,8 +96,8 @@ export const data: Array = [ id: 'c290c6d9-9f12-4838-8567-621b52a178de', documentStartNodeIds: [], mediaStartNodeIds: [], - documentRootAccess: true, - mediaRootAccess: true, + hasDocumentRootAccess: true, + hasMediaRootAccess: true, name: 'Jasmine Patel', email: 'jpatel1@domain.com', languageIsoCode: 'en-us', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index 558f012f67..f414e6bc65 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -68,8 +68,8 @@ class UmbUserMockDB extends UmbEntityMockDbBase { languages: [], documentStartNodeIds: firstUser.documentStartNodeIds, mediaStartNodeIds: firstUser.mediaStartNodeIds, - documentRootAccess: firstUser.documentRootAccess, - mediaRootAccess: firstUser.mediaRootAccess, + hasDocumentRootAccess: firstUser.hasDocumentRootAccess, + hasMediaRootAccess: firstUser.hasMediaRootAccess, fallbackPermissions: [], permissions, allowedSections, @@ -199,8 +199,8 @@ const createMockMapper = (item: CreateUserRequestModel): UmbMockUserModel => { languageIsoCode: null, documentStartNodeIds: [], mediaStartNodeIds: [], - documentRootAccess: false, - mediaRootAccess: false, + hasDocumentRootAccess: false, + hasMediaRootAccess: false, avatarUrls: [], state: UserStateModel.INACTIVE, failedLoginAttempts: 0, @@ -223,8 +223,8 @@ const detailResponseMapper = (item: UmbMockUserModel): UserResponseModel => { languageIsoCode: item.languageIsoCode, documentStartNodeIds: item.documentStartNodeIds, mediaStartNodeIds: item.mediaStartNodeIds, - documentRootAccess: item.documentRootAccess, - mediaRootAccess: item.mediaRootAccess, + hasDocumentRootAccess: item.hasDocumentRootAccess, + hasMediaRootAccess: item.hasMediaRootAccess, avatarUrls: item.avatarUrls, state: item.state, failedLoginAttempts: item.failedLoginAttempts, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts index 966f9b5739..61b063b3b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts @@ -64,8 +64,8 @@ export class UmbUserCollectionServerDataSource implements UmbCollectionDataSourc languageIsoCode: item.languageIsoCode || null, documentStartNodeUniques: item.documentStartNodeIds, mediaStartNodeUniques: item.mediaStartNodeIds, - documentRootAccess: item.documentRootAccess, - mediaRootAccess: item.mediaRootAccess, + hasDocumentRootAccess: item.hasDocumentRootAccess, + hasMediaRootAccess: item.hasMediaRootAccess, avatarUrls: item.avatarUrls, state: item.state, failedLoginAttempts: item.failedLoginAttempts, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts index 52d72f4482..b32acc6bcd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts @@ -35,7 +35,7 @@ export class UmbUserServerDataSource implements UmbDetailDataSource; - unique: string; - languageIsoCode: string | null; - documentStartNodeUniques: Array; - documentRootAccess: boolean; - mediaStartNodeUniques: Array; - mediaRootAccess: boolean; avatarUrls: Array; - state: UmbUserStateEnum | null; - failedLoginAttempts: number; createDate: string | null; - updateDate: string | null; - lastLoginDate: string | null; - lastLockoutDate: string | null; - lastPasswordChangeDate: string | null; + documentStartNodeUniques: Array; + email: string; + entityType: UmbUserEntityType; + failedLoginAttempts: number; + hasDocumentRootAccess: boolean; + hasMediaRootAccess: boolean; isAdmin: boolean; + languageIsoCode: string | null; + lastLockoutDate: string | null; + lastLoginDate: string | null; + lastPasswordChangeDate: string | null; + mediaStartNodeUniques: Array; + name: string; + state: UmbUserStateEnum | null; + unique: string; + updateDate: string | null; + userGroupUniques: Array; + userName: string; } export type UmbUserMfaProviderModel = UserTwoFactorProviderModel; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts index c1c5695c85..4859421d47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts @@ -18,13 +18,13 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { private _documentStartNodeUniques: UmbUserDetailModel['documentStartNodeUniques'] = []; @state() - private _documentRootAccess: UmbUserDetailModel['documentRootAccess'] = false; + private _documentRootAccess: UmbUserDetailModel['hasDocumentRootAccess'] = false; @state() private _mediaStartNodeUniques: UmbUserDetailModel['documentStartNodeUniques'] = []; @state() - private _mediaRootAccess: UmbUserDetailModel['mediaRootAccess'] = false; + private _mediaRootAccess: UmbUserDetailModel['hasMediaRootAccess'] = false; #workspaceContext?: typeof UMB_USER_WORKSPACE_CONTEXT.TYPE; @@ -41,7 +41,7 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { ); this.observe( - this.#workspaceContext.documentRootAccess, + this.#workspaceContext.hasDocumentRootAccess, (value) => (this._documentRootAccess = value), '_observeDocumentRootAccess', ); @@ -53,7 +53,7 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { ); this.observe( - this.#workspaceContext.mediaRootAccess, + this.#workspaceContext.hasMediaRootAccess, (value) => (this._mediaRootAccess = value), '_observeMediaRootAccess', ); @@ -78,7 +78,7 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { event.stopPropagation(); const target = event.target; // TODO make contexts method - this.#workspaceContext?.updateProperty('documentRootAccess', target.checked); + this.#workspaceContext?.updateProperty('hasDocumentRootAccess', target.checked); this.#workspaceContext?.updateProperty('documentStartNodeUniques', []); } @@ -94,7 +94,7 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { event.stopPropagation(); const target = event.target; // TODO make contexts method - this.#workspaceContext?.updateProperty('mediaRootAccess', target.checked); + this.#workspaceContext?.updateProperty('hasMediaRootAccess', target.checked); this.#workspaceContext?.updateProperty('mediaStartNodeUniques', []); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts index 12673884a1..7bf10835fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts @@ -27,9 +27,9 @@ export class UmbUserWorkspaceContext readonly documentStartNodeUniques = this.#currentData.asObservablePart( (data) => data?.documentStartNodeUniques || [], ); - readonly documentRootAccess = this.#currentData.asObservablePart((data) => data?.documentRootAccess || false); + readonly hasDocumentRootAccess = this.#currentData.asObservablePart((data) => data?.hasDocumentRootAccess || false); readonly mediaStartNodeUniques = this.#currentData.asObservablePart((data) => data?.mediaStartNodeUniques || []); - readonly mediaRootAccess = this.#currentData.asObservablePart((data) => data?.mediaRootAccess || false); + readonly hasMediaRootAccess = this.#currentData.asObservablePart((data) => data?.hasMediaRootAccess || false); readonly routes = new UmbWorkspaceRouteManager(this); From 07282123e81e6aae64bf691c4cff80dc9c566029 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 May 2024 18:46:07 +0200 Subject: [PATCH 316/323] fix editor ui alias --- .../src/mocks/data/data-type/data-type.data.ts | 1 + .../src/mocks/data/data-type/data-type.db.ts | 1 + .../repository/detail/data-type-detail.server.data-source.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts index dbd3bd2e7d..c794c4a871 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts @@ -310,6 +310,7 @@ export const data: Array = [ id: 'dt-datePicker-time', parent: null, editorAlias: 'Umbraco.DateTime', + editorUiAlias: 'Umb.PropertyEditorUi.DatePicker', hasChildren: false, isFolder: false, isDeletable: true, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts index fad4ede41a..8880e64ff8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts @@ -44,6 +44,7 @@ const createFolderMockMapper = (request: CreateFolderRequestModel): UmbMockDataT isFolder: true, hasChildren: false, editorAlias: '', + editorUiAlias: '', isDeletable: true, canIgnoreStartNodes: false, values: [], diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts index 0fbed19899..60cc2a6e08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -120,6 +120,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource Date: Thu, 2 May 2024 18:46:40 +0200 Subject: [PATCH 317/323] add null check --- .../repository/detail/data-type-detail.server.data-source.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts index 60cc2a6e08..0902e37c11 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -86,6 +86,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource Date: Fri, 3 May 2024 08:54:50 +0200 Subject: [PATCH 318/323] generate server models --- .../src/external/backend-api/src/models.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index ebeb40e21e..456d08e480 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -333,6 +333,7 @@ stylesheets: Array scripts: Array languages: Array dictionaryItems: Array +id?: string | null }; export type CreatePartialViewFolderRequestModel = { @@ -1813,6 +1814,11 @@ export type PagedUserResponseModel = { items: Array }; +export type PagedWebhookEventModel = { + total: number +items: Array + }; + export type PagedWebhookResponseModel = { total: number items: Array @@ -2580,7 +2586,8 @@ mediaRootAccess: boolean fallbackPermissions: Array permissions: Array id: string -isSystemGroup: boolean +isDeletable: boolean +aliasCanBeChanged: boolean }; export type UserInstallRequestModel = { @@ -2681,6 +2688,12 @@ export type VerifyResetPasswordTokenRequestModel = { resetCode: string }; +export type WebhookEventModel = { + eventName: string +eventType: string +alias: string + }; + export type WebhookEventResponseModel = { eventName: string eventType: string @@ -5242,7 +5255,7 @@ take?: number ,GetWebhookById: WebhookResponseModel ,PutWebhookById: string ,DeleteWebhookById: string - ,GetWebhookEvents: PagedWebhookResponseModel + ,GetWebhookEvents: PagedWebhookEventModel } From bd632e535825b106bd1c2704337960e633d70f11 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 3 May 2024 09:02:15 +0200 Subject: [PATCH 319/323] chore: remove the `Umbraco.IconPicker` the schema does not exist on the backend, nor did it exist in V13, and we do not intend to ship it at this point --- .../property-editors/icon-picker/Umbraco.IconPicker.ts | 10 ---------- .../packages/property-editors/icon-picker/manifests.ts | 4 +--- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/Umbraco.IconPicker.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/Umbraco.IconPicker.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/Umbraco.IconPicker.ts deleted file mode 100644 index b9f63ab377..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/Umbraco.IconPicker.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestPropertyEditorSchema } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifest: ManifestPropertyEditorSchema = { - type: 'propertyEditorSchema', - name: 'Icon Picker', - alias: 'Umbraco.IconPicker', - meta: { - defaultPropertyEditorUiAlias: 'Umb.PropertyEditorUi.IconPicker', - }, -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/manifests.ts index 437d5fb241..28b29af0d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/property-editors/icon-picker/manifests.ts @@ -1,4 +1,3 @@ -import { manifest as schemaManifest } from './Umbraco.IconPicker.js'; import type { ManifestPropertyEditorUi, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const manifest: ManifestPropertyEditorUi = { @@ -8,10 +7,9 @@ const manifest: ManifestPropertyEditorUi = { element: () => import('./property-editor-ui-icon-picker.element.js'), meta: { label: 'Icon Picker', - propertyEditorSchemaAlias: 'Umbraco.IconPicker', icon: 'icon-autofill', group: 'common', }, }; -export const manifests: Array = [manifest, schemaManifest]; +export const manifests: Array = [manifest]; From 97c5af3ad6ed9974fcc03abe74d40897d8a62915 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 3 May 2024 09:04:46 +0200 Subject: [PATCH 320/323] generate new server models --- .../src/external/backend-api/src/models.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index 456d08e480..9b65a819dc 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -439,7 +439,9 @@ userName: string name: string languageIsoCode?: string | null documentStartNodeIds: Array +hasDocumentRootAccess: boolean mediaStartNodeIds: Array +hasMediaRootAccess: boolean avatarUrls: Array languages: Array hasAccessToAllLanguages: boolean @@ -2521,7 +2523,9 @@ name: string userGroupIds: Array languageIsoCode: string documentStartNodeIds: Array +hasDocumentRootAccess: boolean mediaStartNodeIds: Array +hasMediaRootAccess: boolean }; export type UpdateWebhookRequestModel = { @@ -2633,7 +2637,9 @@ userGroupIds: Array id: string languageIsoCode?: string | null documentStartNodeIds: Array +hasDocumentRootAccess: boolean mediaStartNodeIds: Array +hasMediaRootAccess: boolean avatarUrls: Array state: UserStateModel failedLoginAttempts: number From f0d3ff9ae84204becd0a0ba6b99b03af3b621c99 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 3 May 2024 09:21:40 +0200 Subject: [PATCH 321/323] update models --- .../mocks/data/user-group/user-group.data.ts | 17 +++++++++++------ .../src/mocks/data/user-group/user-group.db.ts | 6 ++++-- .../user-group-collection.server.data-source.ts | 2 +- .../user-group-detail.server.data-source.ts | 4 ++-- .../src/packages/user/user-group/types.ts | 2 +- .../user-group-workspace-editor.element.ts | 2 +- .../workspace/user-group-workspace.context.ts | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 15086fb40f..07cfdc57f7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -6,7 +6,7 @@ export const data: Array = [ { id: 'user-group-administrators-id', name: 'Administrators', - alias: 'administrators', + alias: 'admin', icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, fallbackPermissions: [ @@ -46,7 +46,8 @@ export const data: Array = [ hasAccessToAllLanguages: true, documentRootAccess: true, mediaRootAccess: true, - isSystemGroup: true, + aliasCanBeChanged: false, + isDeletable: false, }, { id: 'user-group-editors-id', @@ -75,7 +76,8 @@ export const data: Array = [ hasAccessToAllLanguages: true, documentRootAccess: true, mediaRootAccess: true, - isSystemGroup: true, + aliasCanBeChanged: true, + isDeletable: true, }, { id: 'user-group-sensitive-data-id', @@ -90,7 +92,8 @@ export const data: Array = [ hasAccessToAllLanguages: true, documentRootAccess: true, mediaRootAccess: true, - isSystemGroup: true, + aliasCanBeChanged: false, + isDeletable: false, }, { id: 'user-group-translators-id', @@ -105,7 +108,8 @@ export const data: Array = [ hasAccessToAllLanguages: true, documentRootAccess: true, mediaRootAccess: true, - isSystemGroup: true, + aliasCanBeChanged: true, + isDeletable: true, }, { id: 'user-group-writers-id', @@ -125,6 +129,7 @@ export const data: Array = [ hasAccessToAllLanguages: true, documentRootAccess: true, mediaRootAccess: true, - isSystemGroup: false, + aliasCanBeChanged: true, + isDeletable: true, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index c05bd99f48..c6c9fc9bf5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -66,7 +66,6 @@ const createMockMapper = (item: CreateUserGroupRequestModel): UmbMockUserGroupMo hasAccessToAllLanguages: item.hasAccessToAllLanguages, icon: item.icon, id: UmbId.new(), - isSystemGroup: false, languages: item.languages, mediaRootAccess: item.mediaRootAccess, mediaStartNode: item.mediaStartNode, @@ -74,6 +73,8 @@ const createMockMapper = (item: CreateUserGroupRequestModel): UmbMockUserGroupMo fallbackPermissions: item.fallbackPermissions, permissions: item.permissions, sections: item.sections, + aliasCanBeChanged: true, + isDeletable: true, }; }; @@ -85,7 +86,6 @@ const detailResponseMapper = (item: UmbMockUserGroupModel): UserGroupResponseMod hasAccessToAllLanguages: item.hasAccessToAllLanguages, icon: item.icon, id: item.id, - isSystemGroup: item.isSystemGroup, languages: item.languages, mediaRootAccess: item.mediaRootAccess, mediaStartNode: item.mediaStartNode, @@ -93,6 +93,8 @@ const detailResponseMapper = (item: UmbMockUserGroupModel): UserGroupResponseMod fallbackPermissions: item.fallbackPermissions, permissions: item.permissions, sections: item.sections, + aliasCanBeChanged: item.aliasCanBeChanged, + isDeletable: item.isDeletable, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index 3626d5c4e5..360b8a68a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -34,7 +34,7 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData const mappedItems = data.items.map((item) => { const userGroup: UmbUserGroupDetailModel = { alias: item.alias, - canChangeAlias: item.canChangeAlias, + aliasCanBeChanged: item.aliasCanBeChanged, documentRootAccess: item.documentRootAccess, documentStartNode: item.documentStartNode ? { unique: item.documentStartNode.id } : null, entityType: UMB_USER_GROUP_ENTITY_TYPE, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index eede272151..264b79465e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -37,7 +37,7 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name || ''); readonly alias = this.#data.asObservablePart((data) => data?.alias || ''); - readonly canChangeAlias = this.#data.asObservablePart((data) => data?.canChangeAlias || true); + readonly canChangeAlias = this.#data.asObservablePart((data) => data?.aliasCanBeChanged || true); readonly icon = this.#data.asObservablePart((data) => data?.icon || null); readonly sections = this.#data.asObservablePart((data) => data?.sections || []); readonly languages = this.#data.asObservablePart((data) => data?.languages || []); From f51d8fcafd6c35d3ce2f399cbdb960e638fec82f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 3 May 2024 09:38:19 +0200 Subject: [PATCH 322/323] map values --- .../detail/user-group-detail.server.data-source.ts | 4 ++-- .../workspace/user-group-workspace-editor.element.ts | 12 ++++++------ .../workspace/user-group-workspace.context.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index 264b79465e..aadae83164 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -81,8 +81,8 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource (this._name = value), '_observeName'); this.observe(this.#workspaceContext.alias, (value) => (this._alias = value), '_observeAlias'); this.observe( - this.#workspaceContext.canChangeAlias, - (value) => (this._canChangeAlias = value), - '_observeCanChangeAlias', + this.#workspaceContext.aliasCanBeChanged, + (value) => (this._aliasCanBeChanged = value), + '_observeAliasCanBeChanged', ); this.observe(this.#workspaceContext.icon, (value) => (this._icon = value), '_observeIcon'); this.observe(this.#workspaceContext.sections, (value) => (this._sections = value), '_observeSections'); @@ -220,8 +220,8 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { .value=${this._name} alias=${ifDefined(this._alias)} ?auto-generate-alias=${this._isNew} - alias-readonly=${!this._canChangeAlias} - @change="${this.#onNameAndAliasChange}" + ?alias-readonly=${this._aliasCanBeChanged === false} + @change=${this.#onNameAndAliasChange} ${umbFocus()}> `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 2922ee4668..3d9cea828f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -24,7 +24,7 @@ export class UmbUserGroupWorkspaceContext readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name || ''); readonly alias = this.#data.asObservablePart((data) => data?.alias || ''); - readonly canChangeAlias = this.#data.asObservablePart((data) => data?.aliasCanBeChanged || true); + readonly aliasCanBeChanged = this.#data.asObservablePart((data) => data?.aliasCanBeChanged); readonly icon = this.#data.asObservablePart((data) => data?.icon || null); readonly sections = this.#data.asObservablePart((data) => data?.sections || []); readonly languages = this.#data.asObservablePart((data) => data?.languages || []); From 1c8f1ebad17ff0c1c97449c297f87c978cddabbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 3 May 2024 10:22:45 +0200 Subject: [PATCH 323/323] fix event call back argument --- .../input-with-alias/input-with-alias.element.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts index fb75b79bdf..0e00a714f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts @@ -30,14 +30,14 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit return this.shadowRoot?.querySelector('uui-input')?.focus(); } - #onNameChange(event: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; + #onNameChange(e: UUIInputEvent) { + if (e instanceof UUIInputEvent) { + const target = e.composedPath()[0] as UUIInputElement; if (typeof target?.value === 'string') { const oldName = this.value; const oldAlias = this.alias ?? ''; - this.value = event.target.value.toString(); + this.value = e.target.value.toString(); if (this.autoGenerateAlias && this._aliasLocked) { // If locked we will update the alias, but only if it matches the generated alias of the old name [NL] const expectedOldAlias = generateAlias(oldName ?? ''); @@ -52,10 +52,11 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit } #onAliasChange(e: UUIInputEvent) { - if (event instanceof UUIInputEvent) { - const target = event.composedPath()[0] as UUIInputElement; + if (e instanceof UUIInputEvent) { + const target = e.composedPath()[0] as UUIInputElement; if (typeof target?.value === 'string') { this.alias = target.value; + console.log(this.alias); this.dispatchEvent(new UmbChangeEvent()); } }