@umbraco-cms/backoffice 14.0.0--preview004-b3446294 → 14.0.0--preview003

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 (270) hide show
  1. package/dist-cms/apps/app/app.element.js +3 -0
  2. package/dist-cms/assets/lang/da-dk.js +0 -3
  3. package/dist-cms/assets/lang/da-dk.ts +0 -3
  4. package/dist-cms/assets/lang/en-us.js +18 -21
  5. package/dist-cms/assets/lang/en-us.ts +18 -21
  6. package/dist-cms/custom-elements.json +19 -288
  7. package/dist-cms/external/tinymce/index.js +36 -36
  8. package/dist-cms/mocks/browser-handlers.js +1 -1
  9. package/dist-cms/mocks/data/entity.data.d.ts +1 -1
  10. package/dist-cms/mocks/data/entity.data.js +9 -1
  11. package/dist-cms/mocks/data/media.data.d.ts +1 -2
  12. package/dist-cms/mocks/data/media.data.js +0 -11
  13. package/dist-cms/mocks/data/user-groups.data.d.ts +9 -0
  14. package/dist-cms/mocks/data/user-groups.data.js +21 -0
  15. package/dist-cms/mocks/data/users.data.d.ts +16 -0
  16. package/dist-cms/mocks/data/{user.data.js → users.data.js} +41 -27
  17. package/dist-cms/mocks/handlers/dictionary.handlers.js +2 -2
  18. package/dist-cms/mocks/handlers/media.handlers.js +0 -8
  19. package/dist-cms/mocks/handlers/partial-views.handlers.js +3 -3
  20. package/dist-cms/mocks/handlers/user-group.handlers.js +17 -0
  21. package/dist-cms/mocks/handlers/user.handlers.js +1 -15
  22. package/dist-cms/packages/core/components/input-list-base/input-list-base.js +1 -1
  23. package/dist-cms/packages/core/components/input-section/input-section.element.d.ts +2 -2
  24. package/dist-cms/packages/core/components/input-section/input-section.element.js +5 -5
  25. package/dist-cms/packages/core/extension-registry/conditions/types.d.ts +2 -3
  26. package/dist-cms/packages/core/extension-registry/models/index.d.ts +1 -5
  27. package/dist-cms/packages/core/extension-registry/models/index.js +0 -2
  28. package/dist-cms/packages/core/localization/index.d.ts +0 -3
  29. package/dist-cms/packages/core/localization/index.js +0 -3
  30. package/dist-cms/packages/core/localization/localize.element.js +1 -1
  31. package/dist-cms/packages/core/modal/common/manifests.js +0 -6
  32. package/dist-cms/packages/core/modal/common/tree-picker/tree-picker-modal.element.js +3 -5
  33. package/dist-cms/packages/core/modal/token/index.d.ts +0 -1
  34. package/dist-cms/packages/core/modal/token/index.js +0 -1
  35. package/dist-cms/packages/core/picker-input/picker-input.context.js +3 -1
  36. package/dist-cms/packages/core/tree/tree.context.js +2 -3
  37. package/dist-cms/packages/documents/documents/components/index.d.ts +0 -1
  38. package/dist-cms/packages/documents/documents/components/index.js +0 -1
  39. package/dist-cms/packages/documents/documents/components/input-document/input-document.element.d.ts +12 -7
  40. package/dist-cms/packages/documents/documents/components/input-document/input-document.element.js +64 -51
  41. package/dist-cms/packages/documents/documents/entity-actions/create/manifests.js +0 -9
  42. package/dist-cms/packages/documents/documents/entity-actions/manifests.js +1 -1
  43. package/dist-cms/packages/documents/documents/entity-actions/permissions.action.d.ts +1 -2
  44. package/dist-cms/packages/documents/documents/entity-actions/permissions.action.js +2 -22
  45. package/dist-cms/packages/documents/documents/index.d.ts +0 -2
  46. package/dist-cms/packages/documents/documents/index.js +0 -2
  47. package/dist-cms/packages/documents/documents/manifests.d.ts +0 -4
  48. package/dist-cms/packages/documents/documents/manifests.js +0 -2
  49. package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.d.ts +0 -4
  50. package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.js +0 -6
  51. package/dist-cms/packages/documents/documents/recycle-bin/manifests.d.ts +0 -4
  52. package/dist-cms/packages/documents/documents/repository/document.repository.js +4 -4
  53. package/dist-cms/packages/documents/documents/repository/manifests.d.ts +2 -3
  54. package/dist-cms/packages/documents/documents/repository/manifests.js +1 -9
  55. package/dist-cms/packages/documents/documents/workspace/views/info/document-info-workspace-view.element.js +28 -29
  56. package/dist-cms/packages/documents/manifests.d.ts +0 -4
  57. package/dist-cms/packages/log-viewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.js +1 -1
  58. package/dist-cms/packages/media/manifests.d.ts +1 -2
  59. package/dist-cms/packages/media/manifests.js +0 -1
  60. package/dist-cms/packages/media/media/components/index.d.ts +0 -1
  61. package/dist-cms/packages/media/media/components/index.js +0 -1
  62. package/dist-cms/packages/media/media/components/input-media/input-media.element.d.ts +15 -7
  63. package/dist-cms/packages/media/media/components/input-media/input-media.element.js +72 -50
  64. package/dist-cms/packages/media/media/index.d.ts +0 -2
  65. package/dist-cms/packages/media/media/index.js +1 -1
  66. package/dist-cms/packages/media/media/manifests.d.ts +1 -1
  67. package/dist-cms/packages/media/media/manifests.js +0 -2
  68. package/dist-cms/packages/media/media/repository/manifests.d.ts +2 -3
  69. package/dist-cms/packages/media/media/repository/manifests.js +1 -9
  70. package/dist-cms/packages/media/media/repository/media.repository.d.ts +0 -6
  71. package/dist-cms/packages/media/media/repository/media.repository.js +0 -22
  72. package/dist-cms/packages/users/current-user/index.d.ts +0 -1
  73. package/dist-cms/packages/users/current-user/index.js +0 -1
  74. package/dist-cms/packages/users/current-user/manifests.js +1 -7
  75. package/dist-cms/packages/users/current-user/modals/current-user/current-user-modal.element.js +7 -7
  76. package/dist-cms/packages/users/index.d.ts +2 -4
  77. package/dist-cms/packages/users/index.js +2 -4
  78. package/dist-cms/packages/users/manifests.d.ts +0 -2
  79. package/dist-cms/packages/users/manifests.js +0 -3
  80. package/dist-cms/packages/users/user-groups/collection/user-group-collection-header.element.js +2 -2
  81. package/dist-cms/packages/users/user-groups/collection/user-group-collection-view.element.js +6 -6
  82. package/dist-cms/packages/users/user-groups/components/index.d.ts +0 -1
  83. package/dist-cms/packages/users/user-groups/components/index.js +0 -1
  84. package/dist-cms/packages/users/user-groups/index.d.ts +0 -2
  85. package/dist-cms/packages/users/user-groups/index.js +0 -2
  86. package/dist-cms/packages/users/user-groups/manifests.d.ts +1 -1
  87. package/dist-cms/packages/users/user-groups/manifests.js +0 -2
  88. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.d.ts +0 -2
  89. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.js +56 -57
  90. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.d.ts +0 -12
  91. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.js +0 -20
  92. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.element.js +1 -1
  93. package/dist-cms/packages/users/users/collection/user-collection-header.element.js +11 -18
  94. package/dist-cms/packages/users/users/collection/views/grid/user-collection-grid-view.element.js +6 -6
  95. package/dist-cms/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.js +3 -3
  96. package/dist-cms/packages/users/users/components/index.d.ts +0 -3
  97. package/dist-cms/packages/users/users/components/index.js +0 -3
  98. package/dist-cms/packages/users/users/components/user-input/user-input.element.js +2 -2
  99. package/dist-cms/packages/users/users/index.d.ts +0 -2
  100. package/dist-cms/packages/users/users/index.js +0 -2
  101. package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.d.ts +1 -3
  102. package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.js +25 -20
  103. package/dist-cms/packages/users/users/repository/user.repository.js +1 -1
  104. package/dist-cms/packages/users/users/workspace/user-workspace-editor.element.js +56 -73
  105. package/dist-cms/packages/users/utils.d.ts +2 -5
  106. package/dist-cms/packages/users/utils.js +14 -14
  107. package/dist-cms/shared/auth/auth-flow.d.ts +4 -0
  108. package/dist-cms/shared/auth/auth-flow.js +25 -6
  109. package/dist-cms/shared/repository/repository-items.manager.js +0 -5
  110. package/dist-cms/shared/umb-events/index.d.ts +0 -1
  111. package/dist-cms/shared/umb-events/index.js +0 -1
  112. package/dist-cms/tinymce/CHANGELOG.md +0 -48
  113. package/dist-cms/tinymce/composer.json +1 -1
  114. package/dist-cms/tinymce/models/dom/model.js +1 -1
  115. package/dist-cms/tinymce/models/dom/model.min.js +1 -1
  116. package/dist-cms/tinymce/package.json +1 -1
  117. package/dist-cms/tinymce/plugins/accordion/plugin.js +1 -1
  118. package/dist-cms/tinymce/plugins/accordion/plugin.min.js +1 -1
  119. package/dist-cms/tinymce/plugins/advlist/plugin.js +1 -1
  120. package/dist-cms/tinymce/plugins/advlist/plugin.min.js +1 -1
  121. package/dist-cms/tinymce/plugins/anchor/plugin.js +1 -1
  122. package/dist-cms/tinymce/plugins/anchor/plugin.min.js +1 -1
  123. package/dist-cms/tinymce/plugins/autolink/plugin.js +1 -1
  124. package/dist-cms/tinymce/plugins/autolink/plugin.min.js +1 -1
  125. package/dist-cms/tinymce/plugins/autoresize/plugin.js +1 -1
  126. package/dist-cms/tinymce/plugins/autoresize/plugin.min.js +1 -1
  127. package/dist-cms/tinymce/plugins/autosave/plugin.js +1 -1
  128. package/dist-cms/tinymce/plugins/autosave/plugin.min.js +1 -1
  129. package/dist-cms/tinymce/plugins/charmap/plugin.js +1 -1
  130. package/dist-cms/tinymce/plugins/charmap/plugin.min.js +1 -1
  131. package/dist-cms/tinymce/plugins/code/plugin.js +1 -1
  132. package/dist-cms/tinymce/plugins/code/plugin.min.js +1 -1
  133. package/dist-cms/tinymce/plugins/codesample/plugin.js +1 -1
  134. package/dist-cms/tinymce/plugins/codesample/plugin.min.js +1 -1
  135. package/dist-cms/tinymce/plugins/directionality/plugin.js +1 -1
  136. package/dist-cms/tinymce/plugins/directionality/plugin.min.js +1 -1
  137. package/dist-cms/tinymce/plugins/emoticons/plugin.js +1 -1
  138. package/dist-cms/tinymce/plugins/emoticons/plugin.min.js +1 -1
  139. package/dist-cms/tinymce/plugins/fullscreen/plugin.js +1 -1
  140. package/dist-cms/tinymce/plugins/fullscreen/plugin.min.js +1 -1
  141. package/dist-cms/tinymce/plugins/help/plugin.js +5 -5
  142. package/dist-cms/tinymce/plugins/help/plugin.min.js +2 -2
  143. package/dist-cms/tinymce/plugins/image/plugin.js +1 -1
  144. package/dist-cms/tinymce/plugins/image/plugin.min.js +1 -1
  145. package/dist-cms/tinymce/plugins/importcss/plugin.js +1 -1
  146. package/dist-cms/tinymce/plugins/importcss/plugin.min.js +1 -1
  147. package/dist-cms/tinymce/plugins/insertdatetime/plugin.js +1 -1
  148. package/dist-cms/tinymce/plugins/insertdatetime/plugin.min.js +1 -1
  149. package/dist-cms/tinymce/plugins/link/plugin.js +1 -1
  150. package/dist-cms/tinymce/plugins/link/plugin.min.js +1 -1
  151. package/dist-cms/tinymce/plugins/lists/plugin.js +8 -63
  152. package/dist-cms/tinymce/plugins/lists/plugin.min.js +2 -2
  153. package/dist-cms/tinymce/plugins/media/plugin.js +23 -3
  154. package/dist-cms/tinymce/plugins/media/plugin.min.js +2 -2
  155. package/dist-cms/tinymce/plugins/nonbreaking/plugin.js +1 -1
  156. package/dist-cms/tinymce/plugins/nonbreaking/plugin.min.js +1 -1
  157. package/dist-cms/tinymce/plugins/pagebreak/plugin.js +1 -1
  158. package/dist-cms/tinymce/plugins/pagebreak/plugin.min.js +1 -1
  159. package/dist-cms/tinymce/plugins/preview/plugin.js +1 -1
  160. package/dist-cms/tinymce/plugins/preview/plugin.min.js +1 -1
  161. package/dist-cms/tinymce/plugins/quickbars/plugin.js +4 -13
  162. package/dist-cms/tinymce/plugins/quickbars/plugin.min.js +2 -2
  163. package/dist-cms/tinymce/plugins/save/plugin.js +1 -1
  164. package/dist-cms/tinymce/plugins/save/plugin.min.js +1 -1
  165. package/dist-cms/tinymce/plugins/searchreplace/plugin.js +1 -1
  166. package/dist-cms/tinymce/plugins/searchreplace/plugin.min.js +1 -1
  167. package/dist-cms/tinymce/plugins/table/plugin.js +2 -2
  168. package/dist-cms/tinymce/plugins/table/plugin.min.js +2 -2
  169. package/dist-cms/tinymce/plugins/template/plugin.js +1 -1
  170. package/dist-cms/tinymce/plugins/template/plugin.min.js +1 -1
  171. package/dist-cms/tinymce/plugins/visualblocks/plugin.js +1 -1
  172. package/dist-cms/tinymce/plugins/visualblocks/plugin.min.js +1 -1
  173. package/dist-cms/tinymce/plugins/visualchars/plugin.js +1 -1
  174. package/dist-cms/tinymce/plugins/visualchars/plugin.min.js +1 -1
  175. package/dist-cms/tinymce/plugins/wordcount/plugin.js +1 -1
  176. package/dist-cms/tinymce/plugins/wordcount/plugin.min.js +1 -1
  177. package/dist-cms/tinymce/skins/ui/oxide/content.css +1 -1
  178. package/dist-cms/tinymce/skins/ui/oxide/content.inline.css +1 -1
  179. package/dist-cms/tinymce/skins/ui/oxide/content.inline.min.css +1 -1
  180. package/dist-cms/tinymce/skins/ui/oxide/content.min.css +1 -1
  181. package/dist-cms/tinymce/skins/ui/oxide/skin.css +11 -51
  182. package/dist-cms/tinymce/skins/ui/oxide/skin.min.css +1 -1
  183. package/dist-cms/tinymce/skins/ui/oxide-dark/content.css +1 -1
  184. package/dist-cms/tinymce/skins/ui/oxide-dark/content.inline.css +1 -1
  185. package/dist-cms/tinymce/skins/ui/oxide-dark/content.inline.min.css +1 -1
  186. package/dist-cms/tinymce/skins/ui/oxide-dark/content.min.css +1 -1
  187. package/dist-cms/tinymce/skins/ui/oxide-dark/skin.css +14 -54
  188. package/dist-cms/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
  189. package/dist-cms/tinymce/skins/ui/tinymce-5/content.css +1 -1
  190. package/dist-cms/tinymce/skins/ui/tinymce-5/content.inline.css +1 -1
  191. package/dist-cms/tinymce/skins/ui/tinymce-5/content.inline.min.css +1 -1
  192. package/dist-cms/tinymce/skins/ui/tinymce-5/content.min.css +1 -1
  193. package/dist-cms/tinymce/skins/ui/tinymce-5/skin.css +11 -51
  194. package/dist-cms/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
  195. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/content.css +1 -1
  196. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/content.inline.css +1 -1
  197. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css +1 -1
  198. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/content.min.css +1 -1
  199. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/skin.css +11 -51
  200. package/dist-cms/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  201. package/dist-cms/tinymce/themes/silver/theme.js +55 -158
  202. package/dist-cms/tinymce/themes/silver/theme.min.js +2 -2
  203. package/dist-cms/tinymce/tinymce.d.ts +6 -4
  204. package/dist-cms/tinymce/tinymce.js +644 -864
  205. package/dist-cms/tinymce/tinymce.min.js +2 -2
  206. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  207. package/dist-cms/umbraco-package-schema.json +0 -154
  208. package/dist-cms/vscode-html-custom-data.json +18 -167
  209. package/package.json +2 -2
  210. package/dist-cms/mocks/data/user-group.data.d.ts +0 -17
  211. package/dist-cms/mocks/data/user-group.data.js +0 -61
  212. package/dist-cms/mocks/data/user.data.d.ts +0 -15
  213. package/dist-cms/mocks/handlers/user-group/collection.handlers.d.ts +0 -1
  214. package/dist-cms/mocks/handlers/user-group/collection.handlers.js +0 -10
  215. package/dist-cms/mocks/handlers/user-group/detail.handlers.d.ts +0 -1
  216. package/dist-cms/mocks/handlers/user-group/detail.handlers.js +0 -37
  217. package/dist-cms/mocks/handlers/user-group/index.js +0 -4
  218. package/dist-cms/mocks/handlers/user-group/item.handlers.d.ts +0 -1
  219. package/dist-cms/mocks/handlers/user-group/item.handlers.js +0 -13
  220. package/dist-cms/mocks/handlers/user-group/slug.d.ts +0 -1
  221. package/dist-cms/mocks/handlers/user-group/slug.js +0 -1
  222. package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.d.ts +0 -8
  223. package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.js +0 -1
  224. package/dist-cms/packages/core/extension-registry/models/user-permission.model.d.ts +0 -11
  225. package/dist-cms/packages/core/extension-registry/models/user-permission.model.js +0 -1
  226. package/dist-cms/packages/core/localization/localize-date.element.d.ts +0 -28
  227. package/dist-cms/packages/core/localization/localize-date.element.js +0 -42
  228. package/dist-cms/packages/core/localization/localize-number.element.d.ts +0 -28
  229. package/dist-cms/packages/core/localization/localize-number.element.js +0 -42
  230. package/dist-cms/packages/core/localization/localize-relative-time.element.d.ts +0 -34
  231. package/dist-cms/packages/core/localization/localize-relative-time.element.js +0 -54
  232. package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.d.ts +0 -19
  233. package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.js +0 -97
  234. package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.d.ts +0 -7
  235. package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.js +0 -4
  236. package/dist-cms/packages/documents/documents/components/input-document/input-document.context.d.ts +0 -6
  237. package/dist-cms/packages/documents/documents/components/input-document/input-document.context.js +0 -7
  238. package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.d.ts +0 -23
  239. package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.js +0 -102
  240. package/dist-cms/packages/documents/documents/user-permissions/index.d.ts +0 -1
  241. package/dist-cms/packages/documents/documents/user-permissions/index.js +0 -1
  242. package/dist-cms/packages/documents/documents/user-permissions/manifests.d.ts +0 -19
  243. package/dist-cms/packages/documents/documents/user-permissions/manifests.js +0 -196
  244. package/dist-cms/packages/media/media/components/input-media/input-media.context.d.ts +0 -6
  245. package/dist-cms/packages/media/media/components/input-media/input-media.context.js +0 -7
  246. package/dist-cms/packages/media/media/repository/media-item.store.d.ts +0 -20
  247. package/dist-cms/packages/media/media/repository/media-item.store.js +0 -23
  248. package/dist-cms/packages/media/media/repository/sources/media-item.server.data.d.ts +0 -24
  249. package/dist-cms/packages/media/media/repository/sources/media-item.server.data.js +0 -31
  250. package/dist-cms/packages/media/media/user-permissions/index.d.ts +0 -1
  251. package/dist-cms/packages/media/media/user-permissions/index.js +0 -1
  252. package/dist-cms/packages/media/media/user-permissions/manifests.d.ts +0 -4
  253. package/dist-cms/packages/media/media/user-permissions/manifests.js +0 -27
  254. package/dist-cms/packages/users/current-user/conditions/index.d.ts +0 -1
  255. package/dist-cms/packages/users/current-user/conditions/index.js +0 -1
  256. package/dist-cms/packages/users/current-user/conditions/user-permission.condition.d.ts +0 -18
  257. package/dist-cms/packages/users/current-user/conditions/user-permission.condition.js +0 -23
  258. package/dist-cms/packages/users/user-groups/entity-actions/manifests.d.ts +0 -2
  259. package/dist-cms/packages/users/user-groups/entity-actions/manifests.js +0 -19
  260. package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.d.ts +0 -16
  261. package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.js +0 -69
  262. package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.d.ts +0 -14
  263. package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.js +0 -31
  264. package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.d.ts +0 -15
  265. package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.js +0 -66
  266. package/dist-cms/packages/users/users/repository/index.d.ts +0 -1
  267. package/dist-cms/packages/users/users/repository/index.js +0 -1
  268. package/dist-cms/shared/umb-events/selected.event.d.ts +0 -3
  269. package/dist-cms/shared/umb-events/selected.event.js +0 -6
  270. /package/dist-cms/mocks/handlers/{user-group/index.d.ts → user-group.handlers.d.ts} +0 -0
