@umbraco-cms/backoffice 17.4.0-rc → 17.4.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 (322) hide show
  1. package/custom-elements.json +1 -1
  2. package/dist-cms/apps/app/app.element.js +120 -7
  3. package/dist-cms/apps/backoffice/backoffice.context.js +1 -9
  4. package/dist-cms/apps/backoffice/backoffice.element.d.ts +0 -2
  5. package/dist-cms/apps/backoffice/backoffice.element.js +0 -58
  6. package/dist-cms/apps/backoffice/components/backoffice-main.element.d.ts +2 -2
  7. package/dist-cms/apps/backoffice/components/backoffice-main.element.js +16 -3
  8. package/dist-cms/apps/installer/consent/installer-consent.element.js +5 -1
  9. package/dist-cms/external/uui/package.json +2 -2
  10. package/dist-cms/libs/extension-api/controller/base-extension-initializer.controller.d.ts +1 -1
  11. package/dist-cms/libs/extension-api/controller/base-extension-initializer.controller.js +61 -19
  12. package/dist-cms/libs/extension-api/controller/extension-api-initializer.controller.d.ts +1 -1
  13. package/dist-cms/libs/extension-api/controller/extension-api-initializer.controller.js +10 -3
  14. package/dist-cms/libs/extension-api/controller/extension-element-and-api-initializer.controller.d.ts +1 -1
  15. package/dist-cms/libs/extension-api/controller/extension-element-and-api-initializer.controller.js +12 -3
  16. package/dist-cms/libs/extension-api/controller/extension-element-initializer.controller.d.ts +1 -1
  17. package/dist-cms/libs/extension-api/controller/extension-element-initializer.controller.js +11 -3
  18. package/dist-cms/libs/extension-api/controller/extension-manifest-initializer.controller.d.ts +1 -1
  19. package/dist-cms/libs/extension-api/controller/extension-manifest-initializer.controller.js +1 -1
  20. package/dist-cms/libs/extension-api/initializers/extension-initializer-base.d.ts +2 -2
  21. package/dist-cms/libs/extension-api/initializers/extension-initializer-base.js +7 -3
  22. package/dist-cms/libs/extension-api/registry/extension.registry.js +22 -2
  23. package/dist-cms/libs/localization-api/localization.controller.d.ts +13 -0
  24. package/dist-cms/libs/localization-api/localization.controller.js +21 -0
  25. package/dist-cms/packages/block/block/conditions/block-workspace-is-readonly.condition.js +4 -2
  26. package/dist-cms/packages/block/block/context/block-entry.context.js +1 -4
  27. package/dist-cms/packages/block/block/workspace/block-element-manager.js +2 -2
  28. package/dist-cms/packages/block/block/workspace/block-workspace-editor.element.d.ts +1 -0
  29. package/dist-cms/packages/block/block/workspace/block-workspace-editor.element.js +31 -9
  30. package/dist-cms/packages/block/block/workspace/block-workspace-language-access.controller.d.ts +16 -0
  31. package/dist-cms/packages/block/block/workspace/block-workspace-language-access.controller.js +126 -0
  32. package/dist-cms/packages/block/block/workspace/block-workspace.context.js +23 -19
  33. package/dist-cms/packages/block/block/workspace/manifests.js +3 -0
  34. package/dist-cms/packages/block/block-custom-view/types.d.ts +1 -0
  35. package/dist-cms/packages/block/block-grid/components/block-grid-entries/block-grid-entries.element.d.ts +1 -1
  36. package/dist-cms/packages/block/block-grid/components/block-grid-entry/block-grid-entry.element.js +4 -5
  37. package/dist-cms/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.js +2 -5
  38. package/dist-cms/packages/block/block-list/components/block-list-entry/block-list-entry.element.js +11 -6
  39. package/dist-cms/packages/block/block-rte/components/block-rte-entry/block-rte-entry.element.js +4 -5
  40. package/dist-cms/packages/block/block-single/components/block-single-entry/block-single-entry.element.js +4 -5
  41. package/dist-cms/packages/code-editor/umbraco-package.d.ts +1 -0
  42. package/dist-cms/packages/code-editor/umbraco-package.js +1 -0
  43. package/dist-cms/packages/content/content/global-components/content-workspace-property.element.js +1 -1
  44. package/dist-cms/packages/content/content/rollback/modal/content-rollback-modal.element.js +2 -2
  45. package/dist-cms/packages/content/content-type/repository/structure/content-type-structure-server-data-source-base.d.ts +1 -1
  46. package/dist-cms/packages/core/auth/auth.context.d.ts +16 -7
  47. package/dist-cms/packages/core/auth/auth.context.js +91 -65
  48. package/dist-cms/packages/core/components/body-layout/body-layout.element.js +3 -1
  49. package/dist-cms/packages/core/components/input-number-range/input-number-range.element.d.ts +1 -1
  50. package/dist-cms/packages/core/components/input-toggle/input-toggle.element.d.ts +1 -1
  51. package/dist-cms/packages/core/components/multiple-color-picker-input/multiple-color-picker-input.element.d.ts +1 -1
  52. package/dist-cms/packages/core/components/multiple-color-picker-input/multiple-color-picker-item-input.element.d.ts +1 -1
  53. package/dist-cms/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.d.ts +1 -1
  54. package/dist-cms/packages/core/culture/components/input-culture-select/input-culture-select.element.d.ts +1 -1
  55. package/dist-cms/packages/core/culture/manifests.d.ts +1 -1
  56. package/dist-cms/packages/core/entity-action/common/delete/delete.action.js +2 -1
  57. package/dist-cms/packages/core/entity-item/item-data-api-get-request-controller/item-data-api-get-request.controller.d.ts +1 -1
  58. package/dist-cms/packages/core/extension/picker-data-source/extension.picker-data-source.d.ts +1 -1
  59. package/dist-cms/packages/core/extension-registry/conditions/condition-base.controller.js +3 -2
  60. package/dist-cms/packages/core/extension-registry/conditions/delay.condition.js +5 -1
  61. package/dist-cms/packages/core/extension-registry/conditions/switch.condition.d.ts +0 -2
  62. package/dist-cms/packages/core/extension-registry/conditions/switch.condition.js +13 -7
  63. package/dist-cms/packages/core/hint/context/hint.context-token.d.ts +1 -1
  64. package/dist-cms/packages/core/http-client/index.d.ts +32 -0
  65. package/dist-cms/packages/core/http-client/index.js +1 -0
  66. package/dist-cms/packages/core/modal/common/confirm/confirm-modal.element.js +2 -4
  67. package/dist-cms/packages/core/modal/common/info/info-modal.element.js +2 -4
  68. package/dist-cms/packages/core/object-type/input-object-type.element.d.ts +1 -1
  69. package/dist-cms/packages/core/object-type/object-type.repository.d.ts +1 -1
  70. package/dist-cms/packages/core/property/manifests.d.ts +1 -1
  71. package/dist-cms/packages/core/property/property-guard-manager/property-guard.manager.d.ts +1 -1
  72. package/dist-cms/packages/core/property/property-guard-manager/property-guard.manager.js +6 -3
  73. package/dist-cms/packages/core/property/property-guard-manager/variant-property-guard.manager.d.ts +1 -1
  74. package/dist-cms/packages/core/property/property-guard-manager/variant-property-guard.manager.js +7 -3
  75. package/dist-cms/packages/core/property-editor-data-source/input/input-property-editor-data-source.element.d.ts +1 -1
  76. package/dist-cms/packages/core/recycle-bin/conditions/is-trashed/entity-is-trashed.condition.js +2 -1
  77. package/dist-cms/packages/core/recycle-bin/entity-action/trash/trash.action.js +2 -1
  78. package/dist-cms/packages/core/recycle-bin/recycle-bin-repository-base.d.ts +1 -1
  79. package/dist-cms/packages/core/repository/data-mapper/mapping/data-mapping-resolver.js +1 -0
  80. package/dist-cms/packages/core/repository/detail/detail-repository-base.d.ts +2 -2
  81. package/dist-cms/packages/core/repository/item/item-repository-base.d.ts +1 -1
  82. package/dist-cms/packages/core/repository/item/item-server-data-source-base.d.ts +1 -1
  83. package/dist-cms/packages/core/server-file-system/rename/rename-server-file-repository-base.d.ts +1 -1
  84. package/dist-cms/packages/core/temporary-file/manifests.d.ts +1 -1
  85. package/dist-cms/packages/core/themes/manifests.d.ts +1 -1
  86. package/dist-cms/packages/core/tree/data/tree-repository-base.d.ts +2 -2
  87. package/dist-cms/packages/core/tree/data/tree-server-data-source-base.d.ts +3 -3
  88. package/dist-cms/packages/core/utils/guard-manager/guard.manager.base.d.ts +4 -2
  89. package/dist-cms/packages/core/utils/guard-manager/guard.manager.base.js +10 -5
  90. package/dist-cms/packages/core/utils/guard-manager/readonly-guard.manager.js +9 -5
  91. package/dist-cms/packages/core/utils/guard-manager/readonly-variant-guard.manager.d.ts +12 -2
  92. package/dist-cms/packages/core/utils/guard-manager/readonly-variant-guard.manager.js +26 -11
  93. package/dist-cms/packages/core/variant/variant-id.class.d.ts +4 -0
  94. package/dist-cms/packages/core/variant/variant-id.class.js +5 -1
  95. package/dist-cms/packages/core/view/context/view.controller.d.ts +1 -1
  96. package/dist-cms/packages/core/workspace/components/workspace-action/common/submit/submit.action.d.ts +2 -2
  97. package/dist-cms/packages/core/workspace/components/workspace-action/common/submit/submit.action.js +8 -2
  98. package/dist-cms/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.js +7 -10
  99. package/dist-cms/packages/core/workspace/namable/name-write-guard.manager.js +5 -2
  100. package/dist-cms/packages/core/workspace/workspace.element.d.ts +0 -2
  101. package/dist-cms/packages/core/workspace/workspace.element.js +1 -4
  102. package/dist-cms/packages/data-type/collection/repository/data-type-collection.repository.d.ts +1 -1
  103. package/dist-cms/packages/data-type/collection/repository/data-type-collection.server.data-source.d.ts +1 -1
  104. package/dist-cms/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.d.ts +1 -1
  105. package/dist-cms/packages/data-type/components/data-type-input/data-type-input.element.d.ts +1 -1
  106. package/dist-cms/packages/data-type/entity-actions/conditions/manifests.d.ts +1 -1
  107. package/dist-cms/packages/data-type/entity-actions/duplicate/repository/data-type-duplicate.repository.d.ts +1 -1
  108. package/dist-cms/packages/data-type/entity-actions/move-to/repository/data-type-move.repository.d.ts +1 -1
  109. package/dist-cms/packages/data-type/repository/detail/server-data-source/data-type-detail.server.data-source.d.ts +4 -4
  110. package/dist-cms/packages/data-type/repository/item/data-type-item.server.data-source.d.ts +1 -1
  111. package/dist-cms/packages/data-type/search/data-type-search.repository.d.ts +1 -1
  112. package/dist-cms/packages/data-type/search/data-type-search.server.data-source.d.ts +1 -1
  113. package/dist-cms/packages/data-type/search/data-type.search-provider.d.ts +1 -1
  114. package/dist-cms/packages/data-type/tree/folder/repository/data-type-folder.server.data-source.d.ts +3 -3
  115. package/dist-cms/packages/data-type/tree/server-data-source/data-type-tree.server.data-source.d.ts +1 -1
  116. package/dist-cms/packages/dictionary/collection/repository/dictionary-collection.server.data-source.d.ts +1 -1
  117. package/dist-cms/packages/dictionary/entity-action/move-to/repository/dictionary-move.repository.d.ts +1 -1
  118. package/dist-cms/packages/dictionary/repository/detail/dictionary-detail.server.data-source.d.ts +3 -3
  119. package/dist-cms/packages/dictionary/repository/export/dictionary-export.repository.d.ts +1 -1
  120. package/dist-cms/packages/dictionary/repository/export/dictionary-export.server.data-source.d.ts +1 -1
  121. package/dist-cms/packages/dictionary/repository/import/dictionary-import.repository.d.ts +1 -1
  122. package/dist-cms/packages/dictionary/repository/item/dictionary-item.server.data-source.d.ts +1 -1
  123. package/dist-cms/packages/dictionary/search/dictionary-search.repository.d.ts +1 -1
  124. package/dist-cms/packages/dictionary/search/dictionary-search.server.data-source.d.ts +1 -1
  125. package/dist-cms/packages/dictionary/search/dictionary.search-provider.d.ts +1 -1
  126. package/dist-cms/packages/documents/document-blueprints/audit-log/repository/document-blueprint-audit-log.repository.d.ts +1 -1
  127. package/dist-cms/packages/documents/document-blueprints/audit-log/repository/document-blueprint-audit-log.server.data-source.d.ts +1 -1
  128. package/dist-cms/packages/documents/document-blueprints/entity-actions/move-to/repository/document-blueprint-move.repository.d.ts +1 -1
  129. package/dist-cms/packages/documents/document-blueprints/repository/item/document-blueprint-item.repository.d.ts +1 -1
  130. package/dist-cms/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.d.ts +2 -2
  131. package/dist-cms/packages/documents/document-blueprints/tree/folder/repository/document-blueprint-folder.server.data-source.d.ts +3 -3
  132. package/dist-cms/packages/documents/document-blueprints/tree/server-data-source/document-blueprint-tree.server.data-source.d.ts +1 -1
  133. package/dist-cms/packages/documents/document-types/entity-actions/duplicate/repository/document-type-duplicate.repository.d.ts +1 -1
  134. package/dist-cms/packages/documents/document-types/entity-actions/export/repository/document-type-export.repository.d.ts +1 -1
  135. package/dist-cms/packages/documents/document-types/entity-actions/export/repository/document-type-export.server.data-source.d.ts +1 -1
  136. package/dist-cms/packages/documents/document-types/entity-actions/import/repository/document-type-import.repository.d.ts +1 -1
  137. package/dist-cms/packages/documents/document-types/entity-actions/move-to/repository/document-type-move.repository.d.ts +1 -1
  138. package/dist-cms/packages/documents/document-types/property-type/manifests.js +2 -1
  139. package/dist-cms/packages/documents/document-types/repository/composition/document-type-composition.repository.d.ts +2 -2
  140. package/dist-cms/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.d.ts +2 -2
  141. package/dist-cms/packages/documents/document-types/repository/detail/server-data-source/document-type-detail.server.data-source.d.ts +4 -4
  142. package/dist-cms/packages/documents/document-types/repository/item/document-type-item.server.data-source.d.ts +1 -1
  143. package/dist-cms/packages/documents/document-types/repository/template/document-type-template.server.data-source.d.ts +1 -1
  144. package/dist-cms/packages/documents/document-types/search/document-type-search.repository.d.ts +1 -1
  145. package/dist-cms/packages/documents/document-types/search/document-type-search.server.data-source.d.ts +1 -1
  146. package/dist-cms/packages/documents/document-types/search/document-type.search-provider.d.ts +1 -1
  147. package/dist-cms/packages/documents/document-types/tree/folder/repository/document-type-folder.server.data-source.d.ts +3 -3
  148. package/dist-cms/packages/documents/document-types/tree/server-data-source/document-type.tree.server.data-source.d.ts +1 -1
  149. package/dist-cms/packages/documents/documents/audit-log/repository/document-audit-log.repository.d.ts +1 -1
  150. package/dist-cms/packages/documents/documents/audit-log/repository/document-audit-log.server.data-source.d.ts +1 -1
  151. package/dist-cms/packages/documents/documents/collection/repository/document-collection.repository.d.ts +1 -1
  152. package/dist-cms/packages/documents/documents/collection/repository/document-collection.server.data-source.d.ts +1 -1
  153. package/dist-cms/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.d.ts +1 -1
  154. package/dist-cms/packages/documents/documents/entity-actions/duplicate/repository/document-duplicate.repository.d.ts +1 -1
  155. package/dist-cms/packages/documents/documents/entity-actions/move-to/repository/document-move.repository.d.ts +1 -1
  156. package/dist-cms/packages/documents/documents/entity-actions/notifications/repository/document-notifications.repository.d.ts +2 -2
  157. package/dist-cms/packages/documents/documents/item/repository/document-item.server.data-source.d.ts +1 -1
  158. package/dist-cms/packages/documents/documents/publishing/repository/document-publishing.repository.d.ts +1 -1
  159. package/dist-cms/packages/documents/documents/publishing/repository/document-publishing.server.data-source.d.ts +1 -1
  160. package/dist-cms/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.d.ts +1 -1
  161. package/dist-cms/packages/documents/documents/reference/repository/manifests.js +2 -1
  162. package/dist-cms/packages/documents/documents/repository/detail/document-detail.server.data-source.d.ts +3 -3
  163. package/dist-cms/packages/documents/documents/rollback/modal/rollback-modal.element.js +2 -2
  164. package/dist-cms/packages/documents/documents/search/document-search.server.data-source.d.ts +1 -1
  165. package/dist-cms/packages/documents/documents/tree/server-data-source/document-tree.server.data-source.d.ts +1 -1
  166. package/dist-cms/packages/documents/documents/url/repository/document-url.server.data-source.d.ts +1 -1
  167. package/dist-cms/packages/documents/documents/user-permissions/document/input-document-granular-user-permission/input-document-granular-user-permission.element.d.ts +1 -1
  168. package/dist-cms/packages/documents/documents/user-permissions/document-property-value/conditions/document-property-value-user-permission.condition.js +2 -0
  169. package/dist-cms/packages/documents/documents/user-permissions/document-property-value/data/manifests.js +4 -2
  170. package/dist-cms/packages/documents/documents/user-permissions/document-property-value/input-document-property-value-user-permission/input-document-property-value-user-permission.element.d.ts +1 -1
  171. package/dist-cms/packages/documents/documents/user-permissions/document-property-value/workspace-context/document-block-property-value-user-permission.workspace-context.js +3 -5
  172. package/dist-cms/packages/documents/documents/workspace/actions/save.action.js +2 -0
  173. package/dist-cms/packages/documents/documents/workspace/document-workspace.context.js +6 -1
  174. package/dist-cms/packages/documents/umbraco-package.d.ts +1 -6
  175. package/dist-cms/packages/documents/umbraco-package.js +2 -8
  176. package/dist-cms/packages/embedded-media/repository/oembed.repository.d.ts +1 -1
  177. package/dist-cms/packages/language/collection/repository/language-collection.server.data-source.d.ts +1 -1
  178. package/dist-cms/packages/language/components/input-language/input-language.element.d.ts +1 -1
  179. package/dist-cms/packages/language/repository/detail/language-detail.server.data-source.d.ts +3 -3
  180. package/dist-cms/packages/language/repository/item/language-item.server.data-source.d.ts +1 -1
  181. package/dist-cms/packages/media/imaging/imaging.server.data.d.ts +1 -1
  182. package/dist-cms/packages/media/media/audit-log/repository/media-audit-log.repository.d.ts +1 -1
  183. package/dist-cms/packages/media/media/audit-log/repository/media-audit-log.server.data-source.d.ts +1 -1
  184. package/dist-cms/packages/media/media/collection/repository/media-collection.repository.d.ts +1 -1
  185. package/dist-cms/packages/media/media/collection/repository/media-collection.server.data-source.d.ts +1 -1
  186. package/dist-cms/packages/media/media/entity-actions/move-to/repository/media-move.repository.d.ts +1 -1
  187. package/dist-cms/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.d.ts +1 -1
  188. package/dist-cms/packages/media/media/reference/repository/manifests.js +2 -1
  189. package/dist-cms/packages/media/media/repository/detail/media-detail.repository.d.ts +3 -3
  190. package/dist-cms/packages/media/media/repository/detail/media-detail.server.data-source.d.ts +3 -3
  191. package/dist-cms/packages/media/media/repository/item/media-item.server.data-source.d.ts +1 -1
  192. package/dist-cms/packages/media/media/search/global-search/media-global-search.d.ts +1 -1
  193. package/dist-cms/packages/media/media/search/media-search.repository.d.ts +1 -1
  194. package/dist-cms/packages/media/media/search/media-search.server.data-source.d.ts +1 -1
  195. package/dist-cms/packages/media/media/search/media.search-provider.d.ts +1 -1
  196. package/dist-cms/packages/media/media/tree/server-data-source/media-tree.server.data-source.d.ts +1 -1
  197. package/dist-cms/packages/media/media/url/repository/media-url.server.data-source.d.ts +1 -1
  198. package/dist-cms/packages/media/media-types/entity-actions/duplicate/repository/media-type-duplicate.repository.d.ts +1 -1
  199. package/dist-cms/packages/media/media-types/entity-actions/export/repository/media-type-export.repository.d.ts +2 -2
  200. package/dist-cms/packages/media/media-types/entity-actions/export/repository/media-type-export.server.data-source.d.ts +1 -1
  201. package/dist-cms/packages/media/media-types/entity-actions/import/repository/media-type-import.repository.d.ts +1 -1
  202. package/dist-cms/packages/media/media-types/entity-actions/move-to/repository/media-type-move.repository.d.ts +1 -1
  203. package/dist-cms/packages/media/media-types/property-type/manifests.js +2 -1
  204. package/dist-cms/packages/media/media-types/repository/composition/media-type-composition.repository.d.ts +2 -2
  205. package/dist-cms/packages/media/media-types/repository/composition/media-type-composition.server.data-source.d.ts +2 -2
  206. package/dist-cms/packages/media/media-types/repository/detail/media-type-detail.server.data-source.d.ts +4 -4
  207. package/dist-cms/packages/media/media-types/repository/item/media-type-item.server.data-source.d.ts +1 -1
  208. package/dist-cms/packages/media/media-types/repository/structure/media-type-structure.repository.d.ts +1 -1
  209. package/dist-cms/packages/media/media-types/repository/structure/media-type-structure.server.data-source.d.ts +1 -1
  210. package/dist-cms/packages/media/media-types/search/media-type-search.repository.d.ts +1 -1
  211. package/dist-cms/packages/media/media-types/search/media-type-search.server.data-source.d.ts +1 -1
  212. package/dist-cms/packages/media/media-types/search/media-type.search-provider.d.ts +1 -1
  213. package/dist-cms/packages/media/media-types/tree/folder/repository/media-type-folder.server.data-source.d.ts +3 -3
  214. package/dist-cms/packages/media/media-types/tree/server-data-source/media-type.tree.server.data-source.d.ts +1 -1
  215. package/dist-cms/packages/members/member/collection/repository/member-collection.repository.d.ts +1 -1
  216. package/dist-cms/packages/members/member/collection/repository/member-collection.server.data-source.d.ts +1 -1
  217. package/dist-cms/packages/members/member/item/repository/member-item.server.data-source.d.ts +1 -1
  218. package/dist-cms/packages/members/member/reference/repository/manifests.js +2 -1
  219. package/dist-cms/packages/members/member/repository/detail/member-detail.server.data-source.d.ts +3 -3
  220. package/dist-cms/packages/members/member/search/member-search.repository.d.ts +1 -1
  221. package/dist-cms/packages/members/member/search/member-search.server.data-source.d.ts +1 -1
  222. package/dist-cms/packages/members/member/search/member.search-provider.d.ts +1 -1
  223. package/dist-cms/packages/members/member-group/collection/repository/member-group-collection.server.data-source.d.ts +1 -1
  224. package/dist-cms/packages/members/member-group/repository/detail/member-group-detail.server.data-source.d.ts +3 -3
  225. package/dist-cms/packages/members/member-group/repository/item/member-group-item.server.data-source.d.ts +1 -1
  226. package/dist-cms/packages/members/member-public-access/repository/public-access.repository.d.ts +4 -4
  227. package/dist-cms/packages/members/member-type/entity-actions/duplicate/repository/member-type-duplicate.repository.d.ts +1 -1
  228. package/dist-cms/packages/members/member-type/entity-actions/export/repository/member-type-export.repository.d.ts +2 -2
  229. package/dist-cms/packages/members/member-type/entity-actions/export/repository/member-type-export.server.data-source.d.ts +1 -1
  230. package/dist-cms/packages/members/member-type/entity-actions/import/repository/member-type-import.repository.d.ts +1 -1
  231. package/dist-cms/packages/members/member-type/entity-actions/move-to/repository/member-type-move.repository.d.ts +1 -1
  232. package/dist-cms/packages/members/member-type/property-type/manifests.js +2 -1
  233. package/dist-cms/packages/members/member-type/repository/composition/member-type-composition.repository.d.ts +2 -2
  234. package/dist-cms/packages/members/member-type/repository/composition/member-type-composition.server.data-source.d.ts +2 -2
  235. package/dist-cms/packages/members/member-type/repository/detail/member-type-detail.server.data-source.d.ts +4 -4
  236. package/dist-cms/packages/members/member-type/repository/item/member-type-item.server.data-source.d.ts +1 -1
  237. package/dist-cms/packages/members/member-type/search/member-type-search.repository.d.ts +1 -1
  238. package/dist-cms/packages/members/member-type/search/member-type-search.server.data-source.d.ts +1 -1
  239. package/dist-cms/packages/members/member-type/search/member-type.search-provider.d.ts +1 -1
  240. package/dist-cms/packages/members/member-type/tree/folder/repository/member-type-folder.server.data-source.d.ts +3 -3
  241. package/dist-cms/packages/members/member-type/tree/server-data-source/member-type-tree.server.data-source.d.ts +1 -1
  242. package/dist-cms/packages/packages/package/repository/sources/package.server.data.d.ts +1 -1
  243. package/dist-cms/packages/packages/package-section/views/installed/installed-packages-section-view.element.js +2 -2
  244. package/dist-cms/packages/property-editors/collection/config/column/components/input-collection-content-type-property.element.d.ts +1 -1
  245. package/dist-cms/packages/property-editors/color-picker/property-editor-ui-color-picker.element.js +14 -0
  246. package/dist-cms/packages/property-editors/content-picker/config/source-content/input-content-picker-source.element.d.ts +1 -1
  247. package/dist-cms/packages/property-editors/text-box/property-editor-ui-text-box.element.js +2 -2
  248. package/dist-cms/packages/property-editors/textarea/property-editor-ui-textarea.element.js +2 -2
  249. package/dist-cms/packages/relations/relation-types/collection/repository/relation-type-collection.server.data-source.d.ts +1 -1
  250. package/dist-cms/packages/relations/relation-types/repository/detail/relation-type-detail.repository.d.ts +1 -1
  251. package/dist-cms/packages/relations/relation-types/repository/detail/relation-type-detail.server.data-source.d.ts +1 -1
  252. package/dist-cms/packages/relations/relations/collection/repository/relation-collection.server.data-source.d.ts +1 -1
  253. package/dist-cms/packages/relations/relations/entity-actions/bulk-delete/modal/bulk-delete-with-relation-modal.element.js +7 -3
  254. package/dist-cms/packages/relations/relations/entity-actions/bulk-trash/modal/bulk-trash-with-relation-modal.element.js +8 -6
  255. package/dist-cms/packages/relations/relations/entity-actions/delete/modal/delete-with-relation-modal.element.js +2 -3
  256. package/dist-cms/packages/relations/relations/entity-actions/trash/modal/trash-with-relation-modal.element.js +8 -8
  257. package/dist-cms/packages/rte/components/rte-base.element.d.ts +2 -1
  258. package/dist-cms/packages/rte/components/rte-base.element.js +19 -6
  259. package/dist-cms/packages/segment/collection/repository/segment-collection.server.data-source.d.ts +1 -1
  260. package/dist-cms/packages/static-file/repository/item/static-file-item.server.data-source.d.ts +1 -1
  261. package/dist-cms/packages/tags/components/tags-input/tags-input.element.d.ts +1 -1
  262. package/dist-cms/packages/tags/repository/tag.repository.d.ts +2 -2
  263. package/dist-cms/packages/telemetry/dashboard-telemetry.element.js +5 -1
  264. package/dist-cms/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.d.ts +1 -1
  265. package/dist-cms/packages/templating/partial-views/repository/item/partial-view-item.server.data-source.d.ts +1 -1
  266. package/dist-cms/packages/templating/partial-views/repository/partial-view-detail.server.data-source.d.ts +3 -3
  267. package/dist-cms/packages/templating/partial-views/tree/folder/repository/partial-view-folder.server.data-source.d.ts +2 -2
  268. package/dist-cms/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.d.ts +1 -1
  269. package/dist-cms/packages/templating/scripts/repository/item/script-item.server.data-source.d.ts +1 -1
  270. package/dist-cms/packages/templating/scripts/repository/script-detail.server.data-source.d.ts +3 -3
  271. package/dist-cms/packages/templating/scripts/tree/folder/repository/script-folder.server.data-source.d.ts +2 -2
  272. package/dist-cms/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.d.ts +1 -1
  273. package/dist-cms/packages/templating/stylesheets/global-components/stylesheet-input/stylesheet-input.element.d.ts +1 -1
  274. package/dist-cms/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.d.ts +1 -1
  275. package/dist-cms/packages/templating/stylesheets/repository/stylesheet-detail.server.data-source.d.ts +3 -3
  276. package/dist-cms/packages/templating/stylesheets/tree/folder/repository/stylesheet-folder.server.data-source.d.ts +2 -2
  277. package/dist-cms/packages/templating/templates/global-components/input-template/input-template.element.d.ts +1 -1
  278. package/dist-cms/packages/templating/templates/global-components/template-card/template-card.element.d.ts +1 -1
  279. package/dist-cms/packages/templating/templates/repository/detail/template-detail.server.data-source.d.ts +3 -3
  280. package/dist-cms/packages/templating/templates/repository/item/template-item.server.data-source.d.ts +1 -1
  281. package/dist-cms/packages/templating/templates/search/template-search.repository.d.ts +1 -1
  282. package/dist-cms/packages/templating/templates/search/template-search.server.data-source.d.ts +1 -1
  283. package/dist-cms/packages/templating/templates/search/template.search-provider.d.ts +1 -1
  284. package/dist-cms/packages/templating/templates/tree/server-data-source/template-tree.server.data-source.d.ts +1 -1
  285. package/dist-cms/packages/ufm/umbraco-package.d.ts +1 -0
  286. package/dist-cms/packages/ufm/umbraco-package.js +1 -0
  287. package/dist-cms/packages/user/current-user/current-user.context.d.ts +3 -1
  288. package/dist-cms/packages/user/current-user/current-user.context.js +11 -17
  289. package/dist-cms/packages/user/current-user/repository/current-user.repository.d.ts +6 -6
  290. package/dist-cms/packages/user/current-user/repository/current-user.server.data-source.d.ts +4 -4
  291. package/dist-cms/packages/user/user/client-credential/repository/data-source/user-client-credential.server.data-source.d.ts +2 -2
  292. package/dist-cms/packages/user/user/collection/repository/user-collection.repository.d.ts +1 -1
  293. package/dist-cms/packages/user/user/collection/repository/user-collection.server.data-source.d.ts +1 -1
  294. package/dist-cms/packages/user/user/invite/repository/invite-user-server.data-source.d.ts +1 -1
  295. package/dist-cms/packages/user/user/invite/repository/invite-user.repository.d.ts +2 -2
  296. package/dist-cms/packages/user/user/repository/avatar/user-avatar.repository.d.ts +2 -2
  297. package/dist-cms/packages/user/user/repository/change-password/change-user-password.repository.d.ts +1 -1
  298. package/dist-cms/packages/user/user/repository/detail/user-detail.server.data-source.d.ts +4 -4
  299. package/dist-cms/packages/user/user/repository/disable/disable-user.repository.d.ts +1 -1
  300. package/dist-cms/packages/user/user/repository/enable/enable-user.repository.d.ts +1 -1
  301. package/dist-cms/packages/user/user/repository/item/user-item.server.data-source.d.ts +1 -1
  302. package/dist-cms/packages/user/user/repository/unlock/unlock-user.repository.d.ts +1 -1
  303. package/dist-cms/packages/user/user/repository/user.repository.d.ts +3 -3
  304. package/dist-cms/packages/user/user/workspace/user/user-workspace.context.d.ts +1 -1
  305. package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.repository.d.ts +1 -1
  306. package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.server.data-source.d.ts +1 -1
  307. package/dist-cms/packages/user/user-group/components/input-user-group/user-group-input.element.d.ts +1 -1
  308. package/dist-cms/packages/user/user-group/repository/detail/user-group-detail.server.data-source.d.ts +3 -3
  309. package/dist-cms/packages/user/user-group/repository/item/user-group-item.server.data-source.d.ts +1 -1
  310. package/dist-cms/packages/user/user-group/repository/users/user-group-users.repository.d.ts +1 -1
  311. package/dist-cms/packages/user/user-group/repository/users/user-group-users.server.data-source.d.ts +1 -1
  312. package/dist-cms/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.d.ts +1 -1
  313. package/dist-cms/packages/webhook/webhook/collection/repository/webhook-collection.server.data-source.d.ts +1 -1
  314. package/dist-cms/packages/webhook/webhook/repository/detail/webhook-detail.server.data-source.d.ts +3 -3
  315. package/dist-cms/packages/webhook/webhook/repository/item/webhook-item.server.data-source.d.ts +1 -1
  316. package/dist-cms/packages/webhook/webhook-delivery/collection/repository/webhook-delivery-collection.server.data-source.d.ts +1 -1
  317. package/dist-cms/packages/webhook/webhook-event/repository/webhook-event.repository.d.ts +1 -1
  318. package/dist-cms/packages/webhook/webhook-event/repository/webhook-event.server.data-source.d.ts +1 -1
  319. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  320. package/package.json +3 -3
  321. package/umbraco-package-schema.json +405 -405
  322. package/vscode-html-custom-data.json +3 -3
