@@ -3,10 +3,12 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context
33import type { UmbDocumentVariantOptionModel } from '../../../types.js' ;
44import { css , customElement , html , map , nothing , state , when } from '@umbraco-cms/backoffice/external/lit' ;
55import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element' ;
6+ import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action' ;
67import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action' ;
78import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action' ;
89import { observeMultiple } from '@umbraco-cms/backoffice/observable-api' ;
910import { 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' )
1214export 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