@@ -12,26 +12,29 @@ import {
12
12
when ,
13
13
} from '@umbraco-cms/backoffice/external/lit' ;
14
14
import { simpleHashCode } from '@umbraco-cms/backoffice/observable-api' ;
15
+ import { umbConfirmModal } from '@umbraco-cms/backoffice/modal' ;
15
16
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event' ;
16
17
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element' ;
17
- import { umbConfirmModal } from '@umbraco-cms/backoffice/modal' ;
18
+ import {
19
+ UmbDocumentItemRepository ,
20
+ UmbDocumentUrlRepository ,
21
+ UmbDocumentUrlsDataResolver ,
22
+ } from '@umbraco-cms/backoffice/document' ;
23
+ import { UmbMediaItemRepository , UmbMediaUrlRepository } from '@umbraco-cms/backoffice/media' ;
18
24
import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/router' ;
19
25
import { UmbSorterController } from '@umbraco-cms/backoffice/sorter' ;
20
26
import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui' ;
21
27
import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/router' ;
22
28
import type { UmbVariantId } from '@umbraco-cms/backoffice/variant' ;
23
29
import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui' ;
24
- import { UmbDocumentUrlRepository , UmbDocumentUrlsDataResolver } from '@umbraco-cms/backoffice/document' ;
25
- import { UmbMediaUrlRepository } from '@umbraco-cms/backoffice/media' ;
26
30
27
31
/**
28
32
* @element umb-input-multi-url
29
33
* @fires change - when the value of the input changes
30
34
* @fires blur - when the input loses focus
31
35
* @fires focus - when the input gains focus
32
36
*/
33
- const elementName = 'umb-input-multi-url' ;
34
- @customElement ( elementName )
37
+ @customElement ( 'umb-input-multi-url' )
35
38
export class UmbInputMultiUrlElement extends UUIFormControlMixin ( UmbLitElement , '' ) {
36
39
#sorter = new UmbSorterController < UmbLinkPickerLink > ( this , {
37
40
getUniqueOfElement : ( element ) => {
@@ -131,14 +134,21 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
131
134
this . #urls = [ ...data ] ; // Unfreeze data coming from State, so we can manipulate it.
132
135
super . value = this . #urls. map ( ( x ) => x . url ) . join ( ',' ) ;
133
136
this . #sorter. setModel ( this . #urls) ;
134
- this . #populateLinksUrl ( ) ;
137
+ this . #populateLinksNameAndUrl ( ) ;
135
138
}
136
139
get urls ( ) : Array < UmbLinkPickerLink > {
137
140
return this . #urls;
138
141
}
139
142
140
143
#urls: Array < UmbLinkPickerLink > = [ ] ;
141
144
145
+ #documentItemRepository = new UmbDocumentItemRepository ( this ) ;
146
+ #documentUrlRepository = new UmbDocumentUrlRepository ( this ) ;
147
+ #documentUrlsDataResolver = new UmbDocumentUrlsDataResolver ( this ) ;
148
+
149
+ #mediaItemRepository = new UmbMediaItemRepository ( this ) ;
150
+ #mediaUrlRepository = new UmbMediaUrlRepository ( this ) ;
151
+
142
152
/**
143
153
* Sets the input to readonly mode, meaning value cannot be changed but still able to read and select its content.
144
154
* @type {boolean }
@@ -163,6 +173,9 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
163
173
@state ( )
164
174
private _modalRoute ?: UmbModalRouteBuilder ;
165
175
176
+ @state ( )
177
+ _resolvedLinkNames : Array < { unique : string ; name : string } > = [ ] ;
178
+
166
179
@state ( )
167
180
_resolvedLinkUrls : Array < { unique : string ; url : string } > = [ ] ;
168
181
@@ -235,26 +248,42 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
235
248
} ) ;
236
249
}
237
250
238
- #populateLinksUrl( ) {
239
- // Documents and media have URLs saved in the local link format. Display the actual URL to align with what
240
- // the user sees when they selected it initially.
251
+ #populateLinksNameAndUrl( ) {
252
+ this . _resolvedLinkNames = [ ] ;
253
+ this . _resolvedLinkUrls = [ ] ;
254
+
255
+ // Documents and media have URLs saved in the local link format.
256
+ // Display the actual URL to align with what the user sees when they selected it initially.
241
257
this . #urls. forEach ( async ( link ) => {
242
258
if ( ! link . unique ) return ;
243
259
260
+ let name : string | undefined = undefined ;
244
261
let url : string | undefined = undefined ;
262
+
245
263
switch ( link . type ) {
246
264
case 'document' : {
265
+ if ( ! link . name || link . name . length === 0 ) {
266
+ name = await this . #getNameForDocument( link . unique ) ;
267
+ }
247
268
url = await this . #getUrlForDocument( link . unique ) ;
248
269
break ;
249
270
}
250
271
case 'media' : {
272
+ if ( ! link . name || link . name . length === 0 ) {
273
+ name = await this . #getNameForMedia( link . unique ) ;
274
+ }
251
275
url = await this . #getUrlForMedia( link . unique ) ;
252
276
break ;
253
277
}
254
278
default :
255
279
break ;
256
280
}
257
281
282
+ if ( name ) {
283
+ const resolvedName = { unique : link . unique , name } ;
284
+ this . _resolvedLinkNames = [ ...this . _resolvedLinkNames , resolvedName ] ;
285
+ }
286
+
258
287
if ( url ) {
259
288
const resolvedUrl = { unique : link . unique , url } ;
260
289
this . _resolvedLinkUrls = [ ...this . _resolvedLinkUrls , resolvedUrl ] ;
@@ -263,30 +292,38 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
263
292
}
264
293
265
294
async #getUrlForDocument( unique : string ) {
266
- const documentUrlRepository = new UmbDocumentUrlRepository ( this ) ;
267
- const { data : documentUrlData } = await documentUrlRepository . requestItems ( [ unique ] ) ;
268
- const urlsItem = documentUrlData ?. [ 0 ] ;
269
- const dataResolver = new UmbDocumentUrlsDataResolver ( this ) ;
270
- dataResolver . setData ( urlsItem ?. urls ) ;
271
- const resolvedUrls = await dataResolver . getUrls ( ) ;
295
+ const { data : data } = await this . #documentUrlRepository. requestItems ( [ unique ] ) ;
296
+
297
+ this . #documentUrlsDataResolver. setData ( data ?. [ 0 ] ?. urls ) ;
298
+
299
+ const resolvedUrls = await this . #documentUrlsDataResolver. getUrls ( ) ;
272
300
return resolvedUrls ?. [ 0 ] ?. url ?? '' ;
273
301
}
274
302
275
303
async #getUrlForMedia( unique : string ) {
276
- const mediaUrlRepository = new UmbMediaUrlRepository ( this ) ;
277
- const { data : mediaUrlData } = await mediaUrlRepository . requestItems ( [ unique ] ) ;
278
- return mediaUrlData ?. [ 0 ] . url ?? '' ;
304
+ const { data } = await this . #mediaUrlRepository. requestItems ( [ unique ] ) ;
305
+ return data ?. [ 0 ] . url ?? '' ;
306
+ }
307
+
308
+ async #getNameForDocument( unique : string ) {
309
+ const { data } = await this . #documentItemRepository. requestItems ( [ unique ] ) ;
310
+ return data ?. [ 0 ] ?. name ?? '' ;
279
311
}
280
312
281
- async #requestRemoveItem( index : number ) {
313
+ async #getNameForMedia( unique : string ) {
314
+ const { data } = await this . #mediaItemRepository. requestItems ( [ unique ] ) ;
315
+ return data ?. [ 0 ] ?. name ?? '' ;
316
+ }
317
+
318
+ async #requestRemoveItem( index : number , name ?: string ) {
282
319
const item = this . #urls[ index ] ;
283
320
if ( ! item ) throw new Error ( 'Could not find item at index: ' + index ) ;
284
321
285
322
await umbConfirmModal ( this , {
286
323
color : 'danger' ,
287
- headline : `Remove ${ item . name } ?` ,
288
- content : 'Are you sure you want to remove this item' ,
289
- confirmLabel : 'Remove ' ,
324
+ headline : `Remove ${ name || item . name || 'item' } ?` ,
325
+ content : 'Are you sure you want to remove this item? ' ,
326
+ confirmLabel : '#general_remove ' ,
290
327
} ) ;
291
328
292
329
this . #removeItem( index ) ;
@@ -320,6 +357,17 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
320
357
this . dispatchEvent ( new UmbChangeEvent ( ) ) ;
321
358
}
322
359
360
+ #getResolvedItemName( link : UmbLinkPickerLink ) : string {
361
+ return ( link . name || this . _resolvedLinkNames . find ( ( name ) => name . unique === link . unique ) ?. name ) ?? '' ;
362
+ }
363
+
364
+ #getResolvedItemUrl( link : UmbLinkPickerLink ) : string {
365
+ return (
366
+ ( this . _resolvedLinkUrls . find ( ( url ) => url . unique === link . unique ) ?. url ?? link . url ?? '' ) +
367
+ ( link . queryString || '' )
368
+ ) ;
369
+ }
370
+
323
371
override render ( ) {
324
372
return html `${ this . #renderItems( ) } ${ this . #renderAddButton( ) } ` ;
325
373
}
@@ -356,13 +404,15 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
356
404
#renderItem( link : UmbLinkPickerLink , index : number ) {
357
405
const unique = this . #getUnique( link ) ;
358
406
const href = this . readonly ? undefined : ( this . _modalRoute ?.( { index } ) ?? undefined ) ;
359
- const resolvedUrl = this . _resolvedLinkUrls . find ( ( url ) => url . unique === link . unique ) ?. url ?? '' ;
407
+ const name = this . #getResolvedItemName( link ) ;
408
+ const url = this . #getResolvedItemUrl( link ) ;
409
+
360
410
return html `
361
411
<uui- ref- node
362
412
id= ${ unique }
363
413
href= ${ ifDefined ( href ) }
364
- name= ${ link . name || '' }
365
- detail= ${ resolvedUrl + ( link . queryString || '' ) }
414
+ name= ${ name || url }
415
+ detail= ${ ifDefined ( name ? url : undefined ) }
366
416
?readonly = ${ this . readonly } >
367
417
<umb- icon slot= "icon" name = ${ link . icon || 'icon-link' } > </ umb- icon>
368
418
${ when (
@@ -371,7 +421,7 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
371
421
<uui- action- bar slot= "actions" >
372
422
<uui- butto n
373
423
label= ${ this . localize . term ( 'general_remove' ) }
374
- @click = ${ ( ) => this . #requestRemoveItem( index ) } > </ uui- butto n>
424
+ @click = ${ ( ) => this . #requestRemoveItem( index , name ) } > </ uui- butto n>
375
425
</ uui- action- bar>
376
426
` ,
377
427
) }
@@ -390,6 +440,6 @@ export class UmbInputMultiUrlElement extends UUIFormControlMixin(UmbLitElement,
390
440
391
441
declare global {
392
442
interface HTMLElementTagNameMap {
393
- [ elementName ] : UmbInputMultiUrlElement ;
443
+ 'umb-input-multi-url' : UmbInputMultiUrlElement ;
394
444
}
395
445
}
0 commit comments