Skip to content

Commit e8d4634

Browse files
Hotfix: Don't request urls every time the document name updates (#17710)
* split observables so we don't request url when variantsOptions changes * clean up events + debounce requests * add loading state * clear lookup before requesting new urls
1 parent 9f9aaa6 commit e8d4634

File tree

1 file changed

+79
-15
lines changed

1 file changed

+79
-15
lines changed

src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-links.element.ts

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context
33
import type { UmbDocumentVariantOptionModel } from '../../../types.js';
44
import { css, customElement, html, map, nothing, state, when } from '@umbraco-cms/backoffice/external/lit';
55
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
6+
import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action';
67
import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action';
78
import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action';
89
import { observeMultiple } from '@umbraco-cms/backoffice/observable-api';
910
import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api';
11+
import { debounce } from '@umbraco-cms/backoffice/utils';
1012

1113
@customElement('umb-document-workspace-view-info-links')
1214
export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement {
@@ -24,37 +26,58 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement {
2426
@state()
2527
private _lookup: Record<string, string[]> = {};
2628

29+
@state()
30+
private _loading = false;
31+
32+
#documentWorkspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE;
33+
#eventContext?: typeof UMB_ACTION_EVENT_CONTEXT.TYPE;
34+
2735
constructor() {
2836
super();
2937

3038
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (context) => {
31-
context.addEventListener(UmbRequestReloadStructureForEntityEvent.TYPE, () => {
32-
this.#requestUrls();
33-
});
39+
this.#eventContext = context;
40+
41+
this.#eventContext.removeEventListener(
42+
UmbRequestReloadStructureForEntityEvent.TYPE,
43+
this.#onReloadRequest as unknown as EventListener,
44+
);
45+
46+
this.#eventContext.addEventListener(
47+
UmbRequestReloadStructureForEntityEvent.TYPE,
48+
this.#onReloadRequest as unknown as EventListener,
49+
);
3450
});
3551

3652
this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => {
37-
this.observe(
38-
observeMultiple([context.isNew, context.unique, context.variantOptions]),
39-
([isNew, unique, variantOptions]) => {
40-
if (!unique) return;
41-
this._isNew = isNew === true;
53+
this.#documentWorkspaceContext = context;
54+
this.observe(observeMultiple([context.isNew, context.unique]), ([isNew, unique]) => {
55+
if (!unique) return;
56+
this._isNew = isNew === true;
57+
58+
if (unique !== this._unique) {
4259
this._unique = unique;
43-
this._variantOptions = variantOptions;
4460
this.#requestUrls();
45-
},
46-
);
61+
}
62+
});
63+
64+
this.observe(context.variantOptions, (variantOptions) => (this._variantOptions = variantOptions));
4765
});
4866
}
4967

5068
async #requestUrls() {
5169
if (this._isNew) return;
5270
if (!this._unique) return;
5371

72+
this._loading = true;
73+
this._lookup = {};
74+
5475
const { data } = await this.#documentUrlRepository.requestItems([this._unique]);
5576

5677
if (data?.length) {
57-
data[0].urls.forEach((item) => {
78+
const item = data[0];
79+
80+
item.urls.forEach((item) => {
5881
if (item.culture && item.url) {
5982
if (this._lookup[item.culture] == null) {
6083
this._lookup[item.culture] = [];
@@ -64,6 +87,8 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement {
6487
});
6588
this.requestUpdate('_lookup');
6689
}
90+
91+
this._loading = false;
6792
}
6893

6994
#getStateLocalizationKey(variantOption: UmbDocumentVariantOptionModel) {
@@ -81,18 +106,41 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement {
81106
}
82107
}
83108

109+
#debounceRequestUrls = debounce(() => this.#requestUrls(), 50);
110+
111+
#onReloadRequest = (event: UmbEntityActionEvent) => {
112+
// TODO: Introduce "Published Event". We only need to update the url when the document is published.
113+
if (event.getUnique() !== this.#documentWorkspaceContext?.getUnique()) return;
114+
if (event.getEntityType() !== this.#documentWorkspaceContext.getEntityType()) return;
115+
this.#debounceRequestUrls();
116+
};
117+
84118
override render() {
85119
return html`
86120
<uui-box headline=${this.localize.term('general_links')}>
87121
${when(
88-
this._isNew,
89-
() => this.#renderNotCreated(),
90-
() => this.#renderUrls(),
122+
this._loading,
123+
() => this.#renderLoading(),
124+
() => this.#renderContent(),
91125
)}
92126
</uui-box>
93127
`;
94128
}
95129

130+
#renderLoading() {
131+
return html`<div id="loader-container"><uui-loader></uui-loader></div>`;
132+
}
133+
134+
#renderContent() {
135+
return html`
136+
${when(
137+
this._isNew,
138+
() => this.#renderNotCreated(),
139+
() => this.#renderUrls(),
140+
)}
141+
`;
142+
}
143+
96144
#renderNotCreated() {
97145
return html`
98146
<div class="link-item">
@@ -136,12 +184,28 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement {
136184
);
137185
}
138186

187+
override disconnectedCallback(): void {
188+
super.disconnectedCallback();
189+
190+
this.#eventContext?.removeEventListener(
191+
UmbRequestReloadStructureForEntityEvent.TYPE,
192+
this.#onReloadRequest as unknown as EventListener,
193+
);
194+
}
195+
139196
static override styles = [
140197
css`
141198
uui-box {
142199
--uui-box-default-padding: 0;
143200
}
144201
202+
#loader-container {
203+
display: flex;
204+
justify-content: center;
205+
align-items: center;
206+
padding: var(--uui-size-space-2);
207+
}
208+
145209
.link-item {
146210
display: flex;
147211
justify-content: space-between;

0 commit comments

Comments
 (0)