@umbraco-cms/backoffice 16.0.0-rc2 → 16.0.0-rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist-cms/custom-elements.json +80 -0
  2. package/dist-cms/packages/block/block/workspace/views/edit/block-workspace-view-edit-properties.element.d.ts +1 -1
  3. package/dist-cms/packages/block/block/workspace/views/edit/block-workspace-view-edit-properties.element.js +7 -7
  4. package/dist-cms/packages/block/block/workspace/views/edit/block-workspace-view-edit-property.element.js +1 -1
  5. package/dist-cms/packages/block/block-type/components/input-block-type/input-block-type.element.js +1 -2
  6. package/dist-cms/packages/clipboard/property/value-translator/copy/clipboard-copy-translator-value-resolver.js +6 -1
  7. package/dist-cms/packages/content/content/controller/merge-content-variant-data.controller.js +1 -0
  8. package/dist-cms/packages/content/content/property-dataset-context/element-property-dataset.context.js +4 -1
  9. package/dist-cms/packages/content/content/workspace/content-detail-workspace-base.js +4 -0
  10. package/dist-cms/packages/content/content/workspace/views/edit/content-editor-properties.element.d.ts +1 -1
  11. package/dist-cms/packages/content/content/workspace/views/edit/content-editor-properties.element.js +7 -7
  12. package/dist-cms/packages/content/content/workspace/views/edit/content-editor-property.element.js +1 -1
  13. package/dist-cms/packages/core/backend-api/types.gen.d.ts +2 -0
  14. package/dist-cms/packages/core/collection/default/collection-default.context.d.ts +1 -0
  15. package/dist-cms/packages/core/collection/default/collection-default.context.js +3 -0
  16. package/dist-cms/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.js +4 -1
  17. package/dist-cms/packages/core/culture/manifests.d.ts +1 -1
  18. package/dist-cms/packages/core/entity-action/common/create/create.action.js +1 -0
  19. package/dist-cms/packages/core/entity-item/entity-item-ref/entity-item-ref.element.d.ts +9 -0
  20. package/dist-cms/packages/core/entity-item/entity-item-ref/entity-item-ref.element.js +80 -2
  21. package/dist-cms/packages/core/picker/search/picker-search-result.element.js +1 -2
  22. package/dist-cms/packages/core/property/manifests.d.ts +1 -1
  23. package/dist-cms/packages/core/property/property-dataset/property-dataset-base-context.js +7 -2
  24. package/dist-cms/packages/core/property/property-guard-manager/variant-property-guard.manager.d.ts +15 -2
  25. package/dist-cms/packages/core/property/property-guard-manager/variant-property-guard.manager.js +22 -15
  26. package/dist-cms/packages/core/property/property-value-cloner/property-value-clone.controller.js +2 -0
  27. package/dist-cms/packages/core/property/property-value-preset/property-value-preset-builder.controller.js +6 -1
  28. package/dist-cms/packages/core/section/section-default.element.js +3 -0
  29. package/dist-cms/packages/core/temporary-file/config/config.repository.d.ts +1 -0
  30. package/dist-cms/packages/core/temporary-file/config/config.repository.js +7 -3
  31. package/dist-cms/packages/core/temporary-file/config/config.server.data-source.js +1 -1
  32. package/dist-cms/packages/core/temporary-file/manifests.d.ts +1 -1
  33. package/dist-cms/packages/core/temporary-file/temporary-file-manager.class.js +15 -4
  34. package/dist-cms/packages/core/themes/manifests.d.ts +1 -1
  35. package/dist-cms/packages/core/utils/media/image-size.function.d.ts +5 -3
  36. package/dist-cms/packages/core/utils/media/image-size.function.js +9 -11
  37. package/dist-cms/packages/core/validation/controllers/bind-server-validation-to-form-control.controller.js +1 -1
  38. package/dist-cms/packages/core/validation/controllers/form-control-validator.controller.js +4 -4
  39. package/dist-cms/packages/core/validation/controllers/validation-path-translation/validation-property-path-translation.controller.js +1 -0
  40. package/dist-cms/packages/core/validation/controllers/validation.controller.js +4 -4
  41. package/dist-cms/packages/core/variant/constants.d.ts +1 -0
  42. package/dist-cms/packages/core/variant/constants.js +1 -0
  43. package/dist-cms/packages/core/variant/context/constants.d.ts +1 -0
  44. package/dist-cms/packages/core/variant/context/constants.js +1 -0
  45. package/dist-cms/packages/core/variant/context/index.d.ts +1 -0
  46. package/dist-cms/packages/core/variant/context/index.js +1 -0
  47. package/dist-cms/packages/core/variant/context/variant.context.d.ts +91 -0
  48. package/dist-cms/packages/core/variant/context/variant.context.js +141 -0
  49. package/dist-cms/packages/core/variant/context/variant.context.token.d.ts +3 -0
  50. package/dist-cms/packages/core/variant/context/variant.context.token.js +2 -0
  51. package/dist-cms/packages/core/variant/index.d.ts +2 -0
  52. package/dist-cms/packages/core/variant/index.js +2 -0
  53. package/dist-cms/packages/core/workspace/info-app/global-components/workspace-info-app-layout.element.js +0 -4
  54. package/dist-cms/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.js +4 -1
  55. package/dist-cms/packages/data-type/constants.d.ts +1 -0
  56. package/dist-cms/packages/data-type/constants.js +1 -0
  57. package/dist-cms/packages/data-type/search/constants.d.ts +2 -0
  58. package/dist-cms/packages/data-type/search/constants.js +2 -0
  59. package/dist-cms/packages/data-type/search/global-search/constants.d.ts +1 -0
  60. package/dist-cms/packages/data-type/search/global-search/constants.js +1 -0
  61. package/dist-cms/packages/data-type/search/global-search/manifests.d.ts +1 -0
  62. package/dist-cms/packages/data-type/search/global-search/manifests.js +22 -0
  63. package/dist-cms/packages/data-type/search/manifests.js +2 -0
  64. package/dist-cms/packages/dictionary/search/constants.d.ts +1 -0
  65. package/dist-cms/packages/dictionary/search/constants.js +1 -0
  66. package/dist-cms/packages/dictionary/search/global-search/constants.d.ts +1 -0
  67. package/dist-cms/packages/dictionary/search/global-search/constants.js +1 -0
  68. package/dist-cms/packages/dictionary/search/global-search/manifests.d.ts +1 -0
  69. package/dist-cms/packages/dictionary/search/global-search/manifests.js +22 -0
  70. package/dist-cms/packages/dictionary/search/manifests.js +2 -0
  71. package/dist-cms/packages/documents/document-types/search/constants.d.ts +1 -0
  72. package/dist-cms/packages/documents/document-types/search/constants.js +1 -0
  73. package/dist-cms/packages/documents/document-types/search/global-search/constants.d.ts +1 -0
  74. package/dist-cms/packages/documents/document-types/search/global-search/constants.js +1 -0
  75. package/dist-cms/packages/documents/document-types/search/global-search/manifests.d.ts +1 -0
  76. package/dist-cms/packages/documents/document-types/search/global-search/manifests.js +22 -0
  77. package/dist-cms/packages/documents/document-types/search/manifests.js +2 -0
  78. package/dist-cms/packages/documents/documents/collection/document-collection.context.d.ts +2 -0
  79. package/dist-cms/packages/documents/documents/collection/document-collection.context.js +23 -0
  80. package/dist-cms/packages/documents/documents/components/input-document/input-document.context.js +4 -0
  81. package/dist-cms/packages/documents/documents/item/document-item-data-resolver.d.ts +2 -2
  82. package/dist-cms/packages/documents/documents/item/document-item-data-resolver.js +55 -68
  83. package/dist-cms/packages/documents/documents/item/document-item-ref.element.d.ts +4 -0
  84. package/dist-cms/packages/documents/documents/item/document-item-ref.element.js +33 -2
  85. package/dist-cms/packages/documents/documents/picker/document-picker-search-result-item.element.d.ts +1 -0
  86. package/dist-cms/packages/documents/documents/picker/document-picker-search-result-item.element.js +14 -8
  87. package/dist-cms/packages/documents/documents/property-dataset-context/document-property-dataset.context.d.ts +0 -1
  88. package/dist-cms/packages/documents/documents/property-dataset-context/document-property-dataset.context.js +0 -42
  89. package/dist-cms/packages/documents/documents/search/constants.d.ts +1 -0
  90. package/dist-cms/packages/documents/documents/search/constants.js +1 -0
  91. package/dist-cms/packages/documents/documents/search/document-search.server.data-source.js +3 -2
  92. package/dist-cms/packages/documents/documents/search/global-search/constants.d.ts +1 -0
  93. package/dist-cms/packages/documents/documents/search/global-search/constants.js +1 -0
  94. package/dist-cms/packages/documents/documents/search/global-search/document-global-search.d.ts +6 -0
  95. package/dist-cms/packages/documents/documents/search/global-search/document-global-search.js +15 -0
  96. package/dist-cms/packages/documents/documents/search/global-search/manifests.d.ts +1 -0
  97. package/dist-cms/packages/documents/documents/search/global-search/manifests.js +23 -0
  98. package/dist-cms/packages/documents/documents/search/manifests.js +2 -0
  99. package/dist-cms/packages/documents/documents/search/types.d.ts +1 -0
  100. package/dist-cms/packages/documents/documents/url/document-urls-data-resolver.d.ts +37 -0
  101. package/dist-cms/packages/documents/documents/url/document-urls-data-resolver.js +78 -0
  102. package/dist-cms/packages/documents/documents/url/index.d.ts +1 -0
  103. package/dist-cms/packages/documents/documents/url/index.js +1 -0
  104. package/dist-cms/packages/documents/documents/url/info-app/document-links-workspace-info-app.element.d.ts +0 -1
  105. package/dist-cms/packages/documents/documents/url/info-app/document-links-workspace-info-app.element.js +29 -24
  106. package/dist-cms/packages/documents/documents/url/repository/types.d.ts +1 -1
  107. package/dist-cms/packages/documents/documents/workspace/document-workspace.context.js +29 -0
  108. package/dist-cms/packages/language/global-contexts/app-language.context.js +14 -12
  109. package/dist-cms/packages/markdown-editor/components/input-markdown-editor/input-markdown.element.js +3 -0
  110. package/dist-cms/packages/media/media/components/input-media/input-media.context.js +4 -0
  111. package/dist-cms/packages/media/media/constants.d.ts +1 -1
  112. package/dist-cms/packages/media/media/constants.js +1 -1
  113. package/dist-cms/packages/media/media/modals/media-picker/media-picker-modal.element.js +8 -0
  114. package/dist-cms/packages/media/media/search/constants.d.ts +1 -0
  115. package/dist-cms/packages/media/media/search/constants.js +1 -0
  116. package/dist-cms/packages/media/media/search/global-search/constants.d.ts +1 -0
  117. package/dist-cms/packages/media/media/search/global-search/constants.js +1 -0
  118. package/dist-cms/packages/media/media/search/global-search/manifests.d.ts +1 -0
  119. package/dist-cms/packages/media/media/search/global-search/manifests.js +23 -0
  120. package/dist-cms/packages/media/media/search/global-search/media-global-search.d.ts +15 -0
  121. package/dist-cms/packages/media/media/search/global-search/media-global-search.js +15 -0
  122. package/dist-cms/packages/media/media/search/manifests.js +2 -0
  123. package/dist-cms/packages/media/media/search/media-search.server.data-source.js +3 -2
  124. package/dist-cms/packages/media/media/search/types.d.ts +1 -0
  125. package/dist-cms/packages/media/media-types/constants.d.ts +1 -0
  126. package/dist-cms/packages/media/media-types/constants.js +1 -0
  127. package/dist-cms/packages/media/media-types/search/constants.d.ts +2 -0
  128. package/dist-cms/packages/media/media-types/search/constants.js +2 -0
  129. package/dist-cms/packages/media/media-types/search/global-search/constants.d.ts +1 -0
  130. package/dist-cms/packages/media/media-types/search/global-search/constants.js +1 -0
  131. package/dist-cms/packages/media/media-types/search/global-search/manifests.d.ts +1 -0
  132. package/dist-cms/packages/media/media-types/search/global-search/manifests.js +22 -0
  133. package/dist-cms/packages/media/media-types/search/manifests.js +4 -1
  134. package/dist-cms/packages/members/member/search/constants.d.ts +1 -0
  135. package/dist-cms/packages/members/member/search/constants.js +1 -0
  136. package/dist-cms/packages/members/member/search/global-search/constants.d.ts +1 -0
  137. package/dist-cms/packages/members/member/search/global-search/constants.js +1 -0
  138. package/dist-cms/packages/members/member/search/global-search/manifests.d.ts +1 -0
  139. package/dist-cms/packages/members/member/search/global-search/manifests.js +22 -0
  140. package/dist-cms/packages/members/member/search/manifests.js +2 -0
  141. package/dist-cms/packages/members/member-type/constants.d.ts +1 -0
  142. package/dist-cms/packages/members/member-type/constants.js +1 -0
  143. package/dist-cms/packages/members/member-type/search/constants.d.ts +2 -0
  144. package/dist-cms/packages/members/member-type/search/constants.js +2 -0
  145. package/dist-cms/packages/members/member-type/search/global-search/constants.d.ts +1 -0
  146. package/dist-cms/packages/members/member-type/search/global-search/constants.js +1 -0
  147. package/dist-cms/packages/members/member-type/search/global-search/manifests.d.ts +1 -0
  148. package/dist-cms/packages/members/member-type/search/global-search/manifests.js +22 -0
  149. package/dist-cms/packages/members/member-type/search/manifests.js +4 -1
  150. package/dist-cms/packages/multi-url-picker/components/input-multi-url/input-multi-url.element.d.ts +4 -0
  151. package/dist-cms/packages/multi-url-picker/components/input-multi-url/input-multi-url.element.js +48 -1
  152. package/dist-cms/packages/multi-url-picker/link-picker-modal/link-picker-modal.element.d.ts +2 -2
  153. package/dist-cms/packages/multi-url-picker/link-picker-modal/link-picker-modal.element.js +95 -34
  154. package/dist-cms/packages/relations/relations/reference/workspace-info-app/entity-references-workspace-view-info.element.js +6 -1
  155. package/dist-cms/packages/search/global-search/global-search-base.d.ts +11 -0
  156. package/dist-cms/packages/search/global-search/global-search-base.js +49 -0
  157. package/dist-cms/packages/search/global-search/global-search.extension.d.ts +15 -0
  158. package/dist-cms/packages/search/global-search/global-search.extension.js +1 -0
  159. package/dist-cms/packages/search/global-search/index.d.ts +1 -0
  160. package/dist-cms/packages/search/global-search/index.js +1 -0
  161. package/dist-cms/packages/search/global-search/types.d.ts +4 -0
  162. package/dist-cms/packages/search/global-search/types.js +1 -0
  163. package/dist-cms/packages/search/index.d.ts +1 -0
  164. package/dist-cms/packages/search/index.js +1 -0
  165. package/dist-cms/packages/search/search-modal/search-modal.element.d.ts +4 -4
  166. package/dist-cms/packages/search/search-modal/search-modal.element.js +40 -29
  167. package/dist-cms/packages/search/types.d.ts +1 -0
  168. package/dist-cms/packages/sysinfo/components/sysinfo.element.js +49 -9
  169. package/dist-cms/packages/sysinfo/repository/sysinfo.repository.d.ts +3 -0
  170. package/dist-cms/packages/sysinfo/repository/sysinfo.repository.js +8 -0
  171. package/dist-cms/packages/templating/templates/constants.d.ts +1 -0
  172. package/dist-cms/packages/templating/templates/constants.js +1 -0
  173. package/dist-cms/packages/templating/templates/search/constants.d.ts +2 -0
  174. package/dist-cms/packages/templating/templates/search/constants.js +2 -0
  175. package/dist-cms/packages/templating/templates/search/global-search/constants.d.ts +1 -0
  176. package/dist-cms/packages/templating/templates/search/global-search/constants.js +1 -0
  177. package/dist-cms/packages/templating/templates/search/global-search/manifests.d.ts +1 -0
  178. package/dist-cms/packages/templating/templates/search/global-search/manifests.js +22 -0
  179. package/dist-cms/packages/templating/templates/search/manifests.js +4 -1
  180. package/dist-cms/packages/tiptap/extensions/core/media-upload.tiptap-api.d.ts +6 -1
  181. package/dist-cms/packages/tiptap/extensions/core/media-upload.tiptap-api.js +16 -6
  182. package/dist-cms/packages/tiptap/extensions/toolbar/media-picker.tiptap-toolbar-api.d.ts +6 -1
  183. package/dist-cms/packages/tiptap/extensions/toolbar/media-picker.tiptap-toolbar-api.js +27 -6
  184. package/dist-cms/packages/user/current-user/action/current-user-app-button.element.d.ts +1 -1
  185. package/dist-cms/packages/user/current-user/action/current-user-app-button.element.js +4 -8
  186. package/dist-cms/packages/user/current-user/current-user-action.extension.d.ts +0 -11
  187. package/dist-cms/packages/user/current-user/external-login/manifests.js +0 -1
  188. package/dist-cms/packages/user/current-user/mfa-login/manifests.js +0 -1
  189. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  190. package/dist-cms/umbraco-package-schema.json +147 -0
  191. package/dist-cms/umbraco-package.json +1 -1
  192. package/dist-cms/vscode-html-custom-data.json +48 -8
  193. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export const UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.MemberType';