@@ -56,13 +56,21 @@ export class UmbExtensionElementInitializer extends UmbBaseExtensionInitializer
56
56
  this.#component[key] = this.#properties[key];
57
57
  });
58
58
  };
59
- async _conditionsAreGood() {
59
+ async _conditionsAreGood(signal) {
60
60
  const manifest = this.manifest; // In this case we are sure its not undefined.
61
61
  const newComponent = await createExtensionElement(manifest, this.#defaultElement);
62
- if (!this._isConditionsPositive) {
63
- // We are not positive anymore, so we will back out of this creation.
62
+ if (signal.aborted || !this._isConditionsPositive) {
63
+ if (newComponent && 'destroy' in newComponent) {
64
+ newComponent.destroy();
65
+ }
64
66
  return false;
65
67
  }
68
+ if (this.#component && this.#component !== newComponent) {
69
+ if ('destroy' in this.#component) {
70
+ this.#component.destroy();
71
+ }
72
+ this.#component = undefined;
73
+ }
66
74
  this.#component = newComponent;
67
75
  if (this.#component) {
68
76
  this.#assignProperties();
@@ -13,6 +13,6 @@ import type { UmbControllerHost } from '../../controller-api/index.js';
13
13
  */
14
14
  export declare class UmbExtensionManifestInitializer<ManifestType extends ManifestWithDynamicConditions = ManifestWithDynamicConditions, ControllerType extends UmbBaseExtensionInitializer<ManifestType, any> = any> extends UmbBaseExtensionInitializer<ManifestType, ControllerType> {
15
15
  constructor(host: UmbControllerHost, extensionRegistry: UmbExtensionRegistry<ManifestCondition>, alias: string, onPermissionChanged: (isPermitted: boolean, controller: ControllerType) => void);
16
- protected _conditionsAreGood(): Promise<boolean>;
16
+ protected _conditionsAreGood(_signal: AbortSignal): Promise<boolean>;
17
17
  protected _conditionsAreBad(): Promise<void>;
18
18
  }
@@ -13,7 +13,7 @@ export class UmbExtensionManifestInitializer extends UmbBaseExtensionInitializer
13
13
  super(host, extensionRegistry, 'extManifest_', alias, onPermissionChanged);
14
14
  this._init();
15
15
  }
16
- async _conditionsAreGood() {
16
+ async _conditionsAreGood(_signal) {
17
17
  return true;
18
18
  }
19
19
  async _conditionsAreBad() {
@@ -9,8 +9,8 @@ import type { UmbElement } from '../../element-api/index.js';
9
9
  export declare abstract class UmbExtensionInitializerBase<Key extends string, T extends ManifestBase = SpecificManifestTypeOrManifestBase<UmbExtensionManifest, Key>> extends UmbControllerBase {
10
10
  #private;
11
11
  protected host: UmbElement;
12
- protected extensionRegistry: UmbExtensionRegistry<T, import("../index.js").UmbConditionConfigBase<string>, ManifestBase | T>;
13
- loaded: import("rxjs").Observable<void>;
12
+ protected extensionRegistry: UmbExtensionRegistry<T>;
13
+ loaded: import("rxjs").Observable<boolean | undefined>;
14
14
  constructor(host: UmbElement, extensionRegistry: UmbExtensionRegistry<T>, manifestType: Key);
15
15
  /**
16
16
  * Perform any logic required to instantiate the extension.
@@ -1,15 +1,17 @@
1
1
  import { UmbControllerBase } from '../../class-api/index.js';
2
- import { ReplaySubject } from '../../../external/rxjs/index.js';
2
+ import { UmbBooleanState } from '../../observable-api/index.js';
3
3
  /**
4
4
  * Base class for extension initializers, which are responsible for loading and unloading extensions.
5
5
  */
6
6
  export class UmbExtensionInitializerBase extends UmbControllerBase {
7
7
  #extensionMap;
8
+ // Use the value `undefined`, as that would not resolve a observation promise. [NL]
8
9
  #loaded;
9
10
  constructor(host, extensionRegistry, manifestType) {
10
11
  super(host);
11
12
  this.#extensionMap = new Map();
12
- this.#loaded = new ReplaySubject(1);
13
+ // Use the value `undefined`, as that would not resolve a observation promise. [NL]
14
+ this.#loaded = new UmbBooleanState(undefined);
13
15
  this.loaded = this.#loaded.asObservable();
14
16
  this.host = host;
15
17
  this.extensionRegistry = extensionRegistry;
@@ -26,7 +28,9 @@ export class UmbExtensionInitializerBase extends UmbControllerBase {
26
28
  this.#extensionMap.set(extension.alias, extension);
27
29
  return this.instantiateExtension(extension);
28
30
  }));
29
- this.#loaded.next();
31
+ if (extensions.length > 0) {
32
+ this.#loaded.setValue(true);
33
+ }
30
34
  });
31
35
  }
32
36
  }
@@ -176,8 +176,28 @@ export class UmbExtensionRegistry {
176
176
  * @memberof UmbExtensionRegistry
177
177
  */
178
178
  registerMany(manifests) {
179
- // we have to register extensions individually, so we ensure a manifest is valid before continuing to the next one
180
- manifests.forEach((manifest) => this.register(manifest));
179
+ const toAdd = [];
180
+ for (const manifest of manifests) {
181
+ // TODO: refactor this so this code is not duplicated between this and single extension register
182
+ if (!this.#validateExtension(manifest))
183
+ continue;
184
+ if (manifest.type === 'kind') {
185
+ this.defineKind(manifest);
186
+ continue;
187
+ }
188
+ // TODO: Revisit this, it could use the isExtensionApproved, but this code also checks alias duplication against the toAdd array. [NL]
189
+ if (!this.#acceptExtension(manifest))
190
+ continue;
191
+ const alias = manifest.alias;
192
+ if (this._extensions.getValue().find((e) => e.alias === alias) || toAdd.find((e) => e.alias === alias)) {
193
+ console.error(`Extension with alias ${alias} is already registered`);
194
+ continue;
195
+ }
196
+ toAdd.push(this.#appendAdditionalConditions(manifest));
197
+ }
198
+ if (toAdd.length) {
199
+ this._extensions.setValue([...this._extensions.getValue(), ...toAdd]);
200
+ }
181
201
  }
182
202
  /**
183
203
  * Unregister many extensions with the given aliases.
@@ -132,4 +132,17 @@ export declare class UmbLocalizationController<LocalizationSetType extends UmbLo
132
132
  * @returns {string} The translated text.
133
133
  */
134
134
  string(text: string | undefined, ...args: unknown[]): string;
135
+ /**
136
+ * Like {@link string}, but returns a Lit `unsafeHTML` directive with all arguments escaped via {@link escapeHTML}.
137
+ * Use when the localized value itself contains HTML markup that must be rendered (otherwise prefer {@link string}, which Lit escapes natively).
138
+ * Pass a `#key` to look up a term, or any string for inline replacement.
139
+ * @param {string | undefined} text - text to translate (terms prefixed with `#`).
140
+ * @param {unknown[]} args - arguments to interpolate. Each argument is HTML-escaped before being inserted into the term.
141
+ * @returns {unknown} a Lit directive result that renders the localized HTML safely inline in a Lit template.
142
+ * @example
143
+ * ```ts
144
+ * html`<p>${this.localize.htmlString('#defaultdialogs_confirmdelete', userControlledName)}</p>`
145
+ * ```
146
+ */
147
+ htmlString(text: string | undefined, ...args: unknown[]): import("lit-html/directive.js").DirectiveResult<typeof import("lit-html/directives/unsafe-html.js").UnsafeHTMLDirective>;
135
148
  }
@@ -1,4 +1,6 @@
1
1
  import { umbLocalizationManager } from './localization.manager.js';
2
+ import { unsafeHTML } from '../../external/lit/index.js';
3
+ import { escapeHTML } from '../../packages/core/utils/index.js';
2
4
  const LocalizationControllerAlias = Symbol();
3
5
  /**
4
6
  * The UmbLocalizationController enables localization for your element.
@@ -283,4 +285,23 @@ export class UmbLocalizationController {
283
285
  });
284
286
  return localizedText;
285
287
  }
288
+ /**
289
+ * Like {@link string}, but returns a Lit `unsafeHTML` directive with all arguments escaped via {@link escapeHTML}.
290
+ * Use when the localized value itself contains HTML markup that must be rendered (otherwise prefer {@link string}, which Lit escapes natively).
291
+ * Pass a `#key` to look up a term, or any string for inline replacement.
292
+ * @param {string | undefined} text - text to translate (terms prefixed with `#`).
293
+ * @param {unknown[]} args - arguments to interpolate. Each argument is HTML-escaped before being inserted into the term.
294
+ * @returns {unknown} a Lit directive result that renders the localized HTML safely inline in a Lit template.
295
+ * @example
296
+ * ```ts
297
+ * html`<p>${this.localize.htmlString('#defaultdialogs_confirmdelete', userControlledName)}</p>`
298
+ * ```
299
+ */
300
+ htmlString(text, ...args) {
301
+ // `escapeHTML` short-circuits on non-strings, so we stringify first to also escape values
302
+ // like `{ toString: () => '<script>...' }`. `undefined` is preserved so `string()` can
303
+ // keep the original placeholder unmatched (existing semantics).
304
+ const escapedArgs = args.map((a) => (typeof a === 'undefined' ? a : escapeHTML(String(a))));
305
+ return unsafeHTML(this.string(text, ...escapedArgs));
306
+ }
286
307
  }
@@ -4,9 +4,11 @@ export class UmbBlockWorkspaceIsReadOnlyCondition extends UmbConditionBase {
4
4
  constructor(host, args) {
5
5
  super(host, args);
6
6
  this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (context) => {
7
- this.observe(context?.readOnlyGuard.permitted, (isReadOnly) => {
7
+ this.observe(context?.readOnlyGuard.isPermittedForObservableVariant(context.variantId), (isReadOnly) => {
8
+ // Only react to positives or negatives:
8
9
  if (isReadOnly !== undefined) {
9
- this.permitted = isReadOnly === (this.config.match !== undefined ? this.config.match : true);
10
+ const match = args.config.match ?? true;
11
+ this.permitted = isReadOnly === match;
10
12
  }
11
13
  }, 'observeIsReadOnly');
12
14
  });
@@ -427,14 +427,11 @@ export class UmbBlockEntryContext extends UmbContextBase {
427
427
  return;
428
428
  // TODO: Here is a potential future issue. This is parsing on the read only state of the variant that this is opened from, that is problematic when we enable switching variant within a Block. [NL]
429
429
  // TODO: This could benefit from a more dynamic approach, where we inherit all non-variant and variant scoped states. [NL]
430
- this.observe(
431
- // TODO: Instead transfer all variant states.
432
- this._manager.readOnlyState.isPermittedForObservableVariant(this._variantId), (isReadOnly) => {
430
+ this.observe(this._manager.readOnlyState.permitted, (isReadOnly) => {
433
431
  const unique = 'UMB_BLOCK_MANAGER_CONTEXT';
434
432
  if (isReadOnly) {
435
433
  const rule = {
436
434
  unique,
437
- variantId: this.#variantId.getValue(),
438
435
  };
439
436
  this.readOnlyGuard?.addRule(rule);
440
437
  }
@@ -59,12 +59,12 @@ export class UmbBlockElementManager extends UmbControllerBase {
59
59
  if (id) {
60
60
  this.structure.loadType(id);
61
61
  }
62
- });
62
+ }, null);
63
63
  this.observe(this.unique, (key) => {
64
64
  if (key) {
65
65
  this.validation.setDataPath('$.' + dataPathPropertyName + `[?(@.key == '${key}')]`);
66
66
  }
67
- });
67
+ }, null);
68
68
  this.observe(this.structure.contentTypeDataTypeUniques, (dataTypeUniques) => {
69
69
  this.#dataTypeItemManager.setUniques(dataTypeUniques);
70
70
  }, null);
@@ -2,6 +2,7 @@ import { UmbLitElement } from '../../../core/lit-element/index.js';
2
2
  export declare class UmbBlockWorkspaceEditorElement extends UmbLitElement {
3
3
  constructor();
4
4
  private _headline;
5
+ private _readOnly?;
5
6
  render(): import("lit-html").TemplateResult<1>;
6
7
  static readonly styles: import("lit").CSSResult[];
7
8
  }
@@ -5,25 +5,32 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { UMB_BLOCK_WORKSPACE_CONTEXT } from './index.js';
8
- import { css, customElement, html, state } from '../../../../external/lit/index.js';
8
+ import { css, customElement, html, nothing, state } from '../../../../external/lit/index.js';
9
9
  import { UmbLitElement } from '../../../core/lit-element/index.js';
10
10
  let UmbBlockWorkspaceEditorElement = class UmbBlockWorkspaceEditorElement extends UmbLitElement {
11
11
  constructor() {
12
12
  super();
13
13
  this._headline = '';
14
14
  this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (context) => {
15
- if (context) {
16
- this.observe(context.name, (name) => {
15
+ this.observe(context?.name, (name) => {
16
+ if (name) {
17
17
  this._headline = this.localize.string(name);
18
- }, 'observeOwnerContentElementTypeName');
19
- }
20
- else {
21
- this.removeUmbControllerByAlias('observeOwnerContentElementTypeName');
22
- }
18
+ }
19
+ }, 'observeOwnerContentElementTypeName');
20
+ this.observe(context?.readOnlyGuard.isPermittedForObservableVariant(context.variantId), (isReadOnly) => {
21
+ this._readOnly = isReadOnly;
22
+ }, 'observeIsReadOnly');
23
23
  });
24
24
  }
25
25
  render() {
26
- return html `<umb-workspace-editor headline=${this._headline}></umb-workspace-editor>`;
26
+ return html `<umb-workspace-editor
27
+ ><div slot="header">
28
+ <h3 id="headline" title="${this._headline}" data-mark="layout-headline">${this._headline}</h3>
29
+ ${this._readOnly
30
+ ? html `<uui-tag look="secondary">${this.localize.term('general_readOnly')}</uui-tag>`
31
+ : nothing}
32
+ </div></umb-workspace-editor
33
+ >`;
27
34
  }
28
35
  static { this.styles = [
29
36
  css `
@@ -32,12 +39,27 @@ let UmbBlockWorkspaceEditorElement = class UmbBlockWorkspaceEditorElement extend
32
39
  width: 100%;
33
40
  height: 100%;
34
41
  }
42
+ div {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--uui-size-3);
46
+ }
47
+ #headline {
48
+ display: block;
49
+ white-space: nowrap;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ min-width: 0;
53
+ }
35
54
  `,
36
55
  ]; }
37
56
  };
38
57
  __decorate([
39
58
  state()
40
59
  ], UmbBlockWorkspaceEditorElement.prototype, "_headline", void 0);
60
+ __decorate([
61
+ state()
62
+ ], UmbBlockWorkspaceEditorElement.prototype, "_readOnly", void 0);
41
63
  UmbBlockWorkspaceEditorElement = __decorate([
42
64
  customElement('umb-block-workspace-editor')
43
65
  ], UmbBlockWorkspaceEditorElement);
@@ -0,0 +1,16 @@
1
+ import type { UmbControllerHost } from '../../../../libs/controller-api/index.js';
2
+ import { UmbControllerBase } from '../../../../libs/class-api/index.js';
3
+ /**
4
+ * Configures the read-only state of a Block Workspace based on the parent Block Manager
5
+ * and the current user's language access.
6
+ *
7
+ * - For invariant blocks, the workspace inherits the read-only state of the parent Block Manager(Host Property).
8
+ * - For variant blocks (with a culture), the workspace is editable only when the current user
9
+ * has access to that culture (either via `hasAccessToAllLanguages` or an entry in their
10
+ * allowed languages).
11
+ */
12
+ export declare class UmbBlockLanguageAccessWorkspaceController extends UmbControllerBase {
13
+ #private;
14
+ constructor(host: UmbControllerHost);
15
+ }
16
+ export { UmbBlockLanguageAccessWorkspaceController as api };
@@ -0,0 +1,126 @@
1
+ import { UMB_BLOCK_MANAGER_CONTEXT } from '../context/block-manager.context-token.js';
2
+ import { UMB_BLOCK_WORKSPACE_CONTEXT } from './block-workspace.context-token.js';
3
+ import { UmbControllerBase } from '../../../../libs/class-api/index.js';
4
+ import { UMB_CURRENT_USER_CONTEXT } from '../../../user/current-user/index.js';
5
+ const IDENTIFIER_PREFIX = 'UMB_LANGUAGE_PERMISSION_';
6
+ /**
7
+ * Configures the read-only state of a Block Workspace based on the parent Block Manager
8
+ * and the current user's language access.
9
+ *
10
+ * - For invariant blocks, the workspace inherits the read-only state of the parent Block Manager(Host Property).
11
+ * - For variant blocks (with a culture), the workspace is editable only when the current user
12
+ * has access to that culture (either via `hasAccessToAllLanguages` or an entry in their
13
+ * allowed languages).
14
+ */
15
+ export class UmbBlockLanguageAccessWorkspaceController extends UmbControllerBase {
16
+ #workspaceContext;
17
+ #variantId;
18
+ #currentUserAllowedLanguages;
19
+ #currentUserHasAccessToAllLanguages;
20
+ #consumeBlockManager;
21
+ #appliedLanguageUnique;
22
+ constructor(host) {
23
+ super(host);
24
+ this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (instance) => {
25
+ this.#workspaceContext = instance;
26
+ this.#workspaceContext?.readOnlyGuard.fallbackToNotPermitted();
27
+ this.#workspaceContext?.content.readOnlyGuard.fallbackToNotPermitted();
28
+ this.#workspaceContext?.settings.readOnlyGuard.fallbackToNotPermitted();
29
+ this.observe(instance?.variantId, (variantId) => {
30
+ this.#variantId = variantId;
31
+ this.#observeBlockManager(variantId);
32
+ this.#checkForLanguageAccess();
33
+ }, 'observeBlockVariantId');
34
+ });
35
+ this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => {
36
+ this.observe(context?.languages, (languages) => {
37
+ this.#currentUserAllowedLanguages = languages;
38
+ this.#checkForLanguageAccess();
39
+ }, 'observeCurrentUserLanguages');
40
+ this.observe(context?.hasAccessToAllLanguages, (hasAccessToAllLanguages) => {
41
+ this.#currentUserHasAccessToAllLanguages = hasAccessToAllLanguages;
42
+ this.#checkForLanguageAccess();
43
+ }, 'observeCurrentUserHasAccessToAllLanguages');
44
+ });
45
+ }
46
+ #observeBlockManager(variantId) {
47
+ const unique = 'UMB_BLOCK_MANAGER_CONTEXT';
48
+ if (variantId?.isCultureInvariant()) {
49
+ /**
50
+ * If the Block Workspace is invariant, the readOnly state from the Block Manager should apply to the invariant fields(all) of this Workspace: [NL]
51
+ */
52
+ // Destroy any prior consumer before reassigning, so a re-emit of an invariant
53
+ // variantId does not leak the previous context consumer. [NL]
54
+ this.#consumeBlockManager?.destroy();
55
+ this.#consumeBlockManager = this.consumeContext(UMB_BLOCK_MANAGER_CONTEXT, (manager) => {
56
+ this.observe(manager?.readOnlyState.permitted, (isReadOnly) => {
57
+ if (isReadOnly === undefined)
58
+ return;
59
+ if (isReadOnly) {
60
+ const rule = {
61
+ unique,
62
+ permitted: true,
63
+ };
64
+ this.#workspaceContext?.readOnlyGuard.addRule(rule);
65
+ this.#workspaceContext?.content.readOnlyGuard.addRule(rule);
66
+ this.#workspaceContext?.settings.readOnlyGuard.addRule(rule);
67
+ }
68
+ else {
69
+ this.#workspaceContext?.readOnlyGuard.removeRule(unique);
70
+ this.#workspaceContext?.content.readOnlyGuard.removeRule(unique);
71
+ this.#workspaceContext?.settings.readOnlyGuard.removeRule(unique);
72
+ }
73
+ }, 'observeManagerReadOnly');
74
+ });
75
+ }
76
+ else {
77
+ this.#workspaceContext?.readOnlyGuard.removeRule(unique);
78
+ this.#workspaceContext?.content.readOnlyGuard.removeRule(unique);
79
+ this.#workspaceContext?.settings.readOnlyGuard.removeRule(unique);
80
+ this.#consumeBlockManager?.destroy();
81
+ this.#consumeBlockManager = undefined;
82
+ this.removeUmbControllerByAlias('observeManagerReadOnly');
83
+ }
84
+ }
85
+ #checkForLanguageAccess() {
86
+ if (!this.#workspaceContext ||
87
+ this.#currentUserHasAccessToAllLanguages == undefined ||
88
+ this.#currentUserAllowedLanguages == undefined) {
89
+ return;
90
+ }
91
+ const culture = this.#variantId?.culture ?? undefined;
92
+ // If the block is invariant/segment-only, or the user has access to all languages,
93
+ // there is no language-based restriction to apply.
94
+ const allowed = !culture || this.#currentUserHasAccessToAllLanguages === true
95
+ ? true
96
+ : (this.#currentUserAllowedLanguages?.includes(culture) ?? false);
97
+ // Always remove the previously applied rule (tracked by the actual unique key,
98
+ // not just the current culture). Without this, switching the workspace's culture
99
+ // from A → B leaves a stale UMB_LANGUAGE_PERMISSION_<A> rule lingering in the
100
+ // guard manager — `findRule()` is variant-scoped so it stays harmless, but
101
+ // `getRules()` accumulates one entry per visited culture over the workspace's
102
+ // lifetime. [NL]
103
+ if (this.#appliedLanguageUnique) {
104
+ this.#workspaceContext.readOnlyGuard.removeRule(this.#appliedLanguageUnique);
105
+ this.#workspaceContext.content.readOnlyGuard.removeRule(this.#appliedLanguageUnique);
106
+ this.#workspaceContext.settings.readOnlyGuard.removeRule(this.#appliedLanguageUnique);
107
+ this.#appliedLanguageUnique = undefined;
108
+ }
109
+ if (allowed || !culture || !this.#variantId)
110
+ return;
111
+ const variantId = this.#variantId;
112
+ const unique = IDENTIFIER_PREFIX + culture;
113
+ const rule = {
114
+ unique,
115
+ variantId,
116
+ // `permitted: true` on a read-only guard means "to be read-only"
117
+ // — i.e. not editable. Combined with `fallbackToPermitted()` (default = read-only).
118
+ permitted: true,
119
+ };
120
+ this.#workspaceContext.readOnlyGuard.addRule(rule);
121
+ this.#workspaceContext.content.readOnlyGuard.addRule(rule);
122
+ this.#workspaceContext.settings.readOnlyGuard.addRule(rule);
123
+ this.#appliedLanguageUnique = unique;
124
+ }
125
+ }
126
+ export { UmbBlockLanguageAccessWorkspaceController as api };
@@ -2,12 +2,14 @@ import { UMB_BLOCK_ENTRIES_CONTEXT, UMB_BLOCK_MANAGER_CONTEXT } from '../context
2
2
  import { UmbBlockWorkspaceEditorElement } from './block-workspace-editor.element.js';
3
3
  import { UmbBlockElementManager } from './block-element-manager.js';
4
4
  import { UMB_BLOCK_WORKSPACE_VIEW_CONTENT, UMB_BLOCK_WORKSPACE_VIEW_SETTINGS } from './constants.js';
5
+ import { UmbBlockLanguageAccessWorkspaceController } from './block-workspace-language-access.controller.js';
5
6
  import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceIsNewRedirectControllerAlias, } from '../../../core/workspace/index.js';
6
7
  import { UmbBooleanState, UmbClassState, UmbObjectState, UmbStringState, observeMultiple, } from '../../../../libs/observable-api/index.js';
7
8
  import { UMB_DISCARD_CHANGES_MODAL, UMB_MODAL_CONTEXT, UMB_MODAL_MANAGER_CONTEXT } from '../../../core/modal/index.js';
8
9
  import { decodeFilePath, UmbReadOnlyVariantGuardManager } from '../../../core/utils/index.js';
9
10
  import { UmbVariantId } from '../../../core/variant/index.js';
10
11
  import { UmbUfmVirtualRenderController } from '../../../ufm/index.js';
12
+ import { UMB_IS_TRASHED_ENTITY_CONTEXT } from '../../../core/recycle-bin/index.js';
11
13
  export class UmbBlockWorkspaceContext extends UmbSubmittableWorkspaceContextBase {
12
14
  //
13
15
  #blockManager;
@@ -109,6 +111,7 @@ export class UmbBlockWorkspaceContext extends UmbSubmittableWorkspaceContextBase
109
111
  const manifest = workspaceArgs.manifest;
110
112
  this.#entityType = manifest.meta?.entityType;
111
113
  window.addEventListener('willchangestate', this.#onWillNavigate);
114
+ new UmbBlockLanguageAccessWorkspaceController(this);
112
115
  this.content.view.inheritFrom(this.view);
113
116
  this.settings.view.inheritFrom(this.view);
114
117
  this.addValidationContext(this.content.validation);
@@ -125,6 +128,26 @@ export class UmbBlockWorkspaceContext extends UmbSubmittableWorkspaceContextBase
125
128
  this.#retrieveBlockEntries = this.consumeContext(UMB_BLOCK_ENTRIES_CONTEXT, (context) => {
126
129
  this.#blockEntries = context;
127
130
  }).asPromise({ preventTimeout: true });
131
+ this.consumeContext(UMB_IS_TRASHED_ENTITY_CONTEXT, (context) => {
132
+ this.observe(context?.isTrashed, (isTrashed) => {
133
+ const trashed = isTrashed === true;
134
+ const unique = 'UMB_PREVENT_EDIT_TRASHED_ITEM';
135
+ if (trashed) {
136
+ const rule = {
137
+ unique,
138
+ permitted: true,
139
+ };
140
+ this.readOnlyGuard.addRule(rule);
141
+ this.content.readOnlyGuard.addRule(rule);
142
+ this.settings.readOnlyGuard.addRule(rule);
143
+ }
144
+ else {
145
+ this.readOnlyGuard.removeRule(unique);
146
+ this.content.readOnlyGuard.removeRule(unique);
147
+ this.settings.readOnlyGuard.removeRule(unique);
148
+ }
149
+ }, 'observeIsTrashed');
150
+ }).skipHost();
128
151
  this.observe(this.variantId, (variantId) => {
129
152
  this.content.setVariantId(variantId);
130
153
  this.settings.setVariantId(variantId);
@@ -185,25 +208,6 @@ export class UmbBlockWorkspaceContext extends UmbSubmittableWorkspaceContextBase
185
208
  this.#exposed.setValue(exposed ?? false);
186
209
  }, 'observeHasExpose');
187
210
  }, 'observeContentKeyAndVariantId');