@@ -4,8 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { getDisplayStateFromUserStatus } from '../../utils.js';
8
- import { UmbUserRepository } from '../index.js';
7
+ import { getLookAndColorFromUserStatus } from '../../utils.js';
9
8
  import { UUIInputEvent } from '../../../../external/uui/index.js';
10
9
  import { css, html, nothing, customElement, state, ifDefined, repeat, } from '../../../../external/lit/index.js';
11
10
  import { firstValueFrom } from '../../../../external/rxjs/index.js';
@@ -13,7 +12,9 @@ import { UMB_CHANGE_PASSWORD_MODAL } from '../../../core/modal/index.js';
13
12
  import { UmbLitElement } from '../../../../shared/lit-element/index.js';
14
13
  import { UMB_WORKSPACE_CONTEXT } from '../../../core/workspace/index.js';
15
14
  import { UserStateModel } from '../../../../external/backend-api/index.js';
15
+ import { createExtensionClass } from '../../../../libs/extension-api/index.js';
16
16
  import { umbExtensionsRegistry } from '../../../core/extension-registry/index.js';
17
+ import { UmbObserverController } from '../../../../libs/observable-api/index.js';
17
18
  import { UMB_AUTH } from '../../../../shared/auth/index.js';
18
19
  import { UmbTextStyles } from '../../../../shared/style/index.js';