@@ -0,0 +1 @@
1
+ export declare const manifests: Array<UmbExtensionManifest>;
@@ -0,0 +1,22 @@
1
+ import { UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
2
+ import { UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS } from './constants.js';
3
+ import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
4
+ import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
5
+ export const manifests = [
6
+ {
7
+ name: 'Member Type Global Search',
8
+ alias: UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS,
9
+ type: 'globalSearch',
10
+ weight: 200,
11
+ meta: {
12
+ label: 'Member Types',
13
+ searchProviderAlias: UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS,
14
+ },
15
+ conditions: [
16
+ {
17
+ alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
18
+ match: UMB_SETTINGS_SECTION_ALIAS,
19
+ },
20
+ ],
21
+ },
22
+ ];
@@ -1,8 +1,10 @@
1
1
  import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../entity.js';
2
+ import { UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS } from './constants.js';
3
+ import { manifests as globalSearchManifests } from './global-search/manifests.js';
2
4
  export const manifests = [
3
5
  {
4
6
  name: 'Member Type Search Provider',
5
- alias: 'Umb.SearchProvider.MemberType',
7
+ alias: UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS,
6
8
  type: 'searchProvider',
7
9
  api: () => import('./member-type.search-provider.js'),
8
10
  weight: 200,
@@ -16,4 +18,5 @@ export const manifests = [
16
18
  type: 'searchResultItem',
17
19
  forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE],
18
20
  },
21
+ ...globalSearchManifests,
19
22
  ];
@@ -70,6 +70,10 @@ export declare class UmbInputMultiUrlElement extends UmbInputMultiUrlElement_bas
70
70
  get readonly(): boolean;
71
71
  set readonly(value: boolean);
72
72
  private _modalRoute?;
73
+ _resolvedLinkUrls: Array<{
74
+ unique: string;
75
+ url: string;
76
+ }>;
73
77
  constructor();
74
78
  render(): import("lit-html").TemplateResult<1>;
75
79
  static styles: import("lit").CSSResult[];
@@ -13,6 +13,8 @@ import { umbConfirmModal } from '@umbraco-cms/backoffice/modal';
13
13
  import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/router';
14
14
  import { UmbSorterController } from '@umbraco-cms/backoffice/sorter';
15
15
  import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui';
16
+ import { UmbDocumentUrlRepository, UmbDocumentUrlsDataResolver } from '@umbraco-cms/backoffice/document';
17
+ import { UmbMediaUrlRepository } from '@umbraco-cms/backoffice/media';
16
18
  /**
17
19
  * @element umb-input-multi-url
18
20
  * @fires change - when the value of the input changes
@@ -46,6 +48,7 @@ let UmbInputMultiUrlElement = class UmbInputMultiUrlElement extends UUIFormContr
46
48
  this.#urls = [...data]; // Unfreeze data coming from State, so we can manipulate it.
47
49
  super.value = this.#urls.map((x) => x.url).join(',');
48
50
  this.#sorter.setModel(this.#urls);
51
+ this.#populateLinksUrl();
49
52
  }
50
53
  get urls() {
51
54
  return this.#urls;
@@ -104,6 +107,7 @@ let UmbInputMultiUrlElement = class UmbInputMultiUrlElement extends UUIFormContr
104
107
  this.maxMessage = 'This field exceeds the allowed amount of items';
105
108
  this.#urls = [];
106
109
  this.#readonly = false;
110
+ this._resolvedLinkUrls = [];
107
111
  this.addValidator('rangeUnderflow', () => this.minMessage, () => !!this.min && this.urls.length < this.min);
108
112
  this.addValidator('rangeOverflow', () => this.maxMessage, () => !!this.max && this.urls.length > this.max);
109
113
  this.#linkPickerModal = new UmbModalRouteRegistrationController(this, UMB_LINK_PICKER_MODAL)
@@ -160,6 +164,45 @@ let UmbInputMultiUrlElement = class UmbInputMultiUrlElement extends UUIFormContr
160
164
  this._modalRoute = routeBuilder;
161
165
  });
162
166
  }
167
+ #populateLinksUrl() {
168
+ // Documents and media have URLs saved in the local link format. Display the actual URL to align with what
169
+ // the user sees when they selected it initially.
170
+ this.#urls.forEach(async (link) => {
171
+ if (!link.unique)
172
+ return;
173
+ let url = undefined;
174
+ switch (link.type) {
175
+ case 'document': {
176
+ url = await this.#getUrlForDocument(link.unique);
177
+ break;
178
+ }
179
+ case 'media': {
180
+ url = await this.#getUrlForMedia(link.unique);
181
+ break;
182
+ }
183
+ default:
184
+ break;
185
+ }
186
+ if (url) {
187
+ const resolvedUrl = { unique: link.unique, url };
188
+ this._resolvedLinkUrls = [...this._resolvedLinkUrls, resolvedUrl];
189
+ }
190
+ });
191
+ }
192
+ async #getUrlForDocument(unique) {
193
+ const documentUrlRepository = new UmbDocumentUrlRepository(this);
194
+ const { data: documentUrlData } = await documentUrlRepository.requestItems([unique]);
195
+ const urlsItem = documentUrlData?.[0];
196
+ const dataResolver = new UmbDocumentUrlsDataResolver(this);
197
+ dataResolver.setData(urlsItem?.urls);
198
+ const resolvedUrls = await dataResolver.getUrls();
199
+ return resolvedUrls?.[0]?.url ?? '';
200
+ }
201
+ async #getUrlForMedia(unique) {
202
+ const mediaUrlRepository = new UmbMediaUrlRepository(this);
203
+ const { data: mediaUrlData } = await mediaUrlRepository.requestItems([unique]);
204
+ return mediaUrlData?.[0].url ?? '';
205
+ }
163
206
  async #requestRemoveItem(index) {
164
207
  const item = this.#urls[index];
165
208
  if (!item)
@@ -227,12 +270,13 @@ let UmbInputMultiUrlElement = class UmbInputMultiUrlElement extends UUIFormContr
227
270
  #renderItem(link, index) {
228
271
  const unique = this.#getUnique(link);
229
272
  const href = this.readonly ? undefined : (this._modalRoute?.({ index }) ?? undefined);
273
+ const resolvedUrl = this._resolvedLinkUrls.find((url) => url.unique === link.unique)?.url ?? '';
230
274
  return html `
231
275
  <uui-ref-node
232
276
  id=${unique}
233
277
  href=${ifDefined(href)}
234
278
  name=${link.name || ''}
235
- detail=${(link.url || '') + (link.queryString || '')}
279
+ detail=${resolvedUrl + (link.queryString || '')}
236
280
  ?readonly=${this.readonly}>
237
281
  <umb-icon slot="icon" name=${link.icon || 'icon-link'}></umb-icon>
238
282
  ${when(!this.readonly, () => html `
@@ -288,6 +332,9 @@ __decorate([
288
332
  __decorate([
289
333
  state()
290
334
  ], UmbInputMultiUrlElement.prototype, "_modalRoute", void 0);
335
+ __decorate([
336
+ state()
337
+ ], UmbInputMultiUrlElement.prototype, "_resolvedLinkUrls", void 0);
291
338
  UmbInputMultiUrlElement = __decorate([
292
339
  customElement(elementName)
293
340
  ], UmbInputMultiUrlElement);
@@ -4,11 +4,11 @@ export declare class UmbLinkPickerModalElement extends UmbModalBaseElement<UmbLi
4
4
  #private;
5
5
  private _allowedMediaTypeUniques?;
6
6
  private _config;
7
+ private _missingLinkUrl;
7
8
  private _documentPickerElement?;
8
9
  private _mediaPickerElement?;
9
- private _linkAnchorInput?;
10
+ constructor();
10
11
  connectedCallback(): void;
11
- protected firstUpdated(): void;
12
12
  populateLinkUrl(): Promise<void>;
13
13
  render(): import("lit-html").TemplateResult<1>;
14
14
  static styles: import("lit").CSSResult[];
@@ -6,22 +6,68 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { css, customElement, html, nothing, query, state, when } from '@umbraco-cms/backoffice/external/lit';
8
8
  import { isUmbracoFolder, UmbMediaTypeStructureRepository } from '@umbraco-cms/backoffice/media-type';
9
- import { umbBindToValidation, UmbValidationContext } from '@umbraco-cms/backoffice/validation';
9
+ import { UMB_VALIDATION_CONTEXT, umbBindToValidation, UmbObserveValidationStateController, UmbValidationContext, } from '@umbraco-cms/backoffice/validation';
10
10
  import { umbConfirmModal, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
11
- import { UmbDocumentDetailRepository, UmbDocumentUrlRepository } from '@umbraco-cms/backoffice/document';
12
- import { UmbMediaDetailRepository, UmbMediaUrlRepository } from '@umbraco-cms/backoffice/media';
11
+ import { UmbDocumentItemDataResolver, UmbDocumentItemRepository, UmbDocumentUrlRepository, UmbDocumentUrlsDataResolver, } from '@umbraco-cms/backoffice/document';
12
+ import { UmbMediaItemRepository, UmbMediaUrlRepository } from '@umbraco-cms/backoffice/media';
13
+ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
14
+ import { umbFocus } from '@umbraco-cms/backoffice/lit-element';
15
+ class UmbLinkPickerValueValidator extends UmbControllerBase {
16
+ #context;
17
+ #isValid = true;
18
+ get isValid() {
19
+ return this.#isValid;
20
+ }
21
+ #value;
22
+ #unique = 'UmbLinkPickerValueValidator';
23
+ setValue(value) {
24
+ this.#value = value;
25
+ this.validate();
26
+ }
27
+ getValue() {
28
+ return this.#value;
29
+ }
30
+ // The path to the data that this validator is validating.
31
+ #dataPath;
32
+ constructor(host, dataPath) {
33
+ super(host);
34
+ this.#dataPath = dataPath;
35
+ this.consumeContext(UMB_VALIDATION_CONTEXT, (context) => {
36
+ if (this.#context) {
37
+ this.#context.removeValidator(this);
38
+ }
39
+ this.#context = context;
40
+ context?.addValidator(this);
41
+ });
42
+ }
43
+ async validate() {
44
+ this.#isValid = !!this.getValue();
45
+ if (this.#isValid) {
46
+ this.#context?.messages.removeMessageByKey(this.#unique);
47
+ }
48
+ else {
49
+ this.#context?.messages.addMessage('client', this.#dataPath, '#linkPicker_modalAnchorValidationMessage', this.#unique);
50
+ }
51
+ }
52
+ reset() { }
53
+ focusFirstInvalidElement() { }
54
+ }
13
55
  let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModalBaseElement {
56
+ #propertyLayoutOrientation;
57
+ #validationContext;
14
58
  constructor() {
15
- super(...arguments);
59
+ super();
16
60
  this.#propertyLayoutOrientation = 'vertical';
17
61
  this.#validationContext = new UmbValidationContext(this);
18
62
  this._config = {
19
63
  hideAnchor: false,
20
64
  hideTarget: false,
21
65
  };
66
+ this._missingLinkUrl = false;
67
+ new UmbObserveValidationStateController(this, '$.type', (invalid) => {
68
+ this._missingLinkUrl = invalid;
69
+ });
22
70
  }
23
- #propertyLayoutOrientation;
24
- #validationContext;
25
71
  connectedCallback() {
26
72
  super.connectedCallback();
27
73
  if (this.data?.config) {
@@ -36,9 +82,10 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
36
82
  }
37
83
  this.#getMediaTypes();
38
84
  this.populateLinkUrl();
39
- }
40
- firstUpdated() {
41
- this._linkAnchorInput?.addValidator('valueMissing', () => this.localize.term('linkPicker_modalAnchorValidationMessage'), () => !this.value.link.name && !this.value.link.queryString);
85
+ const validator = new UmbLinkPickerValueValidator(this, '$.type');
86
+ this.observe(this.modalContext?.value, (value) => {
87
+ validator.setValue(value?.link.type);
88
+ });
42
89
  }
43
90
  async #getMediaTypes() {
44
91
  // Get all the media types, excluding the folders, so that files are selectable media items.
@@ -50,7 +97,7 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
50
97
  async populateLinkUrl() {
51
98
  // Documents and media have URLs saved in the local link format. Display the actual URL to align with what
52
99
  // the user sees when they selected it initially.
53
- if (!this.value.link?.unique || this.value.link?.url?.indexOf('localLink') === -1)
100
+ if (!this.value.link?.unique)
54
101
  return;
55
102
  let url = undefined;
56
103
  switch (this.value.link.type) {
@@ -120,21 +167,25 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
120
167
  if (unique) {
121
168
  switch (type) {
122
169
  case 'document': {
123
- const documentRepository = new UmbDocumentDetailRepository(this);
124
- const { data: documentData } = await documentRepository.requestByUnique(unique);
125
- if (documentData) {
126
- icon = documentData.documentType.icon;
127
- name = documentData.variants[0].name;
170
+ const documentRepository = new UmbDocumentItemRepository(this);
171
+ const { data: documentItems } = await documentRepository.requestItems([unique]);
172
+ const documentItem = documentItems?.[0];
173
+ if (documentItem) {
174
+ const itemDataResolver = new UmbDocumentItemDataResolver(this);
175
+ itemDataResolver.setData(documentItem);
176
+ icon = await itemDataResolver.getIcon();
177
+ name = await itemDataResolver.getName();
128
178
  url = await this.#getUrlForDocument(unique);
129
179
  }
130
180
  break;
131
181
  }
132
182
  case 'media': {
133
- const mediaRepository = new UmbMediaDetailRepository(this);
134
- const { data: mediaData } = await mediaRepository.requestByUnique(unique);
135
- if (mediaData) {
136
- icon = mediaData.mediaType.icon;
137
- name = mediaData.variants[0].name;
183
+ const mediaRepository = new UmbMediaItemRepository(this);
184
+ const { data: mediaData } = await mediaRepository.requestItems([unique]);
185
+ const mediaItem = mediaData?.[0];
186
+ if (mediaItem) {
187
+ icon = mediaItem.mediaType.icon;
188
+ name = mediaItem.variants[0].name;
138
189
  url = await this.#getUrlForMedia(unique);
139
190
  }
140
191
  break;
@@ -142,6 +193,10 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
142
193
  default:
143
194
  break;
144
195
  }
196
+ // The selection was removed
197
+ }
198
+ else {
199
+ this.#resetUrl();
145
200
  }
146
201
  const link = {
147
202
  icon,
@@ -156,7 +211,11 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
156
211
  async #getUrlForDocument(unique) {
157
212
  const documentUrlRepository = new UmbDocumentUrlRepository(this);
158
213
  const { data: documentUrlData } = await documentUrlRepository.requestItems([unique]);
159
- return documentUrlData && documentUrlData[0].urls.length > 0 ? (documentUrlData?.[0].urls[0].url ?? '') : '';
214
+ const urlsItem = documentUrlData?.[0];
215
+ const dataResolver = new UmbDocumentUrlsDataResolver(this);
216
+ dataResolver.setData(urlsItem?.urls);
217
+ const resolvedUrls = await dataResolver.getUrls();
218
+ return resolvedUrls?.[0]?.url ?? '';
160
219
  }
161
220
  async #getUrlForMedia(unique) {
162
221
  const mediaUrlRepository = new UmbMediaUrlRepository(this);
@@ -172,6 +231,9 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
172
231
  confirmLabel: this.localize.term('linkPicker_resetUrlLabel'),
173
232
  });
174
233
  }
234
+ this.#resetUrl();
235
+ }
236
+ #resetUrl() {
175
237
  this.#partialUpdateLink({ type: null, url: null });
176
238
  }
177
239
  async #onSubmit() {
@@ -190,7 +252,7 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
190
252
  render() {
191
253
  return html `
192
254
  <umb-body-layout
193
- headline=${this.localize.term(this.modalContext?.data.isNew ? 'defaultdialogs_addLink' : 'defaultdialogs_updateLink')}>
255
+ headline=${this.localize.term(this.modalContext?.data?.isNew ? 'defaultdialogs_addLink' : 'defaultdialogs_updateLink')}>
194
256
  <uui-box>
195
257
  ${this.#renderLinkType()} ${this.#renderLinkAnchorInput()} ${this.#renderLinkTitleInput()}
196
258
  ${this.#renderLinkTargetInput()}
@@ -200,8 +262,7 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
200
262
  <uui-button
201
263
  color="positive"
202
264
  look="primary"
203
- label=${this.localize.term(this.modalContext?.data.isNew ? 'general_add' : 'general_update')}
204
- ?disabled=${!this.value.link.type}
265
+ label=${this.localize.term(this.modalContext?.data?.isNew ? 'general_add' : 'general_update')}
205
266
  @click=${this.#onSubmit}></uui-button>
206
267
  </div>
207
268
  </umb-body-layout>
@@ -212,7 +273,8 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
212
273
  <umb-property-layout
213
274
  orientation=${this.#propertyLayoutOrientation}
214
275
  label=${this.localize.term('linkPicker_modalSource')}
215
- mandatory>
276
+ mandatory
277
+ ?invalid=${this._missingLinkUrl}>
216
278
  <div slot="editor">
217
279
  ${this.#renderLinkTypeSelection()} ${this.#renderDocumentPicker()} ${this.#renderMediaPicker()}
218
280
  ${this.#renderLinkUrlInput()} ${this.#renderLinkUrlInputReadOnly()}
@@ -273,9 +335,10 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
273
335
  placeholder=${this.localize.term('placeholders_enterUrl')}
274
336
  .value=${this.value.link.url ?? ''}
275
337
  ?disabled=${!!this.value.link.unique}
276
- ?required=${this._config.hideAnchor}
277
- @change=${this.#onLinkUrlInput}
278
- ${umbBindToValidation(this)}>
338
+ required
339
+ @input=${this.#onLinkUrlInput}
340
+ ${umbBindToValidation(this)}
341
+ ${umbFocus()}>
279
342
  ${when(!this.value.link.unique, () => html `
280
343
  <div slot="append">
281
344
  <uui-button
@@ -305,12 +368,10 @@ let UmbLinkPickerModalElement = class UmbLinkPickerModalElement extends UmbModal
305
368
  <uui-input
306
369
  data-mark="input:anchor"
307
370
  slot="editor"
308
- id="link-anchor"
309
371
  label=${this.localize.term('placeholders_anchor')}
310
372
  placeholder=${this.localize.term('placeholders_anchor')}
311
373
  .value=${this.value.link.queryString ?? ''}
312
- @change=${this.#onLinkAnchorInput}
313
- ${umbBindToValidation(this)}></uui-input>
374
+ @change=${this.#onLinkAnchorInput}></uui-input>
314
375
  </umb-property-layout>
315
376
  `;
316
377
  }
@@ -371,15 +432,15 @@ __decorate([
371
432
  __decorate([
372
433
  state()
373
434
  ], UmbLinkPickerModalElement.prototype, "_config", void 0);
435
+ __decorate([
436
+ state()
437
+ ], UmbLinkPickerModalElement.prototype, "_missingLinkUrl", void 0);
374
438
  __decorate([
375
439
  query('umb-input-document')
376
440
  ], UmbLinkPickerModalElement.prototype, "_documentPickerElement", void 0);
377
441
  __decorate([
378
442
  query('umb-input-media')
379
443
  ], UmbLinkPickerModalElement.prototype, "_mediaPickerElement", void 0);
380
- __decorate([
381
- query('#link-anchor', true)
382
- ], UmbLinkPickerModalElement.prototype, "_linkAnchorInput", void 0);
383
444
  UmbLinkPickerModalElement = __decorate([
384
445
  customElement('umb-link-picker-modal')
385
446
  ], UmbLinkPickerModalElement);
@@ -78,7 +78,7 @@ let UmbEntityReferencesWorkspaceInfoAppElement = class UmbEntityReferencesWorksp
78
78
  return nothing;
79
79
  return html `
80
80
  <umb-workspace-info-app-layout headline="#references_labelUsedByItems">
81
- ${this.#renderItems()} ${this.#renderReferencePagination()}
81
+ <div id="content">${this.#renderItems()} ${this.#renderReferencePagination()}</div>
82
82
  </umb-workspace-info-app-layout>
83
83
  `;
84
84
  }
@@ -110,6 +110,11 @@ let UmbEntityReferencesWorkspaceInfoAppElement = class UmbEntityReferencesWorksp
110
110
  display: contents;
111
111
  }
112
112
 
113
+ #content {
114
+ display: block;
115
+ padding: var(--uui-size-space-3) var(--uui-size-space-4);
116
+ }
117
+
113
118
  .pagination-container {
114
119
  display: flex;
115
120
  justify-content: center;
@@ -0,0 +1,11 @@
1
+ import type { ManifestGlobalSearch, UmbGlobalSearchApi, UmbSearchProvider, UmbSearchRequestArgs } from '../types.js';
2
+ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
3
+ export declare abstract class UmbGlobalSearchBase<SearchProviderType extends UmbSearchProvider = UmbSearchProvider> extends UmbControllerBase implements UmbGlobalSearchApi {
4
+ #private;
5
+ protected _manifest?: ManifestGlobalSearch;
6
+ protected _searchProvider?: SearchProviderType;
7
+ protected _init: Promise<void>;
8
+ set manifest(manifest: ManifestGlobalSearch | undefined);
9
+ get manifest(): ManifestGlobalSearch | undefined;
10
+ search(args: UmbSearchRequestArgs): Promise<import("@umbraco-cms/backoffice/repository").UmbRepositoryResponse<import("@umbraco-cms/backoffice/repository").UmbPagedModel<import("../types.js").UmbSearchResultItemModel>>>;
11
+ }
@@ -0,0 +1,49 @@
1
+ import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api';
2
+ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
3
+ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
4
+ export class UmbGlobalSearchBase extends UmbControllerBase {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.#initialized = false;
8
+ this._init = new Promise((resolve) => {
9
+ if (this.#initialized) {
10
+ resolve();
11
+ }
12
+ else {
13
+ this.#initResolver = resolve;
14
+ }
15
+ });
16
+ }
17
+ #initResolver;
18
+ #initialized;
19
+ #checkIfInitialized() {
20
+ if (this._searchProvider) {
21
+ this.#initialized = true;
22
+ this.#initResolver?.();
23
+ }
24
+ }
25
+ set manifest(manifest) {
26
+ if (this._manifest === manifest)
27
+ return;
28
+ this._manifest = manifest;
29
+ this.#observeSearchProvider(this._manifest?.meta.searchProviderAlias);
30
+ }
31
+ get manifest() {
32
+ return this._manifest;
33
+ }
34
+ #observeSearchProvider(alias) {
35
+ if (!alias)
36
+ throw new Error('Search provider alias is required');
37
+ new UmbExtensionApiInitializer(this, umbExtensionsRegistry, alias, [this], (permitted, ctrl) => {
38
+ this._searchProvider = permitted ? ctrl.api : undefined;
39
+ this.#checkIfInitialized();
40
+ });
41
+ }
42
+ async search(args) {
43
+ await this._init;
44
+ if (!this._searchProvider) {
45
+ throw new Error('Search provider is not available');
46
+ }
47
+ return await this._searchProvider.search({ query: args.query });
48
+ }
49
+ }
@@ -0,0 +1,15 @@
1
+ import type { UmbGlobalSearchApi } from './types.js';
2
+ import type { ManifestWithDynamicConditions, ManifestApi } from '@umbraco-cms/backoffice/extension-api';
3
+ export interface ManifestGlobalSearch extends ManifestApi<UmbGlobalSearchApi>, ManifestWithDynamicConditions<UmbExtensionConditionConfig> {
4
+ type: 'globalSearch';
5
+ meta: MetaGlobalSearch;
6
+ }
7
+ export interface MetaGlobalSearch {
8
+ label: string;
9
+ searchProviderAlias: string;
10
+ }
11
+ declare global {
12
+ interface UmbExtensionManifestMap {
13
+ umbGlobalSearch: ManifestGlobalSearch;
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ export * from './global-search-base.js';
@@ -0,0 +1 @@
1
+ export * from './global-search-base.js';
@@ -0,0 +1,4 @@
1
+ import type { UmbSearchProvider, UmbSearchRequestArgs, UmbSearchResultItemModel } from '../types.js';
2
+ export interface UmbGlobalSearchApi<SearchResultItemType extends UmbSearchResultItemModel = UmbSearchResultItemModel, SearchRequestArgsType extends UmbSearchRequestArgs = UmbSearchRequestArgs> extends UmbSearchProvider<SearchResultItemType, SearchRequestArgsType> {
3
+ }
4
+ export type * from './global-search.extension.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1,3 @@
1
1
  export * from './constants.js';
2
+ export * from './global-search/index.js';
2
3
  export type * from './types.js';
@@ -1 +1,2 @@
1
1
  export * from './constants.js';
2
+ export * from './global-search/index.js';
@@ -2,9 +2,9 @@ import type { UmbSearchProvider, UmbSearchResultItemModel } from '../types.js';
2
2
  import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
3
3
  import type { UmbModalContext } from '@umbraco-cms/backoffice/modal';
4
4
  import '../search-result/search-result-item.element.js';
5
- type SearchProvider = {
5
+ type GlobalSearchers = {
6
6
  name: string;
7
- api: UmbSearchProvider<UmbSearchResultItemModel>;
7
+ api?: UmbSearchProvider<UmbSearchResultItemModel>;
8
8
  alias: string;
9
9
  };
10
10
  export declare class UmbSearchModalElement extends UmbLitElement {
@@ -14,8 +14,8 @@ export declare class UmbSearchModalElement extends UmbLitElement {
14
14
  modalContext?: UmbModalContext;
15
15
  private _search;
16
16
  private _searchResults;
17
- private _searchProviders;
18
- _currentProvider?: SearchProvider;
17
+ private _globalSearchers;
18
+ _currentGlobalSearcher?: GlobalSearchers;
19
19
  _loading: boolean;
20
20
  constructor();
21
21
  connectedCallback(): void;