188
- this.observe(
189
- // TODO: Again we need to parse on all variants....
190
- manager.readOnlyState.isPermittedForObservableVariant(this.variantId), (isReadOnly) => {
191
- const unique = 'UMB_BLOCK_MANAGER_CONTEXT';
192
- if (isReadOnly) {
193
- const rule = {
194
- unique,
195
- variantId: this.#variantId.getValue(),
196
- };
197
- this.readOnlyGuard?.addRule(rule);
198
- this.content.propertyWriteGuard.addRule({ unique, permitted: false });
199
- this.settings.propertyWriteGuard.addRule({ unique, permitted: false });
200
- }
201
- else {
202
- this.readOnlyGuard?.removeRule(unique);
203
- this.content.propertyWriteGuard.removeRule(unique);
204
- this.settings.propertyWriteGuard.removeRule(unique);
205
- }
206
- }, 'observeIsReadOnly');
207
211
  this.observe(this.content.contentTypeId, (contentTypeId) => {
208
212
  this.observe(contentTypeId ? manager.blockTypeOf(contentTypeId) : undefined, async (blockType) => {
209
213
  if (blockType?.editorSize) {
@@ -1,3 +1,4 @@
1
+ import { UMB_BLOCK_WORKSPACE_CONTEXT } from './block-workspace.context-token.js';
1
2
  import { UMB_BLOCK_WORKSPACE_ALIAS, UMB_BLOCK_WORKSPACE_VIEW_CONTENT, UMB_BLOCK_WORKSPACE_VIEW_SETTINGS, } from './constants.js';
2
3
  import { UMB_WORKSPACE_CONDITION_ALIAS, UmbSubmitWorkspaceAction } from '../../../core/workspace/index.js';
3
4
  export const manifests = [
@@ -11,6 +12,7 @@ export const manifests = [
11
12
  label: '#general_create',
12
13
  look: 'primary',
13
14
  color: 'positive',
15
+ workspaceContextToken: UMB_BLOCK_WORKSPACE_CONTEXT,
14
16
  },
15
17
  conditions: [
16
18
  {
@@ -37,6 +39,7 @@ export const manifests = [
37
39
  label: '#general_update',
38
40
  look: 'primary',
39
41
  color: 'positive',
42
+ workspaceContextToken: UMB_BLOCK_WORKSPACE_CONTEXT,
40
43
  },
41
44
  conditions: [
42
45
  {
@@ -23,6 +23,7 @@ export interface UmbBlockEditorCustomViewProperties<LayoutType extends UmbBlockL
23
23
  settingsInvalid?: boolean;
24
24
  unsupported?: boolean;
25
25
  unpublished?: boolean;
26
+ readonly?: boolean;
26
27
  }
27
28
  export interface UmbBlockEditorCustomViewElement<LayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, BlockType extends UmbBlockTypeBaseModel = UmbBlockTypeBaseModel> extends UmbBlockEditorCustomViewProperties<LayoutType, BlockType>, HTMLElement {
28
29
  }
@@ -1,5 +1,5 @@
1
1
  import { UmbLitElement } from '../../../../core/lit-element/index.js';
2
- declare const UmbBlockGridEntriesElement_base: import("../../../../../libs/extension-api/index.js").HTMLElementConstructor<import("../../../../core/validation/index.js").UmbFormControlMixinElement<FormDataEntryValue | FormData | undefined>> & typeof UmbLitElement;
2
+ declare const UmbBlockGridEntriesElement_base: import("../../../../../libs/extension-api/index.js").HTMLElementConstructor<import("../../../../core/validation/index.js").UmbFormControlMixinElement<FormData | FormDataEntryValue | undefined>> & typeof UmbLitElement;
3
3
  /**
4
4
  * @element umb-block-grid-entries
5
5
  */
@@ -198,7 +198,10 @@ let UmbBlockGridEntryElement = class UmbBlockGridEntryElement extends UmbLitElem
198
198
  this._workspaceEditSettingsPath = path;
199
199
  this.#updateBlockViewProps({ config: { ...this._blockViewProps.config, editSettingsPath: path } });
200
200
  }, null);
201
- this.observe(this.#context.readOnlyGuard.permitted, (isReadOnly) => (this._isReadOnly = isReadOnly), 'umbReadOnlyObserver');
201
+ this.observe(this.#context.readOnlyGuard.permitted, (isReadOnly) => {
202
+ this._isReadOnly = isReadOnly;
203
+ this.#updateBlockViewProps({ readonly: isReadOnly });
204
+ }, 'umbReadOnlyObserver');
202
205
  }
203
206
  async #observeData() {
204
207
  this.observe(await this.#context.contentValues(), (content) => {
@@ -364,8 +367,6 @@ let UmbBlockGridEntryElement = class UmbBlockGridEntryElement extends UmbLitElem
364
367
  `;
365
368
  }
366
369
  #renderEditAction() {
367
- if (this._isReadOnly)
368
- return nothing;
369
370
  return html `
370
371
  ${when(this._showContentEdit && this._workspaceEditContentPath, () => html `
371
372
  <uui-button
@@ -389,8 +390,6 @@ let UmbBlockGridEntryElement = class UmbBlockGridEntryElement extends UmbLitElem
389
390
  `;
390
391
  }
391
392
  #renderEditSettingsAction() {
392
- if (this._isReadOnly)
393
- return nothing;
394
393
  return html `
395
394
  ${this._hasSettings && this._workspaceEditSettingsPath
396
395
  ? html `
@@ -128,17 +128,14 @@ let UmbPropertyEditorUIBlockGridElement = class UmbPropertyEditorUIBlockGridElem
128
128
  this.removeUmbControllerByAlias('observeBlockTypes');
129
129
  }
130
130
  }).passContextAliasMatches();
131
- this.consumeContext(UMB_PROPERTY_CONTEXT, (context) => {
132
- this.observe(context?.dataPath, (dataPath) => {
131
+ this.consumeContext(UMB_PROPERTY_CONTEXT, (propertyContext) => {
132
+ this.observe(propertyContext?.dataPath, (dataPath) => {
133
133
  if (dataPath) {
134
134
  // Set the data path for the local validation context:
135
135
  this.#validationContext.setDataPath(dataPath);
136
136
  this.#validationContext.autoReport();
137
137
  }
138
138
  }, 'observeDataPath');
139
- });
140
- // TODO: Prevent initial notification from these observes
141
- this.consumeContext(UMB_PROPERTY_CONTEXT, (propertyContext) => {
142
139
  this.observe(observeMultiple([
143
140
  this.#managerContext.layouts,
144
141
  this.#managerContext.contents,