19
20
  export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement extends UmbLitElement {
@@ -24,7 +25,6 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
24
25
  constructor() {
25
26
  super();
26
27
  this.languages = [];
27
- this.#userRepository = new UmbUserRepository(this);
28
28
  this.consumeContext(UMB_AUTH, (instance) => {
29
29
  this.#auth = instance;
30
30
  this.#observeCurrentUser();
@@ -33,6 +33,18 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
33
33
  this.#workspaceContext = workspaceContext;
34
34
  this.#observeUser();
35
35
  });
36
+ // TODO: this code is reused in multiple places, so it should be extracted to a function
37
+ new UmbObserverController(this, umbExtensionsRegistry.getByTypeAndAlias('repository', 'Umb.Repository.User'), async (repositoryManifest) => {
38
+ if (!repositoryManifest)
39
+ return;
40
+ try {
41
+ const result = await createExtensionClass(repositoryManifest, [this]);
42
+ this.#userRepository = result;
43
+ }
44
+ catch (error) {
45
+ throw new Error('Could not create repository with alias: Umb.Repository.User');
46
+ }
47
+ });
36
48
  }
37
49
  #observeUser() {
38
50
  if (!this.#workspaceContext)
@@ -140,63 +152,52 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
140
152
  return nothing;
141
153
  return html ` <uui-box>
142
154
  <div slot="headline"><umb-localize key="user_profile">Profile</umb-localize></div>
143
- <umb-workspace-property-layout label="${this.localize.term('general_email')}">
144
- <uui-input
145
- slot="editor"
146
- name="email"
147
- label="${this.localize.term('general_email')}"
148
- readonly
149
- value=${ifDefined(this._user.email)}></uui-input>
155
+ <umb-workspace-property-layout label="Email">
156
+ <uui-input slot="editor" name="email" label="email" readonly value=${ifDefined(this._user.email)}></uui-input>
150
157
  </umb-workspace-property-layout>
151
- <umb-workspace-property-layout
152
- label="${this.localize.term('user_language')}"
153
- description=${this.localize.term('user_languageHelp')}>
158
+ <umb-workspace-property-layout label="Language" description="The language of the UI in the Backoffice">
154
159
  <uui-select
155
160
  slot="editor"
156
161
  name="language"
157
- label="${this.localize.term('user_language')}"
162
+ label="language"
158
163
  .options=${this.languages}
159
164
  @change="${this.#onLanguageChange}">
160
165
  </uui-select>
161
166
  </umb-workspace-property-layout>
162
167
  </uui-box>
163
168
  <uui-box>
164
- <div slot="headline"><umb-localize key="user_assignAccess">Assign Access</umb-localize></div>
169
+ <div slot="headline">Assign access</div>
165
170
  <div id="assign-access">
166
- <umb-workspace-property-layout
167
- label="${this.localize.term('general_groups')}"
168
- description="${this.localize.term('user_groupsHelp')}">
171
+ <umb-workspace-property-layout label="Groups" description="Add groups to assign access and permissions">
169
172
  <umb-user-group-input
170
173
  slot="editor"
171
174
  .selectedIds=${this._user.userGroupIds ?? []}
172
175
  @change=${(e) => this.#onUserGroupsChange(e.target.selectedIds)}></umb-user-group-input>
173
176
  </umb-workspace-property-layout>
174
177
  <umb-workspace-property-layout
175
- label=${this.localize.term('user_startnodes')}
176
- description=${this.localize.term('user_startnodeshelp')}>
178
+ label="Content start node"
179
+ description="Limit the content tree to specific start nodes">
177
180
  <umb-property-editor-ui-document-picker
178
181
  .value=${this._user.contentStartNodeIds ?? []}
179
182
  @property-value-change=${(e) => this.#workspaceContext?.updateProperty('contentStartNodeIds', e.target.value)}
180
183
  slot="editor"></umb-property-editor-ui-document-picker>
181
184
  </umb-workspace-property-layout>
182
185
  <umb-workspace-property-layout
183
- label=${this.localize.term('user_mediastartnodes')}
184
- description=${this.localize.term('user_mediastartnodeshelp')}>
186
+ label="Media start nodes"
187
+ description="Limit the media library to specific start nodes">
185
188
  <b slot="editor">NEED MEDIA PICKER</b>
186
189
  </umb-workspace-property-layout>
187
190
  </div>
188
191
  </uui-box>
189
- <uui-box headline=${this.localize.term('user_access')}>
192
+ <uui-box headline="Access">
190
193
  <div slot="header" class="faded-text">
191
- <umb-localize key="user_accessHelp"
192
- >Based on the assigned groups and start nodes, the user has access to the following nodes</umb-localize
193
- >
194
+ Based on the assigned groups and start nodes, the user has access to the following nodes
194
195
  </div>
195
196
 
196
- <b><umb-localize key="sections_content">Content</umb-localize></b>
197
+ <b>Content</b>
197
198
  ${this.#renderContentStartNodes()}
198
199
  <hr />
199
- <b><umb-localize key="sections_media">Media</umb-localize></b>
200
+ <b>Media</b>
200
201
  <uui-ref-node name="Media Root">
201
202
  <uui-icon slot="icon" name="folder"></uui-icon>
202
203
  </uui-ref-node>
@@ -205,42 +206,41 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
205
206
  #renderRightColumn() {
206
207
  if (!this._user || !this.#workspaceContext)
207
208
  return nothing;
208
- const displayState = getDisplayStateFromUserStatus(this._user.state);
209
+ const statusLook = getLookAndColorFromUserStatus(this._user.state);
209
210
  return html ` <uui-box>
210
211
  <div id="user-info">
211
212
  <uui-avatar .name=${this._user?.name || ''}></uui-avatar>
212
- <uui-button label=${this.localize.term('user_changePhoto')}></uui-button>
213
+ <uui-button label="Change photo"></uui-button>
213
214
  <hr />
214
215
  ${this.#renderActionButtons()}
215
216
 
216
217
  <div>
217
- <b><umb-localize key="general_status">Status</umb-localize>:</b>
218
- <uui-tag look="${ifDefined(displayState?.look)}" color="${ifDefined(displayState?.color)}">
219
- ${this.localize.term('user_' + displayState.key)}
218
+ <b>Status:</b>
219
+ <uui-tag look="${ifDefined(statusLook?.look)}" color="${ifDefined(statusLook?.color)}">
220
+ ${this._user.state}
220
221
  </uui-tag>
221
222
  </div>
222
223
 
223
224
  ${this._user?.state === UserStateModel.INVITED
224
225
  ? html `
225
- <uui-textarea placeholder=${this.localize.term('placeholders_enterMessage')}></uui-textarea>
226
- <uui-button look="primary" label=${this.localize.term('actions_resendInvite')}></uui-button>
226
+ <uui-textarea placeholder="Enter a message..."> </uui-textarea>
227
+ <uui-button look="primary" label="Resend invitation"></uui-button>
227
228
  `
228
229
  : nothing}
229
- ${this.#renderInfoItem('user_lastLogin', this.localize.date(this._user.lastLoginDate) ||
230
- `${this._user.name + ' ' + this.localize.term('user_noLogin')} `)}
231
- ${this.#renderInfoItem('user_failedPasswordAttempts', this._user.failedLoginAttempts)}
232
- ${this.#renderInfoItem('user_lastLockoutDate', this._user.lastLockoutDate || `${this._user.name + ' ' + this.localize.term('user_noLockouts')}`)}
233
- ${this.#renderInfoItem('user_lastPasswordChangeDate', this._user.lastLoginDate || `${this._user.name + ' ' + this.localize.term('user_noPasswordChange')}`)}
234
- ${this.#renderInfoItem('user_createDate', this.localize.date(this._user.createDate))}
235
- ${this.#renderInfoItem('user_updateDate', this.localize.date(this._user.updateDate))}
236
- ${this.#renderInfoItem('general_id', this._user.id)}
230
+ ${this.#renderInfoItem('Last login', this._user.lastLoginDate || `${this._user.name} has not logged in yet`)}
231
+ ${this.#renderInfoItem('Failed login attempts', this._user.failedLoginAttempts)}
232
+ ${this.#renderInfoItem('Last lockout date', this._user.lastLockoutDate || `${this._user.name} has not been locked out`)}
233
+ ${this.#renderInfoItem('Password last changed', this._user.lastLoginDate || `${this._user.name} has not changed password`)}
234
+ ${this.#renderInfoItem('User created', this._user.createDate)}
235
+ ${this.#renderInfoItem('User last updated', this._user.updateDate)}
236
+ ${this.#renderInfoItem('Key', this._user.id)}
237
237
  </div>
238
238
  </uui-box>`;
239
239
  }
240
- #renderInfoItem(labelkey, value) {
240
+ #renderInfoItem(label, value) {
241
241
  return html `
242
242
  <div>
243
- <b><umb-localize key=${labelkey}></umb-localize></b>
243
+ <b>${label}</b>
244
244
  <span>${value}</span>
245
245
  </div>
246
246
  `;
@@ -251,40 +251,23 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
251
251
  //TODO: Find out if the current user is an admin. If not, show no buttons.
252
252
  // if (this._currentUserStore?.isAdmin === false) return nothing;
253
253
  const buttons = [];
254
- if (this._user.id !== this._currentUser?.id) {
255
- if (this._user.state === UserStateModel.DISABLED) {
256
- buttons.push(html `
257
- <uui-button
258
- @click=${this.#onUserStatusChange}
259
- look="secondary"
260
- color="positive"
261
- label=${this.localize.term('actions_enable')}></uui-button>
262
- `);
263
- }
264
- if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) {
265
- buttons.push(html `
266
- <uui-button
267
- @click=${this.#onUserStatusChange}
268
- look="secondary"
269
- color="warning"
270
- label=${this.localize.term('actions_disable')}></uui-button>
271
- `);
272
- }
254
+ if (this._user.state === UserStateModel.DISABLED) {
255
+ buttons.push(html `
256
+ <uui-button @click=${this.#onUserStatusChange} look="secondary" color="positive" label="Enable"></uui-button>
257
+ `);
258
+ }
259
+ if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) {
260
+ buttons.push(html `
261
+ <uui-button @click=${this.#onUserStatusChange} look="secondary" color="warning" label="Disable"></uui-button>
262
+ `);
273
263
  }
274
264
  if (this._currentUser?.id !== this._user?.id) {
275
265
  const button = html `
276
- <uui-button
277
- @click=${this.#onUserDelete}
278
- look="secondary"
279
- color="danger"
280
- label=${this.localize.term('user_deleteUser')}></uui-button>
266
+ <uui-button @click=${this.#onUserDelete} look="secondary" color="danger" label="Delete User"></uui-button>
281
267
  `;
282
268
  buttons.push(button);
283
269
  }
284
- buttons.push(html `<uui-button
285
- @click=${this.#onPasswordChange}
286
- look="secondary"
287
- label=${this.localize.term('general_changePassword')}></uui-button>`);
270
+ buttons.push(html `<uui-button @click=${this.#onPasswordChange} look="secondary" label="Change password"></uui-button>`);
288
271
  return buttons;
289
272
  }
290
273
  #renderContentStartNodes() {
@@ -1,9 +1,6 @@
1
1
  import { InterfaceColor, InterfaceLook } from '../../external/uui/index.js';
2
2
  import { UserStateModel } from '../../external/backend-api/index.js';
3
- interface DisplayStatus {
3
+ export declare const getLookAndColorFromUserStatus: (status?: UserStateModel) => {
4
4
  look: InterfaceLook;
5
5
  color: InterfaceColor;
6
- key: string;
7
- }
8
- export declare const getDisplayStateFromUserStatus: (status?: UserStateModel) => DisplayStatus;
9
- export {};
6
+ };
@@ -1,14 +1,14 @@
1
- const userStates = [
2
- { "key": "All", color: "positive", look: "secondary" },
3
- { "key": "Active", "color": "positive", look: "primary" },
4
- { "key": "Disabled", "color": "danger", look: "primary" },
5
- { "key": "LockedOut", "color": "danger", look: "secondary" },
6
- { "key": "Invited", "color": "warning", look: "primary" },
7
- { "key": "Inactive", "color": "warning", look: "primary" }
8
- ];
9
- export const getDisplayStateFromUserStatus = (status) => userStates
10
- .filter(state => state.key === status)
11
- .map(state => ({
12
- ...state,
13
- key: 'state' + state.key
14
- }))[0];
1
+ import { UserStateModel } from '../../external/backend-api/index.js';
2
+ export const getLookAndColorFromUserStatus = (status) => {
3
+ switch (status) {
4
+ case UserStateModel.INACTIVE:
5
+ case UserStateModel.INVITED:
6
+ return { look: 'primary', color: 'warning' };
7
+ case UserStateModel.ACTIVE:
8
+ return { look: 'primary', color: 'positive' };
9
+ case UserStateModel.DISABLED:
10
+ return { look: 'primary', color: 'danger' };
11
+ default:
12
+ return { look: 'secondary', color: 'default' };
13
+ }
14
+ };
@@ -59,6 +59,10 @@ export declare class UmbAuthFlow {
59
59
  * saved the state in local storage before redirecting the user to the login page.
60
60
  */
61
61
  completeAuthorizationIfPossible(): Promise<void>;
62
+ /**
63
+ * This method will query the server for the service configuration usually found at /.well-known/openid-configuration.
64
+ */
65
+ fetchServiceConfiguration(): Promise<void>;
62
66
  /**
63
67
  * This method will make an authorization request to the server.
64
68
  *
@@ -69,6 +69,7 @@ export class UmbAuthFlow {
69
69
  #storageBackend;
70
70
  // state
71
71
  #configuration;
72
+ #openIdConnectUrl;
72
73
  #redirectUri;
73
74
  #clientId;
74
75
  #scope;
@@ -76,15 +77,10 @@ export class UmbAuthFlow {
76
77
  #refreshToken;
77
78
  #accessTokenResponse;
78
79
  constructor(openIdConnectUrl, redirectUri, clientId = 'umbraco-back-office', scope = 'offline_access') {
80
+ this.#openIdConnectUrl = openIdConnectUrl;
79
81
  this.#redirectUri = redirectUri;
80
82
  this.#clientId = clientId;
81
83
  this.#scope = scope;
82
- this.#configuration = new AuthorizationServiceConfiguration({
83
- authorization_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/authorize`,
84
- token_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/token`,
85
- revocation_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/revoke`,
86
- end_session_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/signout`,
87
- });
88
84
  this.#notifier = new AuthorizationNotifier();
89
85
  this.#tokenHandler = new BaseTokenRequestHandler(requestor);
90
86
  this.#storageBackend = new LocalStorageBackend();
@@ -122,6 +118,10 @@ export class UmbAuthFlow {
122
118
  * - If there is no new authorization to be made, do nothing
123
119
  */
124
120
  async setInitialState() {
121
+ // Ensure there is a connection to the server
122
+ if (!this.#configuration) {
123
+ await this.fetchServiceConfiguration();
124
+ }
125
125
  const tokenResponseJson = await this.#storageBackend.getItem(TOKEN_RESPONSE_NAME);
126
126
  if (tokenResponseJson) {
127
127
  const response = new TokenResponse(JSON.parse(tokenResponseJson));
@@ -142,12 +142,23 @@ export class UmbAuthFlow {
142
142
  completeAuthorizationIfPossible() {
143
143
  return this.#authorizationHandler.completeAuthorizationRequestIfPossible();
144
144
  }
145
+ /**
146
+ * This method will query the server for the service configuration usually found at /.well-known/openid-configuration.
147
+ */
148
+ async fetchServiceConfiguration() {
149
+ const response = await AuthorizationServiceConfiguration.fetchFromIssuer(this.#openIdConnectUrl, requestor);
150
+ this.#configuration = response;
151
+ }
145
152
  /**
146
153
  * This method will make an authorization request to the server.
147
154
  *
148
155
  * @param username The username to use for the authorization request. It will be provided to the OpenID server as a hint.
149
156
  */
150
157
  makeAuthorizationRequest(username) {
158
+ if (!this.#configuration) {
159
+ console.log('Unknown service configuration');
160
+ throw new Error('Unknown service configuration');
161
+ }
151
162
  const extras = { prompt: 'consent', access_type: 'offline' };
152
163
  if (username) {
153
164
  extras['login_hint'] = username;
@@ -188,6 +199,10 @@ export class UmbAuthFlow {
188
199
  * @returns The access token for the user.
189
200
  */
190
201
  async performWithFreshTokens() {
202
+ if (!this.#configuration) {
203
+ console.log('Unknown service configuration');
204
+ return Promise.reject('Unknown service configuration');
205
+ }
191
206
  if (!this.#refreshToken) {
192
207
  console.log('Missing refreshToken.');
193
208
  return Promise.resolve('Missing refreshToken.');
@@ -220,6 +235,10 @@ export class UmbAuthFlow {
220
235
  * This method will make a token request to the server using the authorization code.
221
236
  */
222
237
  async #makeRefreshTokenRequest(code, codeVerifier) {
238
+ if (!this.#configuration) {
239
+ console.log('Unknown service configuration');
240
+ return Promise.reject();
241
+ }
223
242
  const extras = {};
224
243
  if (codeVerifier) {
225
244
  extras.code_verifier = codeVerifier;
@@ -29,11 +29,6 @@ export class UmbRepositoryItemsManager {
29
29
  setUniques(uniques) {
30
30
  this.#uniques.next(uniques);
31
31
  //TODO: Check if it's safe to call requestItems here.
32
- // We don't have to request items if there is no uniques.
33
- if (uniques.length === 0) {
34
- this.#items.next([]);
35
- return;
36
- }
37
32
  this.#requestItems();
38
33
  }
39
34
  getItems() {
@@ -2,4 +2,3 @@ export * from './input.event.js';
2
2
  export * from './change.event.js';
3
3
  export * from './delete.event.js';
4
4
  export * from './executed.event.js';
5
- export * from './selected.event.js';
@@ -2,4 +2,3 @@ export * from './input.event.js';
2
2
  export * from './change.event.js';
3
3
  export * from './delete.event.js';
4
4
  export * from './executed.event.js';
5
- export * from './selected.event.js';
@@ -6,54 +6,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## Unreleased
8
8
 
9
- ## 6.7.0 - 2023-08-30
10
-
11
- ### Added
12
- - New `help_accessibility` option displays the keyboard shortcut to open the in-application help in the status bar. #TINY-9379
13
- - Added a new `InsertNewBlockBefore` command which inserts an empty block before the block containing the current selection. #TINY-10022
14
- - Added a new `InsertNewBlockAfter` command which inserts an empty block after the block containing the current selection. #TINY-10022
15
-
16
- ### Improved
17
- - Adding a newline after a table would, in some specific cases, not work. #TINY-9863
18
- - Menus now have a slight margin at the top and bottom to more clearly separate them from the frame edge. #TINY-9978
19
- - Updated **More** toolbar button tooltip text from *More...* to *Reveal or hide additional toolbar items*. #TINY-9629
20
- - Where multiple case sensitive variants of a translation key are provided, they will now all be preserved in the translation object instead of just the lowercase variant. #TINY-10115
21
- - Improved screen reader announcements of the column and row selection in the grid presented by the **Table** menu and toolbar item. #TINY-10140
22
- - Improved the keyboard focus visibility for links inside dialogs. #TINY-10124
23
-
24
- ### Changed
25
- - Change `UndoLevelType` from `enum` to union type so that it is easier to use. #TINY-9764
26
- - The pattern replacement removed spaces if they were contained within a tag that only contained a space and the text to replace. #TINY-9744
27
- - If loading content CSS takes more than 500ms, the editor will be set to an *in progress* state until the CSS is ready. #TINY-10008
28
-
29
- ### Fixed
30
- - Applying an ordered or unordered list to a selected checklist incorrectly turned the list into paragraphs. #TINY-9975
31
- - Returning an empty string in a custom context menu update function resulted in a small white line appearing on right-click and the browser-native context menu would not present. #TINY-9842
32
- - For sufficiently long URLs and sufficiently wide windows, URL autocompletion hid middle portions of the URL from view. #TINY-10017
33
- - Numeric input in toolbar items did not disable when a switching from edit to read-only mode. #TINY-10129
34
- - The Quick Toolbars plugin showed text alignment buttons on pagebreaks. #TINY-10054
35
- - Creating lists in empty blocks sometimes, and incorrectly, converted adjacent block elements into list items. #TINY-10136
36
- - Creating a list from multiple `<div>` elements only created a partial list. #TINY-9872
37
- - Tab navigation incorrectly stopped around `iframe` dialog components. #TINY-9815
38
- - It was possible to delete the sole empty block immediately before a `<details>` element if it was nested within another `<details>` element. #TINY-9965
39
- - Deleting `<li>` elements that only contained `<br>` tags sometimes caused a crash. #TINY-6888
40
- - It was possible to remove the `<summary>` element from a `<details>` element by dragging and dropping. #TINY-9960
41
- - It was possible to break `<summary>` elements if content containing block elements was dragged-and-dropped inside them. #TINY-9960
42
- - Contents were not removed from the drag start source if dragging and dropping internally into a transparent block element. #TINY-9960
43
- - Using the Media plugin unexpectedly changed `<script>` tags in the editor body to `<image>` tags. #TINY-10007
44
- - In some circumstances, pressing the **Enter** key scrolled the entire page. #TINY-9828
45
- - The border styles of a table were incorrectly split into a longhand form after table dialog updates. #TINY-9843
46
- - Links in **Help → Help → Plugins** and **Help → Help → Version** were not navigable by keyboard. #TINY-10071
47
- - Fixed the inability to insert content next to the `<details>` element when it is the first or last content element. Pressing the **Up** or **Down** arrow key now inserts a block element before or after the `<details>` element. #TINY-9827
48
- - An empty element with a `contenteditable="true"` attribute within a noneditable root was deleted when the Backspace key was pressed. #TINY-10011
49
- - The `color_cols` option was not respected when set to the value 5 with a custom `color_map` specified. #TINY-10126
50
- - In Safari on macOS, deleting backwards within a `<summary>` element removed the entire `<details>` element if it had no other content. #TINY-10123
51
-
52
- ## 6.6.2 - 2023-08-09
53
-
54
- ### Fixed
55
- - An "Uncaught TypeError: Cannot read properties of null" error would sometimes be thrown when updating the content of a `streamContent: true` iframe dialog component. #TINY-10128
56
-
57
9
  ## 6.6.1 - 2023-08-02
58
10
 
59
11
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tinymce/tinymce",
3
- "version": "6.7.0",
3
+ "version": "6.6.1",
4
4
  "description": "Web based JavaScript HTML WYSIWYG editor control.",
5
5
  "license": [
6
6
  "MIT-only"
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TinyMCE version 6.7.0 (2023-08-30)
2
+ * TinyMCE version 6.6.1 (2023-08-02)
3
3
  */
4
4
 
5
5
  (function () {