@vendure/admin-ui 1.3.3 → 1.4.1

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 (252) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +87 -162
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +2020 -402
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-customer.umd.js +79 -57
  6. package/bundles/vendure-admin-ui-customer.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-marketing.umd.js +11 -1
  8. package/bundles/vendure-admin-ui-marketing.umd.js.map +1 -1
  9. package/bundles/vendure-admin-ui-order.umd.js +10 -2
  10. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  11. package/bundles/vendure-admin-ui-settings.umd.js +156 -153
  12. package/bundles/vendure-admin-ui-settings.umd.js.map +1 -1
  13. package/catalog/components/collection-detail/collection-detail.component.d.ts +0 -1
  14. package/catalog/components/collection-list/collection-list.component.d.ts +3 -0
  15. package/catalog/components/facet-detail/facet-detail.component.d.ts +0 -1
  16. package/catalog/components/facet-list/facet-list.component.d.ts +3 -5
  17. package/catalog/components/product-detail/product-detail.component.d.ts +0 -1
  18. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  19. package/core/app.component.d.ts +1 -0
  20. package/core/common/base-detail.component.d.ts +42 -1
  21. package/core/common/base-entity-resolver.d.ts +28 -1
  22. package/core/common/base-list.component.d.ts +75 -1
  23. package/core/common/component-registry-types.d.ts +46 -0
  24. package/core/common/generated-types.d.ts +282 -23
  25. package/core/common/utilities/get-default-ui-language.d.ts +1 -0
  26. package/core/common/version.d.ts +1 -1
  27. package/core/components/app-shell/app-shell.component.d.ts +1 -1
  28. package/core/components/ui-language-switcher-dialog/ui-language-switcher-dialog.component.d.ts +17 -4
  29. package/core/components/user-menu/user-menu.component.d.ts +1 -1
  30. package/core/data/client-state/client-defaults.d.ts +1 -1
  31. package/core/data/definitions/client-definitions.d.ts +3 -1
  32. package/core/data/definitions/customer-definitions.d.ts +1 -0
  33. package/core/data/definitions/settings-definitions.d.ts +1 -0
  34. package/core/data/providers/client-data.service.d.ts +3 -1
  35. package/core/data/providers/data.service.d.ts +54 -12
  36. package/core/data/providers/settings-data.service.d.ts +3 -0
  37. package/core/data/query-result.d.ts +11 -2
  38. package/core/providers/custom-detail-component/custom-detail-component-types.d.ts +25 -0
  39. package/core/providers/custom-detail-component/custom-detail-component.service.d.ts +15 -0
  40. package/core/providers/custom-field-component/custom-field-component.service.d.ts +3 -3
  41. package/core/providers/local-storage/local-storage.service.d.ts +1 -0
  42. package/core/providers/modal/modal.service.d.ts +41 -12
  43. package/core/providers/nav-builder/nav-builder-types.d.ts +19 -1
  44. package/core/providers/nav-builder/nav-builder.service.d.ts +14 -10
  45. package/core/providers/notification/notification.service.d.ts +37 -0
  46. package/core/public_api.d.ts +8 -0
  47. package/core/shared/components/action-bar-items/action-bar-items.component.d.ts +2 -1
  48. package/core/shared/components/asset-picker-dialog/asset-picker-dialog.component.d.ts +18 -0
  49. package/core/shared/components/asset-preview/asset-preview.component.d.ts +0 -1
  50. package/core/shared/components/chip/chip.component.d.ts +20 -0
  51. package/core/shared/components/currency-input/currency-input.component.d.ts +11 -0
  52. package/core/shared/components/custom-detail-component-host/custom-detail-component-host.component.d.ts +17 -0
  53. package/core/shared/components/data-table/data-table.component.d.ts +59 -0
  54. package/core/shared/components/datetime-picker/datetime-picker.component.d.ts +17 -0
  55. package/core/shared/components/dropdown/dropdown.component.d.ts +25 -0
  56. package/core/shared/components/extension-host/extension-host.service.d.ts +3 -1
  57. package/core/shared/components/facet-value-selector/facet-value-selector.component.d.ts +22 -0
  58. package/core/shared/components/modal-dialog/modal-dialog.component.d.ts +1 -1
  59. package/core/shared/components/object-tree/object-tree.component.d.ts +8 -0
  60. package/core/shared/components/order-state-label/order-state-label.component.d.ts +10 -0
  61. package/core/shared/components/product-selector/product-selector.component.d.ts +12 -0
  62. package/core/shared/components/rich-text-editor/rich-text-editor.component.d.ts +12 -1
  63. package/core/shared/components/tabbed-custom-fields/tabbed-custom-fields.component.d.ts +21 -0
  64. package/core/shared/components/ui-extension-point/ui-extension-point.component.d.ts +15 -0
  65. package/core/shared/directives/if-multichannel.directive.d.ts +14 -0
  66. package/core/shared/directives/if-permissions.directive.d.ts +3 -0
  67. package/core/shared/dynamic-form-inputs/boolean-form-input/boolean-form-input.component.d.ts +7 -0
  68. package/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.d.ts +32 -0
  69. package/core/shared/dynamic-form-inputs/currency-form-input/currency-form-input.component.d.ts +7 -0
  70. package/core/shared/dynamic-form-inputs/customer-group-form-input/customer-group-form-input.component.d.ts +8 -0
  71. package/core/shared/dynamic-form-inputs/date-form-input/date-form-input.component.d.ts +10 -0
  72. package/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.d.ts +8 -0
  73. package/core/shared/dynamic-form-inputs/number-form-input/number-form-input.component.d.ts +12 -0
  74. package/core/shared/dynamic-form-inputs/password-form-input/password-form-input.component.d.ts +7 -0
  75. package/core/shared/dynamic-form-inputs/product-selector-form-input/product-selector-form-input.component.d.ts +8 -0
  76. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +40 -3
  77. package/core/shared/dynamic-form-inputs/relation-form-input/relation-form-input.component.d.ts +9 -0
  78. package/core/shared/dynamic-form-inputs/rich-text-form-input/rich-text-form-input.component.d.ts +16 -0
  79. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +9 -0
  80. package/core/shared/dynamic-form-inputs/text-form-input/text-form-input.component.d.ts +12 -3
  81. package/core/shared/dynamic-form-inputs/textarea-form-input/textarea-form-input.component.d.ts +7 -0
  82. package/core/shared/pipes/asset-preview.pipe.d.ts +14 -0
  83. package/core/shared/pipes/duration.pipe.d.ts +8 -0
  84. package/core/shared/pipes/file-size.pipe.d.ts +8 -0
  85. package/core/shared/pipes/has-permission.pipe.d.ts +3 -1
  86. package/core/shared/pipes/locale-currency-name.pipe.d.ts +8 -0
  87. package/core/shared/pipes/locale-currency.pipe.d.ts +12 -0
  88. package/core/shared/pipes/locale-date.pipe.d.ts +7 -0
  89. package/core/shared/pipes/locale-language-name.pipe.d.ts +9 -1
  90. package/core/shared/pipes/locale-region-name.pipe.d.ts +18 -0
  91. package/core/shared/pipes/time-ago.pipe.d.ts +8 -0
  92. package/core/vendure-admin-ui-core.metadata.json +1 -1
  93. package/customer/components/customer-detail/customer-detail.component.d.ts +2 -3
  94. package/customer/components/customer-group-detail-dialog/customer-group-detail-dialog.component.d.ts +14 -3
  95. package/customer/vendure-admin-ui-customer.metadata.json +1 -1
  96. package/esm2015/catalog/catalog.module.js +29 -28
  97. package/esm2015/catalog/components/asset-detail/asset-detail.component.js +2 -10
  98. package/esm2015/catalog/components/collection-detail/collection-detail.component.js +3 -16
  99. package/esm2015/catalog/components/collection-list/collection-list.component.js +23 -5
  100. package/esm2015/catalog/components/facet-detail/facet-detail.component.js +3 -15
  101. package/esm2015/catalog/components/facet-list/facet-list.component.js +24 -9
  102. package/esm2015/catalog/components/product-assets/product-assets.component.js +2 -2
  103. package/esm2015/catalog/components/product-detail/product-detail.component.js +5 -27
  104. package/esm2015/catalog/components/product-variants-list/product-variants-list.component.js +3 -3
  105. package/esm2015/catalog/components/update-product-option-dialog/update-product-option-dialog.component.js +2 -2
  106. package/esm2015/catalog/components/variant-price-detail/variant-price-detail.component.js +2 -2
  107. package/esm2015/core/app.component.js +20 -2
  108. package/esm2015/core/common/base-detail.component.js +53 -1
  109. package/esm2015/core/common/base-entity-resolver.js +29 -2
  110. package/esm2015/core/common/base-list.component.js +76 -2
  111. package/esm2015/core/common/component-registry-types.js +1 -1
  112. package/esm2015/core/common/generated-types.js +1 -1
  113. package/esm2015/core/common/introspection-result.js +249 -183
  114. package/esm2015/core/common/utilities/get-default-ui-language.js +9 -1
  115. package/esm2015/core/common/version.js +2 -2
  116. package/esm2015/core/components/app-shell/app-shell.component.js +12 -7
  117. package/esm2015/core/components/main-nav/main-nav.component.js +2 -2
  118. package/esm2015/core/components/ui-language-switcher-dialog/ui-language-switcher-dialog.component.js +281 -5
  119. package/esm2015/core/components/user-menu/user-menu.component.js +3 -3
  120. package/esm2015/core/data/client-state/client-defaults.js +5 -2
  121. package/esm2015/core/data/client-state/client-resolvers.js +32 -33
  122. package/esm2015/core/data/definitions/client-definitions.js +18 -3
  123. package/esm2015/core/data/definitions/customer-definitions.js +21 -25
  124. package/esm2015/core/data/definitions/settings-definitions.js +50 -5
  125. package/esm2015/core/data/providers/client-data.service.js +15 -4
  126. package/esm2015/core/data/providers/data.service.js +44 -2
  127. package/esm2015/core/data/providers/settings-data.service.js +12 -4
  128. package/esm2015/core/data/query-result.js +14 -4
  129. package/esm2015/core/providers/custom-detail-component/custom-detail-component-types.js +2 -0
  130. package/esm2015/core/providers/custom-detail-component/custom-detail-component.service.js +44 -0
  131. package/esm2015/core/providers/custom-field-component/custom-field-component.service.js +6 -6
  132. package/esm2015/core/providers/local-storage/local-storage.service.js +1 -1
  133. package/esm2015/core/providers/modal/modal.service.js +20 -12
  134. package/esm2015/core/providers/nav-builder/nav-builder-types.js +1 -1
  135. package/esm2015/core/providers/nav-builder/nav-builder.service.js +15 -11
  136. package/esm2015/core/providers/notification/notification.service.js +24 -1
  137. package/esm2015/core/public_api.js +9 -1
  138. package/esm2015/core/shared/components/action-bar/action-bar.component.js +1 -1
  139. package/esm2015/core/shared/components/action-bar-items/action-bar-items.component.js +3 -3
  140. package/esm2015/core/shared/components/address-form/address-form.component.js +2 -2
  141. package/esm2015/core/shared/components/asset-picker-dialog/asset-picker-dialog.component.js +19 -1
  142. package/esm2015/core/shared/components/asset-preview/asset-preview.component.js +2 -6
  143. package/esm2015/core/shared/components/channel-assignment-control/channel-assignment-control.component.js +1 -1
  144. package/esm2015/core/shared/components/chip/chip.component.js +12 -1
  145. package/esm2015/core/shared/components/currency-input/currency-input.component.js +12 -1
  146. package/esm2015/core/shared/components/custom-detail-component-host/custom-detail-component-host.component.js +44 -0
  147. package/esm2015/core/shared/components/data-table/data-table.component.js +60 -1
  148. package/esm2015/core/shared/components/datetime-picker/datetime-picker.component.js +17 -1
  149. package/esm2015/core/shared/components/dropdown/dropdown.component.js +26 -1
  150. package/esm2015/core/shared/components/extension-host/extension-host.component.js +3 -3
  151. package/esm2015/core/shared/components/extension-host/extension-host.service.js +16 -2
  152. package/esm2015/core/shared/components/facet-value-selector/facet-value-selector.component.js +23 -1
  153. package/esm2015/core/shared/components/modal-dialog/modal-dialog.component.js +2 -2
  154. package/esm2015/core/shared/components/object-tree/object-tree.component.js +9 -1
  155. package/esm2015/core/shared/components/order-state-label/order-state-label.component.js +11 -1
  156. package/esm2015/core/shared/components/product-selector/product-selector.component.js +13 -1
  157. package/esm2015/core/shared/components/rich-text-editor/rich-text-editor.component.js +14 -3
  158. package/esm2015/core/shared/components/tabbed-custom-fields/tabbed-custom-fields.component.js +48 -0
  159. package/esm2015/core/shared/components/title-input/title-input.component.js +1 -1
  160. package/esm2015/core/shared/components/ui-extension-point/ui-extension-point.component.js +31 -0
  161. package/esm2015/core/shared/directives/if-multichannel.directive.js +15 -1
  162. package/esm2015/core/shared/directives/if-permissions.directive.js +4 -1
  163. package/esm2015/core/shared/dynamic-form-inputs/boolean-form-input/boolean-form-input.component.js +8 -1
  164. package/esm2015/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.js +125 -0
  165. package/esm2015/core/shared/dynamic-form-inputs/currency-form-input/currency-form-input.component.js +8 -1
  166. package/esm2015/core/shared/dynamic-form-inputs/customer-group-form-input/customer-group-form-input.component.js +9 -1
  167. package/esm2015/core/shared/dynamic-form-inputs/date-form-input/date-form-input.component.js +21 -2
  168. package/esm2015/core/shared/dynamic-form-inputs/dynamic-form-input/dynamic-form-input.component.js +2 -1
  169. package/esm2015/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.js +9 -1
  170. package/esm2015/core/shared/dynamic-form-inputs/number-form-input/number-form-input.component.js +29 -2
  171. package/esm2015/core/shared/dynamic-form-inputs/password-form-input/password-form-input.component.js +8 -1
  172. package/esm2015/core/shared/dynamic-form-inputs/product-selector-form-input/product-selector-form-input.component.js +9 -1
  173. package/esm2015/core/shared/dynamic-form-inputs/register-dynamic-input-components.js +42 -2
  174. package/esm2015/core/shared/dynamic-form-inputs/relation-form-input/relation-form-input.component.js +10 -1
  175. package/esm2015/core/shared/dynamic-form-inputs/rich-text-form-input/rich-text-form-input.component.js +20 -0
  176. package/esm2015/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.js +14 -2
  177. package/esm2015/core/shared/dynamic-form-inputs/text-form-input/text-form-input.component.js +17 -2
  178. package/esm2015/core/shared/dynamic-form-inputs/textarea-form-input/textarea-form-input.component.js +8 -1
  179. package/esm2015/core/shared/pipes/asset-preview.pipe.js +15 -1
  180. package/esm2015/core/shared/pipes/duration.pipe.js +9 -1
  181. package/esm2015/core/shared/pipes/file-size.pipe.js +9 -1
  182. package/esm2015/core/shared/pipes/has-permission.pipe.js +4 -2
  183. package/esm2015/core/shared/pipes/locale-base.pipe.js +7 -4
  184. package/esm2015/core/shared/pipes/locale-currency-name.pipe.js +9 -1
  185. package/esm2015/core/shared/pipes/locale-currency.pipe.js +13 -1
  186. package/esm2015/core/shared/pipes/locale-date.pipe.js +8 -1
  187. package/esm2015/core/shared/pipes/locale-language-name.pipe.js +10 -2
  188. package/esm2015/core/shared/pipes/locale-region-name.pipe.js +48 -0
  189. package/esm2015/core/shared/pipes/time-ago.pipe.js +9 -1
  190. package/esm2015/core/shared/shared.module.js +13 -1
  191. package/esm2015/customer/components/customer-detail/customer-detail.component.js +5 -16
  192. package/esm2015/customer/components/customer-group-detail-dialog/customer-group-detail-dialog.component.js +32 -3
  193. package/esm2015/customer/components/customer-group-list/customer-group-list.component.js +22 -18
  194. package/esm2015/marketing/components/promotion-detail/promotion-detail.component.js +9 -2
  195. package/esm2015/order/components/order-detail/order-detail.component.js +11 -3
  196. package/esm2015/settings/components/admin-detail/admin-detail.component.js +3 -14
  197. package/esm2015/settings/components/channel-detail/channel-detail.component.js +3 -14
  198. package/esm2015/settings/components/country-detail/country-detail.component.js +11 -3
  199. package/esm2015/settings/components/country-list/country-list.component.js +19 -7
  200. package/esm2015/settings/components/global-settings/global-settings.component.js +3 -14
  201. package/esm2015/settings/components/payment-method-detail/payment-method-detail.component.js +9 -2
  202. package/esm2015/settings/components/profile/profile.component.js +3 -14
  203. package/esm2015/settings/components/shipping-method-detail/shipping-method-detail.component.js +3 -16
  204. package/esm2015/settings/components/tax-category-detail/tax-category-detail.component.js +13 -3
  205. package/esm2015/settings/components/tax-rate-detail/tax-rate-detail.component.js +9 -2
  206. package/esm2015/settings/components/zone-detail-dialog/zone-detail-dialog.component.js +32 -3
  207. package/esm2015/settings/components/zone-list/zone-list.component.js +19 -8
  208. package/fesm2015/vendure-admin-ui-catalog.js +83 -102
  209. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  210. package/fesm2015/vendure-admin-ui-core.js +1863 -339
  211. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  212. package/fesm2015/vendure-admin-ui-customer.js +54 -34
  213. package/fesm2015/vendure-admin-ui-customer.js.map +1 -1
  214. package/fesm2015/vendure-admin-ui-marketing.js +8 -1
  215. package/fesm2015/vendure-admin-ui-marketing.js.map +1 -1
  216. package/fesm2015/vendure-admin-ui-order.js +10 -2
  217. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  218. package/fesm2015/vendure-admin-ui-settings.js +110 -85
  219. package/fesm2015/vendure-admin-ui-settings.js.map +1 -1
  220. package/marketing/components/promotion-detail/promotion-detail.component.d.ts +2 -1
  221. package/marketing/vendure-admin-ui-marketing.metadata.json +1 -1
  222. package/order/vendure-admin-ui-order.metadata.json +1 -1
  223. package/package.json +6 -5
  224. package/settings/components/admin-detail/admin-detail.component.d.ts +0 -1
  225. package/settings/components/channel-detail/channel-detail.component.d.ts +0 -1
  226. package/settings/components/country-detail/country-detail.component.d.ts +2 -1
  227. package/settings/components/country-list/country-list.component.d.ts +7 -2
  228. package/settings/components/global-settings/global-settings.component.d.ts +0 -1
  229. package/settings/components/payment-method-detail/payment-method-detail.component.d.ts +2 -1
  230. package/settings/components/profile/profile.component.d.ts +0 -1
  231. package/settings/components/shipping-method-detail/shipping-method-detail.component.d.ts +0 -1
  232. package/settings/components/tax-category-detail/tax-category-detail.component.d.ts +2 -1
  233. package/settings/components/tax-rate-detail/tax-rate-detail.component.d.ts +2 -1
  234. package/settings/components/zone-detail-dialog/zone-detail-dialog.component.d.ts +14 -3
  235. package/settings/components/zone-list/zone-list.component.d.ts +6 -2
  236. package/settings/vendure-admin-ui-settings.metadata.json +1 -1
  237. package/static/i18n-messages/cs.json +7 -0
  238. package/static/i18n-messages/de.json +7 -0
  239. package/static/i18n-messages/en.json +7 -0
  240. package/static/i18n-messages/es.json +8 -1
  241. package/static/i18n-messages/fr.json +7 -0
  242. package/static/i18n-messages/it.json +7 -0
  243. package/static/i18n-messages/pl.json +7 -0
  244. package/static/i18n-messages/pt_BR.json +7 -0
  245. package/static/i18n-messages/pt_PT.json +7 -0
  246. package/static/i18n-messages/ru.json +7 -0
  247. package/static/i18n-messages/uk.json +7 -0
  248. package/static/i18n-messages/zh_Hans.json +7 -0
  249. package/static/i18n-messages/zh_Hant.json +7 -0
  250. package/static/styles/theme/dark.scss +9 -0
  251. package/static/styles/theme/default.scss +8 -0
  252. package/static/theme.min.css +1 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Injector, Component, Inject, ChangeDetectionStrategy, ComponentFactoryResolver, APP_INITIALIZER, ViewChild, HostListener, ViewContainerRef, EventEmitter, Input, Output, NgModule, HostBinding, ContentChild, ChangeDetectorRef, forwardRef, TemplateRef, ContentChildren, Directive, ElementRef, Optional, SkipSelf, ViewChildren, Pipe, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
+ import { Injectable, Injector, isDevMode, Component, Inject, HostListener, ChangeDetectionStrategy, ComponentFactoryResolver, APP_INITIALIZER, ViewChild, ViewContainerRef, EventEmitter, Input, Output, NgModule, ChangeDetectorRef, HostBinding, ContentChild, forwardRef, TemplateRef, ContentChildren, Directive, ElementRef, Optional, SkipSelf, ViewChildren, Pipe, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { Location, DOCUMENT, CommonModule, PlatformLocation } from '@angular/common';
5
5
  import { map, filter, distinctUntilChanged, skip, takeUntil, tap, take, finalize, concatMap, bufferCount, switchMap, mergeMap, mapTo, catchError, startWith, throttleTime, shareReplay, scan, debounceTime, delay } from 'rxjs/operators';
@@ -29,6 +29,7 @@ import { ApolloLink as ApolloLink$1 } from '@apollo/client/link/core';
29
29
  import { createUploadLink } from 'apollo-upload-client';
30
30
  import { omit } from '@vendure/common/lib/omit';
31
31
  import { __awaiter } from 'tslib';
32
+ import { CodeJar } from 'codejar';
32
33
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
33
34
  import { Overlay, OverlayModule } from '@angular/cdk/overlay';
34
35
  import { ClarityModule } from '@clr/angular';
@@ -455,9 +456,20 @@ const SET_AS_LOGGED_OUT = gql `
455
456
  }
456
457
  ${USER_STATUS_FRAGMENT}
457
458
  `;
458
- const SET_UI_LANGUAGE = gql `
459
- mutation SetUiLanguage($languageCode: LanguageCode!) {
459
+ const SET_UI_LANGUAGE_AND_LOCALE = gql `
460
+ mutation SetUiLanguage($languageCode: LanguageCode!, $locale: String) {
460
461
  setUiLanguage(languageCode: $languageCode) @client
462
+ setUiLocale(locale: $locale) @client
463
+ }
464
+ `;
465
+ const SET_UI_LOCALE = gql `
466
+ mutation SetUiLocale($locale: String) {
467
+ setUiLocale(locale: $locale) @client
468
+ }
469
+ `;
470
+ const SET_DISPLAY_UI_EXTENSION_POINTS = gql `
471
+ mutation SetDisplayUiExtensionPoints($display: Boolean!) {
472
+ setDisplayUiExtensionPoints(display: $display) @client
461
473
  }
462
474
  `;
463
475
  const SET_CONTENT_LANGUAGE = gql `
@@ -489,8 +501,10 @@ const GET_UI_STATE = gql `
489
501
  query GetUiState {
490
502
  uiState @client {
491
503
  language
504
+ locale
492
505
  contentLanguage
493
506
  theme
507
+ displayUiExtensionPoints
494
508
  }
495
509
  }
496
510
  `;
@@ -504,8 +518,10 @@ const GET_CLIENT_STATE = gql `
504
518
  }
505
519
  uiState @client {
506
520
  language
521
+ locale
507
522
  contentLanguage
508
523
  theme
524
+ displayUiExtensionPoints
509
525
  }
510
526
  }
511
527
  ${USER_STATUS_FRAGMENT}
@@ -528,8 +544,12 @@ const UPDATE_USER_CHANNELS = gql `
528
544
  `;
529
545
 
530
546
  /**
547
+ * @description
531
548
  * This class wraps the Apollo Angular QueryRef object and exposes some getters
532
549
  * for convenience.
550
+ *
551
+ * @docsCategory providers
552
+ * @docsPage DataService
533
553
  */
534
554
  class QueryResult {
535
555
  constructor(queryRef, apollo) {
@@ -539,11 +559,13 @@ class QueryResult {
539
559
  this.valueChanges = queryRef.valueChanges;
540
560
  }
541
561
  /**
542
- * Refetch this query whenever the active Channel changes.
562
+ * @description
563
+ * Re-fetch this query whenever the active Channel changes.
543
564
  */
544
565
  refetchOnChannelChange() {
545
- const userStatus$ = this.apollo.watchQuery({ query: GET_USER_STATUS })
546
- .valueChanges;
566
+ const userStatus$ = this.apollo.watchQuery({
567
+ query: GET_USER_STATUS,
568
+ }).valueChanges;
547
569
  const activeChannelId$ = userStatus$.pipe(map(data => data.data.userStatus.activeChannelId), filter(notNullOrUndefined), distinctUntilChanged(), skip(1), takeUntil(this.completed$));
548
570
  const loggedOut$ = userStatus$.pipe(map(data => data.data.userStatus.isLoggedIn), distinctUntilChanged(), skip(1), filter(isLoggedIn => !isLoggedIn), takeUntil(this.completed$));
549
571
  this.valueChanges = merge(activeChannelId$, this.queryRef.valueChanges).pipe(tap(val => {
@@ -555,6 +577,7 @@ class QueryResult {
555
577
  return this;
556
578
  }
557
579
  /**
580
+ * @description
558
581
  * Returns an Observable which emits a single result and then completes.
559
582
  */
560
583
  get single$() {
@@ -564,6 +587,7 @@ class QueryResult {
564
587
  }));
565
588
  }
566
589
  /**
590
+ * @description
567
591
  * Returns an Observable which emits until unsubscribed.
568
592
  */
569
593
  get stream$() {
@@ -576,12 +600,14 @@ class QueryResult {
576
600
  return this.queryRef;
577
601
  }
578
602
  /**
603
+ * @description
579
604
  * Returns a single-result Observable after applying the map function.
580
605
  */
581
606
  mapSingle(mapFn) {
582
607
  return this.single$.pipe(map(mapFn));
583
608
  }
584
609
  /**
610
+ * @description
585
611
  * Returns a multiple-result Observable after applying the map function.
586
612
  */
587
613
  mapStream(mapFn) {
@@ -664,6 +690,8 @@ const DELETE_COUNTRY = gql `
664
690
  const ZONE_FRAGMENT = gql `
665
691
  fragment Zone on Zone {
666
692
  id
693
+ createdAt
694
+ updatedAt
667
695
  name
668
696
  members {
669
697
  ...Country
@@ -674,10 +702,7 @@ const ZONE_FRAGMENT = gql `
674
702
  const GET_ZONES = gql `
675
703
  query GetZones {
676
704
  zones {
677
- id
678
- createdAt
679
- updatedAt
680
- name
705
+ ...Zone
681
706
  members {
682
707
  createdAt
683
708
  updatedAt
@@ -688,6 +713,7 @@ const GET_ZONES = gql `
688
713
  }
689
714
  }
690
715
  }
716
+ ${ZONE_FRAGMENT}
691
717
  `;
692
718
  const GET_ZONE = gql `
693
719
  query GetZone($id: ID!) {
@@ -819,6 +845,29 @@ const GET_TAX_RATE_LIST = gql `
819
845
  }
820
846
  ${TAX_RATE_FRAGMENT}
821
847
  `;
848
+ const GET_TAX_RATE_LIST_SIMPLE = gql `
849
+ query GetTaxRateListSimple($options: TaxRateListOptions) {
850
+ taxRates(options: $options) {
851
+ items {
852
+ id
853
+ createdAt
854
+ updatedAt
855
+ name
856
+ enabled
857
+ value
858
+ category {
859
+ id
860
+ name
861
+ }
862
+ zone {
863
+ id
864
+ name
865
+ }
866
+ }
867
+ totalItems
868
+ }
869
+ }
870
+ `;
822
871
  const GET_TAX_RATE = gql `
823
872
  query GetTaxRate($id: ID!) {
824
873
  taxRate(id: $id) {
@@ -1046,6 +1095,7 @@ const CUSTOM_FIELD_CONFIG_FRAGMENT = gql `
1046
1095
  }
1047
1096
  readonly
1048
1097
  nullable
1098
+ ui
1049
1099
  }
1050
1100
  `;
1051
1101
  const STRING_CUSTOM_FIELD_FRAGMENT = gql `
@@ -1183,9 +1233,15 @@ const GET_SERVER_CONFIG = gql `
1183
1233
  Collection {
1184
1234
  ...CustomFields
1185
1235
  }
1236
+ Country {
1237
+ ...CustomFields
1238
+ }
1186
1239
  Customer {
1187
1240
  ...CustomFields
1188
1241
  }
1242
+ CustomerGroup {
1243
+ ...CustomFields
1244
+ }
1189
1245
  Facet {
1190
1246
  ...CustomFields
1191
1247
  }
@@ -1204,6 +1260,9 @@ const GET_SERVER_CONFIG = gql `
1204
1260
  OrderLine {
1205
1261
  ...CustomFields
1206
1262
  }
1263
+ PaymentMethod {
1264
+ ...CustomFields
1265
+ }
1207
1266
  Product {
1208
1267
  ...CustomFields
1209
1268
  }
@@ -1216,12 +1275,24 @@ const GET_SERVER_CONFIG = gql `
1216
1275
  ProductVariant {
1217
1276
  ...CustomFields
1218
1277
  }
1278
+ Promotion {
1279
+ ...CustomFields
1280
+ }
1219
1281
  ShippingMethod {
1220
1282
  ...CustomFields
1221
1283
  }
1284
+ TaxCategory {
1285
+ ...CustomFields
1286
+ }
1287
+ TaxRate {
1288
+ ...CustomFields
1289
+ }
1222
1290
  User {
1223
1291
  ...CustomFields
1224
1292
  }
1293
+ Zone {
1294
+ ...CustomFields
1295
+ }
1225
1296
  }
1226
1297
  }
1227
1298
  }
@@ -1677,9 +1748,15 @@ class ClientDataService {
1677
1748
  uiState() {
1678
1749
  return this.baseDataService.query(GET_UI_STATE, {}, 'cache-first');
1679
1750
  }
1680
- setUiLanguage(languageCode) {
1681
- return this.baseDataService.mutate(SET_UI_LANGUAGE, {
1751
+ setUiLanguage(languageCode, locale) {
1752
+ return this.baseDataService.mutate(SET_UI_LANGUAGE_AND_LOCALE, {
1682
1753
  languageCode,
1754
+ locale,
1755
+ });
1756
+ }
1757
+ setUiLocale(locale) {
1758
+ return this.baseDataService.mutate(SET_UI_LOCALE, {
1759
+ locale,
1683
1760
  });
1684
1761
  }
1685
1762
  setContentLanguage(languageCode) {
@@ -1692,6 +1769,11 @@ class ClientDataService {
1692
1769
  theme,
1693
1770
  });
1694
1771
  }
1772
+ setDisplayUiExtensionPoints(display) {
1773
+ return this.baseDataService.mutate(SET_DISPLAY_UI_EXTENSION_POINTS, {
1774
+ display,
1775
+ });
1776
+ }
1695
1777
  setActiveChannel(channelId) {
1696
1778
  return this.baseDataService.mutate(SET_ACTIVE_CHANNEL, {
1697
1779
  channelId,
@@ -2675,6 +2757,14 @@ const CUSTOMER_FRAGMENT = gql `
2675
2757
  }
2676
2758
  ${ADDRESS_FRAGMENT}
2677
2759
  `;
2760
+ const CUSTOMER_GROUP_FRAGMENT = gql `
2761
+ fragment CustomerGroup on CustomerGroup {
2762
+ id
2763
+ createdAt
2764
+ updatedAt
2765
+ name
2766
+ }
2767
+ `;
2678
2768
  const GET_CUSTOMER_LIST = gql `
2679
2769
  query GetCustomerList($options: CustomerListOptions) {
2680
2770
  customers(options: $options) {
@@ -2765,22 +2855,18 @@ const UPDATE_CUSTOMER_ADDRESS = gql `
2765
2855
  const CREATE_CUSTOMER_GROUP = gql `
2766
2856
  mutation CreateCustomerGroup($input: CreateCustomerGroupInput!) {
2767
2857
  createCustomerGroup(input: $input) {
2768
- id
2769
- createdAt
2770
- updatedAt
2771
- name
2858
+ ...CustomerGroup
2772
2859
  }
2773
2860
  }
2861
+ ${CUSTOMER_GROUP_FRAGMENT}
2774
2862
  `;
2775
2863
  const UPDATE_CUSTOMER_GROUP = gql `
2776
2864
  mutation UpdateCustomerGroup($input: UpdateCustomerGroupInput!) {
2777
2865
  updateCustomerGroup(input: $input) {
2778
- id
2779
- createdAt
2780
- updatedAt
2781
- name
2866
+ ...CustomerGroup
2782
2867
  }
2783
2868
  }
2869
+ ${CUSTOMER_GROUP_FRAGMENT}
2784
2870
  `;
2785
2871
  const DELETE_CUSTOMER_GROUP = gql `
2786
2872
  mutation DeleteCustomerGroup($id: ID!) {
@@ -2794,22 +2880,17 @@ const GET_CUSTOMER_GROUPS = gql `
2794
2880
  query GetCustomerGroups($options: CustomerGroupListOptions) {
2795
2881
  customerGroups(options: $options) {
2796
2882
  items {
2797
- id
2798
- createdAt
2799
- updatedAt
2800
- name
2883
+ ...CustomerGroup
2801
2884
  }
2802
2885
  totalItems
2803
2886
  }
2804
2887
  }
2888
+ ${CUSTOMER_GROUP_FRAGMENT}
2805
2889
  `;
2806
2890
  const GET_CUSTOMER_GROUP_WITH_CUSTOMERS = gql `
2807
2891
  query GetCustomerGroupWithCustomers($id: ID!, $options: CustomerListOptions) {
2808
2892
  customerGroup(id: $id) {
2809
- id
2810
- createdAt
2811
- updatedAt
2812
- name
2893
+ ...CustomerGroup
2813
2894
  customers(options: $options) {
2814
2895
  items {
2815
2896
  id
@@ -2823,26 +2904,23 @@ const GET_CUSTOMER_GROUP_WITH_CUSTOMERS = gql `
2823
2904
  }
2824
2905
  }
2825
2906
  }
2907
+ ${CUSTOMER_GROUP_FRAGMENT}
2826
2908
  `;
2827
2909
  const ADD_CUSTOMERS_TO_GROUP = gql `
2828
2910
  mutation AddCustomersToGroup($groupId: ID!, $customerIds: [ID!]!) {
2829
2911
  addCustomersToGroup(customerGroupId: $groupId, customerIds: $customerIds) {
2830
- id
2831
- createdAt
2832
- updatedAt
2833
- name
2912
+ ...CustomerGroup
2834
2913
  }
2835
2914
  }
2915
+ ${CUSTOMER_GROUP_FRAGMENT}
2836
2916
  `;
2837
2917
  const REMOVE_CUSTOMERS_FROM_GROUP = gql `
2838
2918
  mutation RemoveCustomersFromGroup($groupId: ID!, $customerIds: [ID!]!) {
2839
2919
  removeCustomersFromGroup(customerGroupId: $groupId, customerIds: $customerIds) {
2840
- id
2841
- createdAt
2842
- updatedAt
2843
- name
2920
+ ...CustomerGroup
2844
2921
  }
2845
2922
  }
2923
+ ${CUSTOMER_GROUP_FRAGMENT}
2846
2924
  `;
2847
2925
  const GET_CUSTOMER_HISTORY = gql `
2848
2926
  query GetCustomerHistory($id: ID!, $options: HistoryEntryListOptions) {
@@ -5038,12 +5116,12 @@ class SettingsDataService {
5038
5116
  }
5039
5117
  createCountry(input) {
5040
5118
  return this.baseDataService.mutate(CREATE_COUNTRY, {
5041
- input: pick(input, ['code', 'enabled', 'translations']),
5119
+ input: pick(input, ['code', 'enabled', 'translations', 'customFields']),
5042
5120
  });
5043
5121
  }
5044
5122
  updateCountry(input) {
5045
5123
  return this.baseDataService.mutate(UPDATE_COUNTRY, {
5046
- input: pick(input, ['id', 'code', 'enabled', 'translations']),
5124
+ input: pick(input, ['id', 'code', 'enabled', 'translations', 'customFields']),
5047
5125
  });
5048
5126
  }
5049
5127
  deleteCountry(id) {
@@ -5115,6 +5193,14 @@ class SettingsDataService {
5115
5193
  },
5116
5194
  }, fetchPolicy);
5117
5195
  }
5196
+ getTaxRatesSimple(take = 10, skip = 0, fetchPolicy) {
5197
+ return this.baseDataService.query(GET_TAX_RATE_LIST_SIMPLE, {
5198
+ options: {
5199
+ take,
5200
+ skip,
5201
+ },
5202
+ }, fetchPolicy);
5203
+ }
5118
5204
  getTaxRate(id) {
5119
5205
  return this.baseDataService.query(GET_TAX_RATE, {
5120
5206
  id,
@@ -5406,7 +5492,19 @@ class ShippingMethodDataService {
5406
5492
  }
5407
5493
  }
5408
5494
 
5495
+ /**
5496
+ * @description
5497
+ * Used to interact with the Admin API via GraphQL queries. Internally this service uses the
5498
+ * Apollo Client, which means it maintains a normalized entity cache. For this reason, it is
5499
+ * advisable to always select the `id` field of any entity, which will allow the returned data
5500
+ * to be effectively cached.
5501
+ *
5502
+ * @docsCategory providers
5503
+ * @docsPage DataService
5504
+ * @docsWeight 0
5505
+ */
5409
5506
  class DataService {
5507
+ /** @internal */
5410
5508
  constructor(baseDataService) {
5411
5509
  this.baseDataService = baseDataService;
5412
5510
  this.promotion = new PromotionDataService(baseDataService);
@@ -5422,13 +5520,43 @@ class DataService {
5422
5520
  this.shippingMethod = new ShippingMethodDataService(baseDataService);
5423
5521
  }
5424
5522
  /**
5425
- * Perform a GraphQL query.
5523
+ * @description
5524
+ * Perform a GraphQL query. Returns a {@link QueryResult} which allows further control over
5525
+ * they type of result returned, e.g. stream of values, single value etc.
5526
+ *
5527
+ * @example
5528
+ * ```TypeScript
5529
+ * const result$ = this.dataService.query(gql`
5530
+ * query MyQuery($id: ID!) {
5531
+ * product(id: $id) {
5532
+ * id
5533
+ * name
5534
+ * slug
5535
+ * }
5536
+ * },
5537
+ * { id: 123 },
5538
+ * ).mapSingle(data => data.product);
5539
+ * ```
5426
5540
  */
5427
5541
  query(query, variables, fetchPolicy = 'cache-and-network') {
5428
5542
  return this.baseDataService.query(query, variables, fetchPolicy);
5429
5543
  }
5430
5544
  /**
5545
+ * @description
5431
5546
  * Perform a GraphQL mutation.
5547
+ *
5548
+ * @example
5549
+ * ```TypeScript
5550
+ * const result$ = this.dataService.mutate(gql`
5551
+ * mutation MyMutation($input: UpdateEntityInput!) {
5552
+ * updateEntity(input: $input) {
5553
+ * id
5554
+ * name
5555
+ * }
5556
+ * },
5557
+ * { input: updateEntityInput },
5558
+ * );
5559
+ * ```
5432
5560
  */
5433
5561
  mutate(mutation, variables, update) {
5434
5562
  return this.baseDataService.mutate(mutation, variables, update);
@@ -5481,6 +5609,21 @@ class AppComponent {
5481
5609
  }
5482
5610
  },
5483
5611
  });
5612
+ if (isDevMode()) {
5613
+ // tslint:disable-next-line:no-console
5614
+ console.log(`%cVendure Admin UI: Press "ctrl/cmd + u" to view UI extension points`, `color: #17C1FF; font-weight: bold;`);
5615
+ }
5616
+ }
5617
+ handleGlobalHotkeys(event) {
5618
+ if (event.ctrlKey === true && event.key === 'u') {
5619
+ event.preventDefault();
5620
+ if (isDevMode()) {
5621
+ this.dataService.client
5622
+ .uiState()
5623
+ .single$.pipe(switchMap(({ uiState }) => this.dataService.client.setDisplayUiExtensionPoints(!uiState.displayUiExtensionPoints)))
5624
+ .subscribe();
5625
+ }
5626
+ }
5484
5627
  }
5485
5628
  }
5486
5629
  AppComponent.decorators = [
@@ -5495,7 +5638,10 @@ AppComponent.ctorParameters = () => [
5495
5638
  { type: ServerConfigService },
5496
5639
  { type: LocalStorageService },
5497
5640
  { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
5498
- ];
5641
+ ];
5642
+ AppComponent.propDecorators = {
5643
+ handleGlobalHotkeys: [{ type: HostListener, args: ['window:keydown', ['$event'],] }]
5644
+ };
5499
5645
 
5500
5646
  let vendureUiConfig;
5501
5647
  function loadAppConfig() {
@@ -5514,6 +5660,14 @@ function getAppConfig() {
5514
5660
 
5515
5661
  function getDefaultUiLanguage() {
5516
5662
  return getAppConfig().defaultLanguage;
5663
+ }
5664
+ function getDefaultUiLocale() {
5665
+ var _a;
5666
+ const defaultLocale = getAppConfig().defaultLocale;
5667
+ if (defaultLocale) {
5668
+ return defaultLocale;
5669
+ }
5670
+ return (_a = navigator.language.split('-')[1]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
5517
5671
  }
5518
5672
 
5519
5673
  /**
@@ -5659,7 +5813,7 @@ I18nService.ctorParameters = () => [
5659
5813
  ];
5660
5814
 
5661
5815
  /**
5662
- * This component should only be instatiated dynamically by the ModalService. It should not be used
5816
+ * This component should only be instantiated dynamically by the ModalService. It should not be used
5663
5817
  * directly in templates. See {@link ModalService.fromComponent} method for more detail.
5664
5818
  */
5665
5819
  class ModalDialogComponent {
@@ -5778,8 +5932,13 @@ OverlayHostService.decorators = [
5778
5932
  ];
5779
5933
 
5780
5934
  /**
5935
+ * @description
5781
5936
  * This service is responsible for instantiating a ModalDialog component and
5782
5937
  * embedding the specified component within.
5938
+ *
5939
+ * @docsCategory providers
5940
+ * @docsPage ModalService
5941
+ * @docsWeight 0
5783
5942
  */
5784
5943
  class ModalService {
5785
5944
  constructor(componentFactoryResolver, overlayHostService) {
@@ -5787,12 +5946,13 @@ class ModalService {
5787
5946
  this.overlayHostService = overlayHostService;
5788
5947
  }
5789
5948
  /**
5949
+ * @description
5790
5950
  * Create a modal from a component. The component must implement the {@link Dialog} interface.
5791
5951
  * Additionally, the component should include templates for the title and the buttons to be
5792
5952
  * displayed in the modal dialog. See example:
5793
5953
  *
5794
5954
  * @example
5795
- * ```
5955
+ * ```HTML
5796
5956
  * class MyDialog implements Dialog {
5797
5957
  * resolveWith: (result?: any) => void;
5798
5958
  *
@@ -5808,31 +5968,32 @@ class ModalService {
5808
5968
  * }
5809
5969
  * ```
5810
5970
  *
5811
- * ```
5971
+ * @example
5972
+ * ```HTML
5812
5973
  * <ng-template vdrDialogTitle>Title of the modal</ng-template>
5813
5974
  *
5814
5975
  * <p>
5815
- * My Content
5976
+ * My Content
5816
5977
  * </p>
5817
5978
  *
5818
5979
  * <ng-template vdrDialogButtons>
5819
- * <button type="button"
5820
- * class="btn"
5821
- * (click)="cancel()">Cancel</button>
5822
- * <button type="button"
5823
- * class="btn btn-primary"
5824
- * (click)="okay()">Okay</button>
5980
+ * <button type="button"
5981
+ * class="btn"
5982
+ * (click)="cancel()">Cancel</button>
5983
+ * <button type="button"
5984
+ * class="btn btn-primary"
5985
+ * (click)="okay()">Okay</button>
5825
5986
  * </ng-template>
5826
5987
  * ```
5827
5988
  */
5828
5989
  fromComponent(component, options) {
5829
5990
  const modalFactory = this.componentFactoryResolver.resolveComponentFactory(ModalDialogComponent);
5830
- return from(this.overlayHostService.getHostView()).pipe(mergeMap((hostView) => {
5991
+ return from(this.overlayHostService.getHostView()).pipe(mergeMap(hostView => {
5831
5992
  const modalComponentRef = hostView.createComponent(modalFactory);
5832
5993
  const modalInstance = modalComponentRef.instance;
5833
5994
  modalInstance.childComponentType = component;
5834
5995
  modalInstance.options = options;
5835
- return new Observable((subscriber) => {
5996
+ return new Observable(subscriber => {
5836
5997
  modalInstance.closeModal = (result) => {
5837
5998
  modalComponentRef.destroy();
5838
5999
  subscriber.next(result);
@@ -5842,6 +6003,7 @@ class ModalService {
5842
6003
  }));
5843
6004
  }
5844
6005
  /**
6006
+ * @description
5845
6007
  * Displays a modal dialog with the provided title, body and buttons.
5846
6008
  */
5847
6009
  dialog(config) {
@@ -5864,19 +6026,294 @@ ModalService.ctorParameters = () => [
5864
6026
  class UiLanguageSwitcherDialogComponent {
5865
6027
  constructor() {
5866
6028
  this.availableLanguages = [];
6029
+ this.availableLocales = [
6030
+ 'AF',
6031
+ 'AL',
6032
+ 'DZ',
6033
+ 'AS',
6034
+ 'AD',
6035
+ 'AO',
6036
+ 'AI',
6037
+ 'AQ',
6038
+ 'AG',
6039
+ 'AR',
6040
+ 'AM',
6041
+ 'AW',
6042
+ 'AU',
6043
+ 'AT',
6044
+ 'AZ',
6045
+ 'BS',
6046
+ 'BH',
6047
+ 'BD',
6048
+ 'BB',
6049
+ 'BY',
6050
+ 'BE',
6051
+ 'BZ',
6052
+ 'BJ',
6053
+ 'BM',
6054
+ 'BT',
6055
+ 'BO',
6056
+ 'BQ',
6057
+ 'BA',
6058
+ 'BW',
6059
+ 'BV',
6060
+ 'BR',
6061
+ 'IO',
6062
+ 'BN',
6063
+ 'BG',
6064
+ 'BF',
6065
+ 'BI',
6066
+ 'CV',
6067
+ 'KH',
6068
+ 'CM',
6069
+ 'CA',
6070
+ 'KY',
6071
+ 'CF',
6072
+ 'TD',
6073
+ 'CL',
6074
+ 'CN',
6075
+ 'CX',
6076
+ 'CC',
6077
+ 'CO',
6078
+ 'KM',
6079
+ 'CD',
6080
+ 'CG',
6081
+ 'CK',
6082
+ 'CR',
6083
+ 'HR',
6084
+ 'CU',
6085
+ 'CW',
6086
+ 'CY',
6087
+ 'CZ',
6088
+ 'CI',
6089
+ 'DK',
6090
+ 'DJ',
6091
+ 'DM',
6092
+ 'DO',
6093
+ 'EC',
6094
+ 'EG',
6095
+ 'SV',
6096
+ 'GQ',
6097
+ 'ER',
6098
+ 'EE',
6099
+ 'SZ',
6100
+ 'ET',
6101
+ 'FK',
6102
+ 'FO',
6103
+ 'FJ',
6104
+ 'FI',
6105
+ 'FR',
6106
+ 'GF',
6107
+ 'PF',
6108
+ 'TF',
6109
+ 'GA',
6110
+ 'GM',
6111
+ 'GE',
6112
+ 'DE',
6113
+ 'GH',
6114
+ 'GI',
6115
+ 'GR',
6116
+ 'GL',
6117
+ 'GD',
6118
+ 'GP',
6119
+ 'GU',
6120
+ 'GT',
6121
+ 'GG',
6122
+ 'GN',
6123
+ 'GW',
6124
+ 'GY',
6125
+ 'HT',
6126
+ 'HM',
6127
+ 'VA',
6128
+ 'HN',
6129
+ 'HK',
6130
+ 'HU',
6131
+ 'IS',
6132
+ 'IN',
6133
+ 'ID',
6134
+ 'IR',
6135
+ 'IQ',
6136
+ 'IE',
6137
+ 'IM',
6138
+ 'IL',
6139
+ 'IT',
6140
+ 'JM',
6141
+ 'JP',
6142
+ 'JE',
6143
+ 'JO',
6144
+ 'KZ',
6145
+ 'KE',
6146
+ 'KI',
6147
+ 'KP',
6148
+ 'KR',
6149
+ 'KW',
6150
+ 'KG',
6151
+ 'LA',
6152
+ 'LV',
6153
+ 'LB',
6154
+ 'LS',
6155
+ 'LR',
6156
+ 'LY',
6157
+ 'LI',
6158
+ 'LT',
6159
+ 'LU',
6160
+ 'MO',
6161
+ 'MG',
6162
+ 'MW',
6163
+ 'MY',
6164
+ 'MV',
6165
+ 'ML',
6166
+ 'MT',
6167
+ 'MH',
6168
+ 'MQ',
6169
+ 'MR',
6170
+ 'MU',
6171
+ 'YT',
6172
+ 'MX',
6173
+ 'FM',
6174
+ 'MD',
6175
+ 'MC',
6176
+ 'MN',
6177
+ 'ME',
6178
+ 'MS',
6179
+ 'MA',
6180
+ 'MZ',
6181
+ 'MM',
6182
+ 'NA',
6183
+ 'NR',
6184
+ 'NP',
6185
+ 'NL',
6186
+ 'NC',
6187
+ 'NZ',
6188
+ 'NI',
6189
+ 'NE',
6190
+ 'NG',
6191
+ 'NU',
6192
+ 'NF',
6193
+ 'MK',
6194
+ 'MP',
6195
+ 'NO',
6196
+ 'OM',
6197
+ 'PK',
6198
+ 'PW',
6199
+ 'PS',
6200
+ 'PA',
6201
+ 'PG',
6202
+ 'PY',
6203
+ 'PE',
6204
+ 'PH',
6205
+ 'PN',
6206
+ 'PL',
6207
+ 'PT',
6208
+ 'PR',
6209
+ 'QA',
6210
+ 'RO',
6211
+ 'RU',
6212
+ 'RW',
6213
+ 'RE',
6214
+ 'BL',
6215
+ 'SH',
6216
+ 'KN',
6217
+ 'LC',
6218
+ 'MF',
6219
+ 'PM',
6220
+ 'VC',
6221
+ 'WS',
6222
+ 'SM',
6223
+ 'ST',
6224
+ 'SA',
6225
+ 'SN',
6226
+ 'RS',
6227
+ 'SC',
6228
+ 'SL',
6229
+ 'SG',
6230
+ 'SX',
6231
+ 'SK',
6232
+ 'SI',
6233
+ 'SB',
6234
+ 'SO',
6235
+ 'ZA',
6236
+ 'GS',
6237
+ 'SS',
6238
+ 'ES',
6239
+ 'LK',
6240
+ 'SD',
6241
+ 'SR',
6242
+ 'SJ',
6243
+ 'SE',
6244
+ 'CH',
6245
+ 'SY',
6246
+ 'TW',
6247
+ 'TJ',
6248
+ 'TZ',
6249
+ 'TH',
6250
+ 'TL',
6251
+ 'TG',
6252
+ 'TK',
6253
+ 'TO',
6254
+ 'TT',
6255
+ 'TN',
6256
+ 'TR',
6257
+ 'TM',
6258
+ 'TC',
6259
+ 'TV',
6260
+ 'UG',
6261
+ 'UA',
6262
+ 'AE',
6263
+ 'GB',
6264
+ 'UM',
6265
+ 'US',
6266
+ 'UY',
6267
+ 'UZ',
6268
+ 'VU',
6269
+ 'VE',
6270
+ 'VN',
6271
+ 'VG',
6272
+ 'VI',
6273
+ 'WF',
6274
+ 'EH',
6275
+ 'YE',
6276
+ 'ZM',
6277
+ 'ZW',
6278
+ 'AX',
6279
+ ];
6280
+ this.availableCurrencyCodes = Object.values(CurrencyCode);
6281
+ this.selectedCurrencyCode = 'USD';
6282
+ this.now = new Date().toISOString();
6283
+ const browserLanguage = navigator.language.split('-');
6284
+ this.browserDefaultLocale = browserLanguage.length === 1 ? undefined : browserLanguage[1];
6285
+ }
6286
+ ngOnInit() {
6287
+ this.updatePreviewLocale();
6288
+ }
6289
+ updatePreviewLocale() {
6290
+ if (!this.currentLocale || this.currentLocale.length === 0 || this.currentLocale.length === 2) {
6291
+ this.previewLocale = this.createLocaleString(this.currentLanguage, this.currentLocale);
6292
+ }
6293
+ }
6294
+ setLanguage() {
6295
+ var _a;
6296
+ this.resolveWith([this.currentLanguage, (_a = this.currentLocale) === null || _a === void 0 ? void 0 : _a.toUpperCase()]);
5867
6297
  }
5868
- setLanguage(languageCode) {
5869
- this.resolveWith(languageCode);
6298
+ cancel() {
6299
+ this.resolveWith();
6300
+ }
6301
+ createLocaleString(languageCode, region) {
6302
+ if (!region) {
6303
+ return languageCode;
6304
+ }
6305
+ return [languageCode, region.toUpperCase()].join('-');
5870
6306
  }
5871
6307
  }
5872
6308
  UiLanguageSwitcherDialogComponent.decorators = [
5873
6309
  { type: Component, args: [{
5874
6310
  selector: 'vdr-ui-language-switcher',
5875
- template: "<ng-template vdrDialogTitle>{{ 'common.select-display-language' | translate }}</ng-template>\r\n\r\n<div *ngFor=\"let code of availableLanguages\" >\r\n <button class=\"btn btn-link btn-sm\" (click)=\"setLanguage(code)\">\r\n <clr-icon [attr.shape]=\"code === currentLanguage ? 'dot-circle' : 'circle'\"></clr-icon>\r\n {{ code | uppercase }} ({{ code | localeLanguageName }})\r\n </button>\r\n</div>\r\n",
6311
+ template: "<ng-template vdrDialogTitle>{{ 'common.select-display-language' | translate }}</ng-template>\r\n<div class=\"clr-row\">\r\n <div class=\"clr-col-md-6\">\r\n <clr-select-container>\r\n <label>{{ 'common.language' | translate }}</label>\r\n <select\r\n clrSelect\r\n name=\"options\"\r\n [(ngModel)]=\"currentLanguage\"\r\n (ngModelChange)=\"updatePreviewLocale()\"\r\n >\r\n <option *ngFor=\"let code of availableLanguages | sort\" [value]=\"code\">\r\n {{ code | uppercase }} ({{ code | localeLanguageName }})\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n </div>\r\n <div class=\"clr-col-md-6\">\r\n <clr-datalist-container>\r\n <label>{{ 'common.locale' | translate }}</label>\r\n <input\r\n clrDatalistInput\r\n [(ngModel)]=\"currentLocale\"\r\n (ngModelChange)=\"updatePreviewLocale()\"\r\n [placeholder]=\"'common.browser-default' | translate\"\r\n class=\"locale\"\r\n name=\"Locale\"\r\n />\r\n <datalist>\r\n <option *ngFor=\"let locale of availableLocales\" [value]=\"locale\">\r\n {{ locale }} ({{ locale | localeRegionName }})\r\n </option>\r\n </datalist>\r\n </clr-datalist-container>\r\n </div>\r\n</div>\r\n<div class=\"card\">\r\n <div class=\"card-header\">\r\n <span class=\"p2\">{{ 'common.sample-formatting' | translate }}:</span><strong>{{ previewLocale | localeLanguageName:previewLocale }}</strong>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-sm-4\">\r\n <vdr-labeled-data [label]=\"'common.medium-date' | translate\">\r\n {{ now | localeDate: 'medium':previewLocale }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'common.short-date' | translate\">\r\n {{ now | localeDate: 'short':previewLocale }}\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"clr-col-sm-4\">\r\n <select clrSelect name=\"currency\" class=\"currency\" [(ngModel)]=\"selectedCurrencyCode\">\r\n <option *ngFor=\"let code of availableCurrencyCodes | sort\" [value]=\"code\">\r\n {{ code | uppercase }} ({{ code | localeCurrencyName: 'full':previewLocale }})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"clr-col-sm-4\">\r\n <vdr-labeled-data [label]=\"'common.price' | translate\">\r\n {{ 12345 | localeCurrency: selectedCurrencyCode:previewLocale }}\r\n </vdr-labeled-data>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"setLanguage()\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'common.set-language' | translate }}\r\n </button>\r\n</ng-template>\r\n",
5876
6312
  changeDetection: ChangeDetectionStrategy.OnPush,
5877
- styles: [""]
6313
+ styles: ["select.currency{max-width:200px}input.locale{text-transform:uppercase}\n"]
5878
6314
  },] }
5879
- ];
6315
+ ];
6316
+ UiLanguageSwitcherDialogComponent.ctorParameters = () => [];
5880
6317
 
5881
6318
  class AppShellComponent {
5882
6319
  constructor(authService, dataService, router, i18nService, modalService, localStorageService) {
@@ -5892,23 +6329,28 @@ class AppShellComponent {
5892
6329
  this.userName$ = this.dataService.client
5893
6330
  .userStatus()
5894
6331
  .single$.pipe(map(data => data.userStatus.username));
5895
- this.uiLanguage$ = this.dataService.client.uiState().stream$.pipe(map(data => data.uiState.language));
6332
+ this.uiLanguageAndLocale$ = this.dataService.client
6333
+ .uiState()
6334
+ .stream$.pipe(map(({ uiState }) => { var _a; return [uiState.language, (_a = uiState.locale) !== null && _a !== void 0 ? _a : undefined]; }));
5896
6335
  this.availableLanguages = this.i18nService.availableLanguages;
5897
6336
  }
5898
6337
  selectUiLanguage() {
5899
- this.uiLanguage$
5900
- .pipe(take(1), switchMap(currentLanguage => this.modalService.fromComponent(UiLanguageSwitcherDialogComponent, {
6338
+ this.uiLanguageAndLocale$
6339
+ .pipe(take(1), switchMap(([currentLanguage, currentLocale]) => this.modalService.fromComponent(UiLanguageSwitcherDialogComponent, {
5901
6340
  closable: true,
5902
- size: 'md',
6341
+ size: 'lg',
5903
6342
  locals: {
5904
6343
  availableLanguages: this.availableLanguages,
5905
6344
  currentLanguage,
6345
+ currentLocale,
5906
6346
  },
5907
- })), switchMap(value => (value ? this.dataService.client.setUiLanguage(value) : EMPTY)))
6347
+ })), switchMap(result => result ? this.dataService.client.setUiLanguage(result[0], result[1]) : EMPTY))
5908
6348
  .subscribe(result => {
6349
+ var _a;
5909
6350
  if (result.setUiLanguage) {
5910
6351
  this.i18nService.setLanguage(result.setUiLanguage);
5911
6352
  this.localStorageService.set('uiLanguageCode', result.setUiLanguage);
6353
+ this.localStorageService.set('uiLocale', (_a = result.setUiLocale) !== null && _a !== void 0 ? _a : undefined);
5912
6354
  }
5913
6355
  });
5914
6356
  }
@@ -5927,7 +6369,7 @@ class AppShellComponent {
5927
6369
  AppShellComponent.decorators = [
5928
6370
  { type: Component, args: [{
5929
6371
  selector: 'vdr-app-shell',
5930
- template: "<clr-main-container>\r\n <clr-header>\r\n <div class=\"branding\">\r\n <a [routerLink]=\"['/']\"><img src=\"assets/logo-75px.png\" class=\"logo\" /></a>\r\n </div>\r\n <div class=\"header-nav\"></div>\r\n <div class=\"header-actions\">\r\n <vdr-channel-switcher *vdrIfMultichannel></vdr-channel-switcher>\r\n <vdr-user-menu [userName]=\"userName$ | async\"\r\n [uiLanguage]=\"uiLanguage$ | async\"\r\n [availableLanguages]=\"availableLanguages\"\r\n (selectUiLanguage)=\"selectUiLanguage()\"\r\n (logOut)=\"logOut()\"></vdr-user-menu>\r\n </div>\r\n </clr-header>\r\n <nav class=\"subnav\"><vdr-breadcrumb></vdr-breadcrumb></nav>\r\n\r\n <div class=\"content-container\">\r\n <div class=\"content-area\"><router-outlet></router-outlet></div>\r\n <vdr-main-nav></vdr-main-nav>\r\n </div>\r\n</clr-main-container>\r\n",
6372
+ template: "<clr-main-container>\r\n <clr-header>\r\n <div class=\"branding\">\r\n <a [routerLink]=\"['/']\"><img src=\"assets/logo-75px.png\" class=\"logo\" /></a>\r\n </div>\r\n <div class=\"header-nav\"></div>\r\n <div class=\"header-actions\">\r\n <vdr-channel-switcher *vdrIfMultichannel></vdr-channel-switcher>\r\n <vdr-user-menu [userName]=\"userName$ | async\"\r\n [uiLanguageAndLocale]=\"uiLanguageAndLocale$ | async\"\r\n [availableLanguages]=\"availableLanguages\"\r\n (selectUiLanguage)=\"selectUiLanguage()\"\r\n (logOut)=\"logOut()\"></vdr-user-menu>\r\n </div>\r\n </clr-header>\r\n <nav class=\"subnav\"><vdr-breadcrumb></vdr-breadcrumb></nav>\r\n\r\n <div class=\"content-container\">\r\n <div class=\"content-area\"><router-outlet></router-outlet></div>\r\n <vdr-main-nav></vdr-main-nav>\r\n </div>\r\n</clr-main-container>\r\n",
5931
6373
  styles: [".branding{min-width:0}.logo{width:60px}@media screen and (min-width: 768px){vdr-breadcrumb{margin-left:10.8rem}}.header-actions{align-items:center}.content-area{position:relative}\n"]
5932
6374
  },] }
5933
6375
  ];
@@ -6252,16 +6694,18 @@ JobQueueService.ctorParameters = () => [
6252
6694
  * imports: [SharedModule],
6253
6695
  * providers: [
6254
6696
  * addNavMenuSection({
6255
- * id: 'reviews',
6256
- * label: 'Product Reviews',
6257
- * routerLink: ['/extensions/reviews'],
6258
- * icon: 'star',
6697
+ * id: 'reports',
6698
+ * label: 'Reports',
6699
+ * items: [{
6700
+ * // ...
6701
+ * }],
6259
6702
  * },
6260
6703
  * 'settings'),
6261
6704
  * ],
6262
6705
  * })
6263
6706
  * export class MyUiExtensionModule {}
6264
6707
  * ```
6708
+ * @docsCategory nav-menu
6265
6709
  */
6266
6710
  function addNavMenuSection(config, before) {
6267
6711
  return {
@@ -6289,17 +6733,18 @@ function addNavMenuSection(config, before) {
6289
6733
  * imports: [SharedModule],
6290
6734
  * providers: [
6291
6735
  * addNavMenuItem({
6292
- * id: 'reports',
6293
- * label: 'Reports',
6294
- * items: [{
6295
- * // ...
6296
- * }],
6736
+ * id: 'reviews',
6737
+ * label: 'Product Reviews',
6738
+ * routerLink: ['/extensions/reviews'],
6739
+ * icon: 'star',
6297
6740
  * },
6298
6741
  * 'marketing'),
6299
6742
  * ],
6300
6743
  * })
6301
6744
  * export class MyUiExtensionModule {}
6302
- * ```
6745
+ * ``
6746
+ *
6747
+ * @docsCategory nav-menu
6303
6748
  */
6304
6749
  function addNavMenuItem(config, sectionId, before) {
6305
6750
  return {
@@ -6334,6 +6779,7 @@ function addNavMenuItem(config, sectionId, before) {
6334
6779
  * })
6335
6780
  * export class MyUiExtensionModule {}
6336
6781
  * ```
6782
+ * @docsCategory action-bar
6337
6783
  */
6338
6784
  function addActionBarItem(config) {
6339
6785
  return {
@@ -6742,7 +7188,7 @@ class MainNavComponent {
6742
7188
  MainNavComponent.decorators = [
6743
7189
  { type: Component, args: [{
6744
7190
  selector: 'vdr-main-nav',
6745
- template: "<nav class=\"sidenav\" [clr-nav-level]=\"2\">\r\n <section class=\"sidenav-content\">\r\n <ng-container *ngFor=\"let section of navBuilderService.navMenuConfig$ | async\">\r\n <section\r\n class=\"nav-group\"\r\n [attr.data-section-id]=\"section.id\"\r\n [class.collapsible]=\"section.collapsible\"\r\n *ngIf=\"shouldDisplayLink(section)\"\r\n >\r\n <ng-container *ngIf=\"navBuilderService.sectionBadges[section.id] | async as sectionBadge\">\r\n <vdr-status-badge *ngIf=\"sectionBadge !== 'none'\" [type]=\"sectionBadge\"></vdr-status-badge>\r\n </ng-container>\r\n <input [id]=\"section.id\" type=\"checkbox\" [checked]=\"section.collapsedByDefault\" />\r\n <label [for]=\"section.id\">{{ section.label | translate }}</label>\r\n <ul class=\"nav-list\">\r\n <ng-container *ngFor=\"let item of section.items\">\r\n <li *ngIf=\"shouldDisplayLink(item)\">\r\n <a\r\n class=\"nav-link\"\r\n [attr.data-item-id]=\"section.id\"\r\n [routerLink]=\"getRouterLink(item)\"\r\n routerLinkActive=\"active\"\r\n >\r\n <ng-container *ngIf=\"item.statusBadge | async as itemBadge\">\r\n <vdr-status-badge *ngIf=\"itemBadge.type !== 'none'\" [type]=\"itemBadge.type\"></vdr-status-badge>\r\n </ng-container>\r\n <clr-icon [attr.shape]=\"item.icon || 'block'\" size=\"20\"></clr-icon>\r\n {{ item.label | translate }}\r\n </a>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </section>\r\n </ng-container>\r\n </section>\r\n</nav>\r\n",
7191
+ template: "<nav class=\"sidenav\" [clr-nav-level]=\"2\">\r\n <section class=\"sidenav-content\">\r\n <ng-container *ngFor=\"let section of navBuilderService.navMenuConfig$ | async\">\r\n <section\r\n class=\"nav-group\"\r\n [attr.data-section-id]=\"section.id\"\r\n [class.collapsible]=\"section.collapsible\"\r\n *ngIf=\"shouldDisplayLink(section)\"\r\n >\r\n <vdr-ui-extension-point [locationId]=\"section.id\" api=\"navMenu\" [topPx]=\"-6\" [leftPx]=\"8\">\r\n <ng-container *ngIf=\"navBuilderService.sectionBadges[section.id] | async as sectionBadge\">\r\n <vdr-status-badge\r\n *ngIf=\"sectionBadge !== 'none'\"\r\n [type]=\"sectionBadge\"\r\n ></vdr-status-badge>\r\n </ng-container>\r\n <input [id]=\"section.id\" type=\"checkbox\" [checked]=\"section.collapsedByDefault\" />\r\n <label [for]=\"section.id\">{{ section.label | translate }}</label>\r\n <ul class=\"nav-list\">\r\n <ng-container *ngFor=\"let item of section.items\">\r\n <li *ngIf=\"shouldDisplayLink(item)\">\r\n <a\r\n class=\"nav-link\"\r\n [attr.data-item-id]=\"section.id\"\r\n [routerLink]=\"getRouterLink(item)\"\r\n routerLinkActive=\"active\"\r\n >\r\n <ng-container *ngIf=\"item.statusBadge | async as itemBadge\">\r\n <vdr-status-badge\r\n *ngIf=\"itemBadge.type !== 'none'\"\r\n [type]=\"itemBadge.type\"\r\n ></vdr-status-badge>\r\n </ng-container>\r\n <clr-icon [attr.shape]=\"item.icon || 'block'\" size=\"20\"></clr-icon>\r\n {{ item.label | translate }}\r\n </a>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </vdr-ui-extension-point>\r\n </section>\r\n </ng-container>\r\n </section>\r\n</nav>\r\n",
6746
7192
  styles: [":host{order:-1;background-color:var(--clr-nav-background-color)}nav.sidenav{height:100%;width:10.8rem;border-right-color:var(--clr-sidenav-border-color)}.nav-list clr-icon{margin-right:12px}.nav-group,.nav-link{position:relative}.nav-group vdr-status-badge{left:10px;top:6px}.nav-link vdr-status-badge{left:25px;top:3px}\n"]
6747
7193
  },] }
6748
7194
  ];
@@ -6884,202 +7330,268 @@ class UserMenuComponent {
6884
7330
  UserMenuComponent.decorators = [
6885
7331
  { type: Component, args: [{
6886
7332
  selector: 'vdr-user-menu',
6887
- template: "<vdr-dropdown>\r\n <button class=\"btn btn-link trigger\" vdrDropdownTrigger>\r\n <span class=\"user-name\">{{ userName }}</span>\r\n <clr-icon shape=\"user\" size=\"24\"></clr-icon>\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <a [routerLink]=\"['/settings', 'profile']\" vdrDropdownItem>\r\n <clr-icon shape=\"user\" class=\"is-solid\"></clr-icon> {{ 'settings.profile' | translate }}\r\n </a>\r\n <ng-container *ngIf=\"1 < availableLanguages.length\">\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectUiLanguage.emit()\"\r\n [title]=\"'common.select-display-language' | translate\"\r\n >\r\n <clr-icon shape=\"language\"></clr-icon> {{ uiLanguage | localeLanguageName }}\r\n </button>\r\n </ng-container>\r\n <div class=\"dropdown-item\">\r\n <vdr-theme-switcher></vdr-theme-switcher>\r\n </div>\r\n <div class=\"dropdown-divider\"></div>\r\n <button type=\"button\" vdrDropdownItem (click)=\"logOut.emit()\">\r\n <clr-icon shape=\"logout\"></clr-icon> {{ 'common.log-out' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n</vdr-dropdown>\r\n",
7333
+ template: "<vdr-dropdown>\r\n <button class=\"btn btn-link trigger\" vdrDropdownTrigger>\r\n <span class=\"user-name\">{{ userName }}</span>\r\n <clr-icon shape=\"user\" size=\"24\"></clr-icon>\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <a [routerLink]=\"['/settings', 'profile']\" vdrDropdownItem>\r\n <clr-icon shape=\"user\" class=\"is-solid\"></clr-icon> {{ 'settings.profile' | translate }}\r\n </a>\r\n <ng-container *ngIf=\"1 < availableLanguages.length\">\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectUiLanguage.emit()\"\r\n [title]=\"'common.select-display-language' | translate\"\r\n >\r\n <clr-icon shape=\"language\"></clr-icon> {{ uiLanguageAndLocale?.[0] | localeLanguageName }}\r\n </button>\r\n </ng-container>\r\n <div class=\"dropdown-item\">\r\n <vdr-theme-switcher></vdr-theme-switcher>\r\n </div>\r\n <div class=\"dropdown-divider\"></div>\r\n <button type=\"button\" vdrDropdownItem (click)=\"logOut.emit()\">\r\n <clr-icon shape=\"logout\"></clr-icon> {{ 'common.log-out' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n</vdr-dropdown>\r\n",
6888
7334
  styles: [":host{display:flex;align-items:center;margin:0 .5rem;height:2.5rem}.user-name{color:var(--color-grey-200);margin-right:12px}@media screen and (max-width: 768px){.user-name{display:none}}.trigger clr-icon{color:#fff}\n"]
6889
7335
  },] }
6890
7336
  ];
6891
7337
  UserMenuComponent.propDecorators = {
6892
7338
  userName: [{ type: Input }],
6893
7339
  availableLanguages: [{ type: Input }],
6894
- uiLanguage: [{ type: Input }],
7340
+ uiLanguageAndLocale: [{ type: Input }],
6895
7341
  logOut: [{ type: Output }],
6896
7342
  selectUiLanguage: [{ type: Output }]
6897
7343
  };
6898
7344
 
6899
7345
  // tslint:disable
6900
7346
  const result = {
6901
- possibleTypes: {
6902
- AddFulfillmentToOrderResult: [
6903
- 'Fulfillment',
6904
- 'EmptyOrderLineSelectionError',
6905
- 'ItemsAlreadyFulfilledError',
6906
- 'InsufficientStockOnHandError',
6907
- 'InvalidFulfillmentHandlerError',
6908
- 'FulfillmentStateTransitionError',
6909
- 'CreateFulfillmentError',
7347
+ "possibleTypes": {
7348
+ "AddFulfillmentToOrderResult": [
7349
+ "Fulfillment",
7350
+ "EmptyOrderLineSelectionError",
7351
+ "ItemsAlreadyFulfilledError",
7352
+ "InsufficientStockOnHandError",
7353
+ "InvalidFulfillmentHandlerError",
7354
+ "FulfillmentStateTransitionError",
7355
+ "CreateFulfillmentError"
6910
7356
  ],
6911
- AddManualPaymentToOrderResult: ['Order', 'ManualPaymentStateError'],
6912
- AuthenticationResult: ['CurrentUser', 'InvalidCredentialsError'],
6913
- CancelOrderResult: [
6914
- 'Order',
6915
- 'EmptyOrderLineSelectionError',
6916
- 'QuantityTooGreatError',
6917
- 'MultipleOrderError',
6918
- 'CancelActiveOrderError',
6919
- 'OrderStateTransitionError',
7357
+ "AddManualPaymentToOrderResult": [
7358
+ "Order",
7359
+ "ManualPaymentStateError"
6920
7360
  ],
6921
- CreateAssetResult: ['Asset', 'MimeTypeError'],
6922
- CreateChannelResult: ['Channel', 'LanguageNotAvailableError'],
6923
- CreateCustomerResult: ['Customer', 'EmailAddressConflictError'],
6924
- CreatePromotionResult: ['Promotion', 'MissingConditionsError'],
6925
- CustomField: [
6926
- 'BooleanCustomFieldConfig',
6927
- 'DateTimeCustomFieldConfig',
6928
- 'FloatCustomFieldConfig',
6929
- 'IntCustomFieldConfig',
6930
- 'LocaleStringCustomFieldConfig',
6931
- 'RelationCustomFieldConfig',
6932
- 'StringCustomFieldConfig',
6933
- 'TextCustomFieldConfig',
7361
+ "AuthenticationResult": [
7362
+ "CurrentUser",
7363
+ "InvalidCredentialsError"
6934
7364
  ],
6935
- CustomFieldConfig: [
6936
- 'StringCustomFieldConfig',
6937
- 'LocaleStringCustomFieldConfig',
6938
- 'IntCustomFieldConfig',
6939
- 'FloatCustomFieldConfig',
6940
- 'BooleanCustomFieldConfig',
6941
- 'DateTimeCustomFieldConfig',
6942
- 'RelationCustomFieldConfig',
6943
- 'TextCustomFieldConfig',
7365
+ "CancelOrderResult": [
7366
+ "Order",
7367
+ "EmptyOrderLineSelectionError",
7368
+ "QuantityTooGreatError",
7369
+ "MultipleOrderError",
7370
+ "CancelActiveOrderError",
7371
+ "OrderStateTransitionError"
6944
7372
  ],
6945
- ErrorResult: [
6946
- 'AlreadyRefundedError',
6947
- 'CancelActiveOrderError',
6948
- 'ChannelDefaultLanguageError',
6949
- 'CreateFulfillmentError',
6950
- 'EmailAddressConflictError',
6951
- 'EmptyOrderLineSelectionError',
6952
- 'FulfillmentStateTransitionError',
6953
- 'InsufficientStockError',
6954
- 'InsufficientStockOnHandError',
6955
- 'InvalidCredentialsError',
6956
- 'InvalidFulfillmentHandlerError',
6957
- 'ItemsAlreadyFulfilledError',
6958
- 'LanguageNotAvailableError',
6959
- 'ManualPaymentStateError',
6960
- 'MimeTypeError',
6961
- 'MissingConditionsError',
6962
- 'MultipleOrderError',
6963
- 'NativeAuthStrategyError',
6964
- 'NegativeQuantityError',
6965
- 'NoChangesSpecifiedError',
6966
- 'NothingToRefundError',
6967
- 'OrderLimitError',
6968
- 'OrderModificationStateError',
6969
- 'OrderStateTransitionError',
6970
- 'PaymentMethodMissingError',
6971
- 'PaymentOrderMismatchError',
6972
- 'PaymentStateTransitionError',
6973
- 'ProductOptionInUseError',
6974
- 'QuantityTooGreatError',
6975
- 'RefundOrderStateError',
6976
- 'RefundPaymentIdMissingError',
6977
- 'RefundStateTransitionError',
6978
- 'SettlePaymentError',
7373
+ "CreateAssetResult": [
7374
+ "Asset",
7375
+ "MimeTypeError"
6979
7376
  ],
6980
- ModifyOrderResult: [
6981
- 'Order',
6982
- 'NoChangesSpecifiedError',
6983
- 'OrderModificationStateError',
6984
- 'PaymentMethodMissingError',
6985
- 'RefundPaymentIdMissingError',
6986
- 'OrderLimitError',
6987
- 'NegativeQuantityError',
6988
- 'InsufficientStockError',
7377
+ "CreateChannelResult": [
7378
+ "Channel",
7379
+ "LanguageNotAvailableError"
6989
7380
  ],
6990
- NativeAuthenticationResult: ['CurrentUser', 'InvalidCredentialsError', 'NativeAuthStrategyError'],
6991
- Node: [
6992
- 'Address',
6993
- 'Administrator',
6994
- 'Allocation',
6995
- 'Asset',
6996
- 'AuthenticationMethod',
6997
- 'Cancellation',
6998
- 'Channel',
6999
- 'Collection',
7000
- 'Country',
7001
- 'Customer',
7002
- 'CustomerGroup',
7003
- 'Facet',
7004
- 'FacetValue',
7005
- 'Fulfillment',
7006
- 'HistoryEntry',
7007
- 'Job',
7008
- 'Order',
7009
- 'OrderItem',
7010
- 'OrderLine',
7011
- 'OrderModification',
7012
- 'Payment',
7013
- 'PaymentMethod',
7014
- 'Product',
7015
- 'ProductOption',
7016
- 'ProductOptionGroup',
7017
- 'ProductVariant',
7018
- 'Promotion',
7019
- 'Refund',
7020
- 'Release',
7021
- 'Return',
7022
- 'Role',
7023
- 'Sale',
7024
- 'ShippingMethod',
7025
- 'StockAdjustment',
7026
- 'Surcharge',
7027
- 'Tag',
7028
- 'TaxCategory',
7029
- 'TaxRate',
7030
- 'User',
7031
- 'Zone',
7381
+ "CreateCustomerResult": [
7382
+ "Customer",
7383
+ "EmailAddressConflictError"
7032
7384
  ],
7033
- PaginatedList: [
7034
- 'AdministratorList',
7035
- 'AssetList',
7036
- 'CollectionList',
7037
- 'CountryList',
7038
- 'CustomerGroupList',
7039
- 'CustomerList',
7040
- 'FacetList',
7041
- 'HistoryEntryList',
7042
- 'JobList',
7043
- 'OrderList',
7044
- 'PaymentMethodList',
7045
- 'ProductList',
7046
- 'ProductVariantList',
7047
- 'PromotionList',
7048
- 'RoleList',
7049
- 'ShippingMethodList',
7050
- 'TagList',
7051
- 'TaxRateList',
7385
+ "CreatePromotionResult": [
7386
+ "Promotion",
7387
+ "MissingConditionsError"
7052
7388
  ],
7053
- RefundOrderResult: [
7054
- 'Refund',
7055
- 'QuantityTooGreatError',
7056
- 'NothingToRefundError',
7057
- 'OrderStateTransitionError',
7058
- 'MultipleOrderError',
7059
- 'PaymentOrderMismatchError',
7060
- 'RefundOrderStateError',
7061
- 'AlreadyRefundedError',
7062
- 'RefundStateTransitionError',
7389
+ "CustomField": [
7390
+ "BooleanCustomFieldConfig",
7391
+ "DateTimeCustomFieldConfig",
7392
+ "FloatCustomFieldConfig",
7393
+ "IntCustomFieldConfig",
7394
+ "LocaleStringCustomFieldConfig",
7395
+ "RelationCustomFieldConfig",
7396
+ "StringCustomFieldConfig",
7397
+ "TextCustomFieldConfig"
7063
7398
  ],
7064
- RemoveOptionGroupFromProductResult: ['Product', 'ProductOptionInUseError'],
7065
- SearchResultPrice: ['PriceRange', 'SinglePrice'],
7066
- SettlePaymentResult: [
7067
- 'Payment',
7068
- 'SettlePaymentError',
7069
- 'PaymentStateTransitionError',
7070
- 'OrderStateTransitionError',
7399
+ "CustomFieldConfig": [
7400
+ "StringCustomFieldConfig",
7401
+ "LocaleStringCustomFieldConfig",
7402
+ "IntCustomFieldConfig",
7403
+ "FloatCustomFieldConfig",
7404
+ "BooleanCustomFieldConfig",
7405
+ "DateTimeCustomFieldConfig",
7406
+ "RelationCustomFieldConfig",
7407
+ "TextCustomFieldConfig"
7071
7408
  ],
7072
- SettleRefundResult: ['Refund', 'RefundStateTransitionError'],
7073
- StockMovement: ['Allocation', 'Cancellation', 'Release', 'Return', 'Sale', 'StockAdjustment'],
7074
- StockMovementItem: ['StockAdjustment', 'Allocation', 'Sale', 'Cancellation', 'Return', 'Release'],
7075
- TransitionFulfillmentToStateResult: ['Fulfillment', 'FulfillmentStateTransitionError'],
7076
- TransitionOrderToStateResult: ['Order', 'OrderStateTransitionError'],
7077
- TransitionPaymentToStateResult: ['Payment', 'PaymentStateTransitionError'],
7078
- UpdateChannelResult: ['Channel', 'LanguageNotAvailableError'],
7079
- UpdateCustomerResult: ['Customer', 'EmailAddressConflictError'],
7080
- UpdateGlobalSettingsResult: ['GlobalSettings', 'ChannelDefaultLanguageError'],
7081
- UpdatePromotionResult: ['Promotion', 'MissingConditionsError'],
7082
- },
7409
+ "ErrorResult": [
7410
+ "AlreadyRefundedError",
7411
+ "CancelActiveOrderError",
7412
+ "ChannelDefaultLanguageError",
7413
+ "CreateFulfillmentError",
7414
+ "EmailAddressConflictError",
7415
+ "EmptyOrderLineSelectionError",
7416
+ "FulfillmentStateTransitionError",
7417
+ "InsufficientStockError",
7418
+ "InsufficientStockOnHandError",
7419
+ "InvalidCredentialsError",
7420
+ "InvalidFulfillmentHandlerError",
7421
+ "ItemsAlreadyFulfilledError",
7422
+ "LanguageNotAvailableError",
7423
+ "ManualPaymentStateError",
7424
+ "MimeTypeError",
7425
+ "MissingConditionsError",
7426
+ "MultipleOrderError",
7427
+ "NativeAuthStrategyError",
7428
+ "NegativeQuantityError",
7429
+ "NoChangesSpecifiedError",
7430
+ "NothingToRefundError",
7431
+ "OrderLimitError",
7432
+ "OrderModificationStateError",
7433
+ "OrderStateTransitionError",
7434
+ "PaymentMethodMissingError",
7435
+ "PaymentOrderMismatchError",
7436
+ "PaymentStateTransitionError",
7437
+ "ProductOptionInUseError",
7438
+ "QuantityTooGreatError",
7439
+ "RefundOrderStateError",
7440
+ "RefundPaymentIdMissingError",
7441
+ "RefundStateTransitionError",
7442
+ "SettlePaymentError"
7443
+ ],
7444
+ "ModifyOrderResult": [
7445
+ "Order",
7446
+ "NoChangesSpecifiedError",
7447
+ "OrderModificationStateError",
7448
+ "PaymentMethodMissingError",
7449
+ "RefundPaymentIdMissingError",
7450
+ "OrderLimitError",
7451
+ "NegativeQuantityError",
7452
+ "InsufficientStockError"
7453
+ ],
7454
+ "NativeAuthenticationResult": [
7455
+ "CurrentUser",
7456
+ "InvalidCredentialsError",
7457
+ "NativeAuthStrategyError"
7458
+ ],
7459
+ "Node": [
7460
+ "Address",
7461
+ "Administrator",
7462
+ "Allocation",
7463
+ "Asset",
7464
+ "AuthenticationMethod",
7465
+ "Cancellation",
7466
+ "Channel",
7467
+ "Collection",
7468
+ "Country",
7469
+ "Customer",
7470
+ "CustomerGroup",
7471
+ "Facet",
7472
+ "FacetValue",
7473
+ "Fulfillment",
7474
+ "HistoryEntry",
7475
+ "Job",
7476
+ "Order",
7477
+ "OrderItem",
7478
+ "OrderLine",
7479
+ "OrderModification",
7480
+ "Payment",
7481
+ "PaymentMethod",
7482
+ "Product",
7483
+ "ProductOption",
7484
+ "ProductOptionGroup",
7485
+ "ProductVariant",
7486
+ "Promotion",
7487
+ "Refund",
7488
+ "Release",
7489
+ "Return",
7490
+ "Role",
7491
+ "Sale",
7492
+ "ShippingMethod",
7493
+ "StockAdjustment",
7494
+ "Surcharge",
7495
+ "Tag",
7496
+ "TaxCategory",
7497
+ "TaxRate",
7498
+ "User",
7499
+ "Zone"
7500
+ ],
7501
+ "PaginatedList": [
7502
+ "AdministratorList",
7503
+ "AssetList",
7504
+ "CollectionList",
7505
+ "CountryList",
7506
+ "CustomerGroupList",
7507
+ "CustomerList",
7508
+ "FacetList",
7509
+ "HistoryEntryList",
7510
+ "JobList",
7511
+ "OrderList",
7512
+ "PaymentMethodList",
7513
+ "ProductList",
7514
+ "ProductVariantList",
7515
+ "PromotionList",
7516
+ "RoleList",
7517
+ "ShippingMethodList",
7518
+ "TagList",
7519
+ "TaxRateList"
7520
+ ],
7521
+ "RefundOrderResult": [
7522
+ "Refund",
7523
+ "QuantityTooGreatError",
7524
+ "NothingToRefundError",
7525
+ "OrderStateTransitionError",
7526
+ "MultipleOrderError",
7527
+ "PaymentOrderMismatchError",
7528
+ "RefundOrderStateError",
7529
+ "AlreadyRefundedError",
7530
+ "RefundStateTransitionError"
7531
+ ],
7532
+ "RemoveOptionGroupFromProductResult": [
7533
+ "Product",
7534
+ "ProductOptionInUseError"
7535
+ ],
7536
+ "SearchResultPrice": [
7537
+ "PriceRange",
7538
+ "SinglePrice"
7539
+ ],
7540
+ "SettlePaymentResult": [
7541
+ "Payment",
7542
+ "SettlePaymentError",
7543
+ "PaymentStateTransitionError",
7544
+ "OrderStateTransitionError"
7545
+ ],
7546
+ "SettleRefundResult": [
7547
+ "Refund",
7548
+ "RefundStateTransitionError"
7549
+ ],
7550
+ "StockMovement": [
7551
+ "Allocation",
7552
+ "Cancellation",
7553
+ "Release",
7554
+ "Return",
7555
+ "Sale",
7556
+ "StockAdjustment"
7557
+ ],
7558
+ "StockMovementItem": [
7559
+ "StockAdjustment",
7560
+ "Allocation",
7561
+ "Sale",
7562
+ "Cancellation",
7563
+ "Return",
7564
+ "Release"
7565
+ ],
7566
+ "TransitionFulfillmentToStateResult": [
7567
+ "Fulfillment",
7568
+ "FulfillmentStateTransitionError"
7569
+ ],
7570
+ "TransitionOrderToStateResult": [
7571
+ "Order",
7572
+ "OrderStateTransitionError"
7573
+ ],
7574
+ "TransitionPaymentToStateResult": [
7575
+ "Payment",
7576
+ "PaymentStateTransitionError"
7577
+ ],
7578
+ "UpdateChannelResult": [
7579
+ "Channel",
7580
+ "LanguageNotAvailableError"
7581
+ ],
7582
+ "UpdateCustomerResult": [
7583
+ "Customer",
7584
+ "EmailAddressConflictError"
7585
+ ],
7586
+ "UpdateGlobalSettingsResult": [
7587
+ "GlobalSettings",
7588
+ "ChannelDefaultLanguageError"
7589
+ ],
7590
+ "UpdatePromotionResult": [
7591
+ "Promotion",
7592
+ "MissingConditionsError"
7593
+ ]
7594
+ }
7083
7595
  };
7084
7596
 
7085
7597
  // Allows the introspectionResult to be imported as a named symbol
@@ -7116,6 +7628,7 @@ class CheckJobsLink extends ApolloLink {
7116
7628
 
7117
7629
  function getClientDefaults(localStorageService) {
7118
7630
  const currentLanguage = localStorageService.get('uiLanguageCode') || getDefaultUiLanguage();
7631
+ const currentLocale = localStorageService.get('uiLocale') || getDefaultUiLocale();
7119
7632
  const currentContentLanguage = localStorageService.get('contentLanguageCode') || getDefaultUiLanguage();
7120
7633
  const activeTheme = localStorageService.get('activeTheme') || 'default';
7121
7634
  return {
@@ -7134,8 +7647,10 @@ function getClientDefaults(localStorageService) {
7134
7647
  },
7135
7648
  uiState: {
7136
7649
  language: currentLanguage,
7650
+ locale: currentLocale || '',
7137
7651
  contentLanguage: currentContentLanguage,
7138
7652
  theme: activeTheme,
7653
+ displayUiExtensionPoints: false,
7139
7654
  __typename: 'UiState',
7140
7655
  },
7141
7656
  };
@@ -7179,43 +7694,35 @@ const ɵ0$2 = (_, args, { cache }) => {
7179
7694
  }, ɵ4 = (_, args, { cache }) => {
7180
7695
  // tslint:disable-next-line:no-non-null-assertion
7181
7696
  const previous = cache.readQuery({ query: GET_UI_STATE });
7182
- const data = {
7183
- uiState: {
7184
- __typename: 'UiState',
7185
- language: args.languageCode,
7186
- contentLanguage: previous.uiState.contentLanguage,
7187
- theme: previous.uiState.theme,
7188
- },
7189
- };
7697
+ const data = updateUiState(previous, 'language', args.languageCode);
7190
7698
  cache.writeQuery({ query: GET_UI_STATE, data });
7191
7699
  return args.languageCode;
7192
7700
  }, ɵ5 = (_, args, { cache }) => {
7701
+ var _a;
7193
7702
  // tslint:disable-next-line:no-non-null-assertion
7194
7703
  const previous = cache.readQuery({ query: GET_UI_STATE });
7195
- const data = {
7196
- uiState: {
7197
- __typename: 'UiState',
7198
- language: previous.uiState.language,
7199
- contentLanguage: args.languageCode,
7200
- theme: previous.uiState.theme,
7201
- },
7202
- };
7704
+ const data = updateUiState(previous, 'locale', args.locale);
7203
7705
  cache.writeQuery({ query: GET_UI_STATE, data });
7204
- return args.languageCode;
7706
+ return (_a = args.locale) !== null && _a !== void 0 ? _a : undefined;
7205
7707
  }, ɵ6 = (_, args, { cache }) => {
7206
7708
  // tslint:disable-next-line:no-non-null-assertion
7207
7709
  const previous = cache.readQuery({ query: GET_UI_STATE });
7208
- const data = {
7209
- uiState: {
7210
- __typename: 'UiState',
7211
- language: previous.uiState.language,
7212
- contentLanguage: previous.uiState.contentLanguage,
7213
- theme: args.theme,
7214
- },
7215
- };
7710
+ const data = updateUiState(previous, 'contentLanguage', args.languageCode);
7216
7711
  cache.writeQuery({ query: GET_UI_STATE, data });
7217
- return args.theme;
7712
+ return args.languageCode;
7218
7713
  }, ɵ7 = (_, args, { cache }) => {
7714
+ // tslint:disable-next-line:no-non-null-assertion
7715
+ const previous = cache.readQuery({ query: GET_UI_STATE });
7716
+ const data = updateUiState(previous, 'theme', args.theme);
7717
+ cache.writeQuery({ query: GET_UI_STATE, data });
7718
+ return args.theme;
7719
+ }, ɵ8 = (_, args, { cache }) => {
7720
+ // tslint:disable-next-line:no-non-null-assertion
7721
+ const previous = cache.readQuery({ query: GET_UI_STATE });
7722
+ const data = updateUiState(previous, 'displayUiExtensionPoints', args.display);
7723
+ cache.writeQuery({ query: GET_UI_STATE, data });
7724
+ return args.display;
7725
+ }, ɵ9 = (_, args, { cache }) => {
7219
7726
  // tslint:disable-next-line:no-non-null-assertion
7220
7727
  const previous = cache.readQuery({ query: GET_USER_STATUS });
7221
7728
  const activeChannel = previous.userStatus.channels.find(c => c.id === args.channelId);
@@ -7228,7 +7735,7 @@ const ɵ0$2 = (_, args, { cache }) => {
7228
7735
  };
7229
7736
  cache.writeQuery({ query: GET_USER_STATUS, data });
7230
7737
  return data.userStatus;
7231
- }, ɵ8 = (_, args, { cache }) => {
7738
+ }, ɵ10 = (_, args, { cache }) => {
7232
7739
  // tslint:disable-next-line:no-non-null-assertion
7233
7740
  const previous = cache.readQuery({ query: GET_USER_STATUS });
7234
7741
  const data = {
@@ -7244,12 +7751,19 @@ const clientResolvers = {
7244
7751
  setAsLoggedIn: ɵ2,
7245
7752
  setAsLoggedOut: ɵ3,
7246
7753
  setUiLanguage: ɵ4,
7247
- setContentLanguage: ɵ5,
7248
- setUiTheme: ɵ6,
7249
- setActiveChannel: ɵ7,
7250
- updateUserChannels: ɵ8,
7754
+ setUiLocale: ɵ5,
7755
+ setContentLanguage: ɵ6,
7756
+ setUiTheme: ɵ7,
7757
+ setDisplayUiExtensionPoints: ɵ8,
7758
+ setActiveChannel: ɵ9,
7759
+ updateUserChannels: ɵ10,
7251
7760
  },
7252
7761
  };
7762
+ function updateUiState(previous, key, value) {
7763
+ return {
7764
+ uiState: Object.assign(Object.assign({}, previous.uiState), { [key]: value, __typename: 'UiState' }),
7765
+ };
7766
+ }
7253
7767
  function updateRequestsInFlight(cache, increment) {
7254
7768
  const previous = cache.readQuery({ query: GET_NEWTORK_STATUS });
7255
7769
  const inFlightRequests = previous ? previous.networkStatus.inFlightRequests + increment : increment;
@@ -7320,7 +7834,25 @@ FetchAdapter.ctorParameters = () => [
7320
7834
  // How many ms before the toast is dismissed.
7321
7835
  const TOAST_DURATION = 3000;
7322
7836
  /**
7837
+ * @description
7323
7838
  * Provides toast notification functionality.
7839
+ *
7840
+ * @example
7841
+ * ```TypeScript
7842
+ * class MyComponent {
7843
+ * constructor(private notificationService: NotificationService) {}
7844
+ *
7845
+ * save() {
7846
+ * this.notificationService
7847
+ * .success(_('asset.notify-create-assets-success'), {
7848
+ * count: successCount,
7849
+ * });
7850
+ * }
7851
+ * }
7852
+ *
7853
+ * @docsCategory providers
7854
+ * @docsPage NotificationService
7855
+ * @docsWeight 0
7324
7856
  */
7325
7857
  class NotificationService {
7326
7858
  constructor(i18nService, resolver, overlayHostService) {
@@ -7333,6 +7865,7 @@ class NotificationService {
7333
7865
  return this.overlayHostService.getHostView();
7334
7866
  }
7335
7867
  /**
7868
+ * @description
7336
7869
  * Display a success toast notification
7337
7870
  */
7338
7871
  success(message, translationVars) {
@@ -7343,6 +7876,7 @@ class NotificationService {
7343
7876
  });
7344
7877
  }
7345
7878
  /**
7879
+ * @description
7346
7880
  * Display an info toast notification
7347
7881
  */
7348
7882
  info(message, translationVars) {
@@ -7353,6 +7887,7 @@ class NotificationService {
7353
7887
  });
7354
7888
  }
7355
7889
  /**
7890
+ * @description
7356
7891
  * Display a warning toast notification
7357
7892
  */
7358
7893
  warning(message, translationVars) {
@@ -7363,6 +7898,7 @@ class NotificationService {
7363
7898
  });
7364
7899
  }
7365
7900
  /**
7901
+ * @description
7366
7902
  * Display an error toast notification
7367
7903
  */
7368
7904
  error(message, translationVars) {
@@ -7374,6 +7910,7 @@ class NotificationService {
7374
7910
  });
7375
7911
  }
7376
7912
  /**
7913
+ * @description
7377
7914
  * Display a toast notification.
7378
7915
  */
7379
7916
  notify(config) {
@@ -7753,10 +8290,11 @@ ComponentRegistryService.decorators = [
7753
8290
 
7754
8291
  /**
7755
8292
  * This service allows the registration of custom controls for customFields.
8293
+ *
8294
+ * @deprecated The ComponentRegistryService now handles custom field components directly.
7756
8295
  */
7757
8296
  class CustomFieldComponentService {
7758
- constructor(componentFactoryResolver, componentRegistryService) {
7759
- this.componentFactoryResolver = componentFactoryResolver;
8297
+ constructor(componentRegistryService) {
7760
8298
  this.componentRegistryService = componentRegistryService;
7761
8299
  }
7762
8300
  /**
@@ -7783,17 +8321,23 @@ class CustomFieldComponentService {
7783
8321
  return id;
7784
8322
  }
7785
8323
  }
7786
- CustomFieldComponentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CustomFieldComponentService_Factory() { return new CustomFieldComponentService(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(ComponentRegistryService)); }, token: CustomFieldComponentService, providedIn: "root" });
8324
+ CustomFieldComponentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CustomFieldComponentService_Factory() { return new CustomFieldComponentService(i0.ɵɵinject(ComponentRegistryService)); }, token: CustomFieldComponentService, providedIn: "root" });
7787
8325
  CustomFieldComponentService.decorators = [
7788
8326
  { type: Injectable, args: [{
7789
8327
  providedIn: 'root',
7790
8328
  },] }
7791
8329
  ];
7792
8330
  CustomFieldComponentService.ctorParameters = () => [
7793
- { type: ComponentFactoryResolver },
7794
8331
  { type: ComponentRegistryService }
7795
8332
  ];
7796
8333
 
8334
+ /**
8335
+ * @description
8336
+ * A checkbox input. The default input component for `boolean` fields.
8337
+ *
8338
+ * @docsCategory custom-input-components
8339
+ * @docsPage default-inputs
8340
+ */
7797
8341
  class BooleanFormInputComponent {
7798
8342
  }
7799
8343
  BooleanFormInputComponent.id = 'boolean-form-input';
@@ -7806,36 +8350,174 @@ BooleanFormInputComponent.decorators = [
7806
8350
  },] }
7807
8351
  ];
7808
8352
 
7809
- class CurrencyFormInputComponent {
7810
- constructor(dataService) {
7811
- this.dataService = dataService;
7812
- this.currencyCode$ = this.dataService.settings
7813
- .getActiveChannel()
7814
- .mapStream(data => data.activeChannel.currencyCode);
7815
- }
8353
+ function jsonValidator() {
8354
+ return (control) => {
8355
+ const error = { jsonInvalid: true };
8356
+ try {
8357
+ JSON.parse(control.value);
8358
+ }
8359
+ catch (e) {
8360
+ control.setErrors(error);
8361
+ return error;
8362
+ }
8363
+ control.setErrors(null);
8364
+ return null;
8365
+ };
7816
8366
  }
7817
- CurrencyFormInputComponent.id = 'currency-form-input';
7818
- CurrencyFormInputComponent.decorators = [
7819
- { type: Component, args: [{
7820
- selector: 'vdr-currency-form-input',
7821
- template: "<vdr-currency-input\r\n [formControl]=\"formControl\"\r\n [readonly]=\"readonly\"\r\n [currencyCode]=\"currencyCode$ | async\"\r\n></vdr-currency-input>\r\n",
7822
- changeDetection: ChangeDetectionStrategy.OnPush,
7823
- styles: [""]
7824
- },] }
7825
- ];
7826
- CurrencyFormInputComponent.ctorParameters = () => [
7827
- { type: DataService }
7828
- ];
7829
- CurrencyFormInputComponent.propDecorators = {
7830
- readonly: [{ type: Input }]
7831
- };
7832
-
7833
- class CustomerGroupFormInputComponent {
7834
- constructor(dataService) {
7835
- this.dataService = dataService;
8367
+ /**
8368
+ * @description
8369
+ * A JSON editor input with syntax highlighting and error detection. Works well
8370
+ * with `text` type fields.
8371
+ *
8372
+ * @docsCategory custom-input-components
8373
+ * @docsPage default-inputs
8374
+ */
8375
+ class JsonEditorFormInputComponent {
8376
+ constructor(changeDetector) {
8377
+ this.changeDetector = changeDetector;
8378
+ this.isValid = true;
8379
+ }
8380
+ get height() {
8381
+ var _a;
8382
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.height) || this.config.height;
7836
8383
  }
7837
8384
  ngOnInit() {
7838
- this.customerGroups$ = this.dataService.customer
8385
+ this.formControl.addValidators(jsonValidator());
8386
+ }
8387
+ ngAfterViewInit() {
8388
+ let lastVal = '';
8389
+ const highlight = (editor) => {
8390
+ var _a;
8391
+ const code = (_a = editor.textContent) !== null && _a !== void 0 ? _a : '';
8392
+ if (code === lastVal) {
8393
+ return;
8394
+ }
8395
+ lastVal = code;
8396
+ this.errorMessage = this.getJsonError(code);
8397
+ this.changeDetector.markForCheck();
8398
+ editor.innerHTML = this.syntaxHighlight(code, this.getErrorPos(this.errorMessage));
8399
+ };
8400
+ this.jar = CodeJar(this.editorElementRef.nativeElement, highlight);
8401
+ this.jar.onUpdate(value => {
8402
+ this.formControl.setValue(value);
8403
+ this.formControl.markAsDirty();
8404
+ this.isValid = this.formControl.valid;
8405
+ });
8406
+ this.jar.updateCode(this.formControl.value);
8407
+ if (this.readonly) {
8408
+ this.editorElementRef.nativeElement.contentEditable = 'false';
8409
+ }
8410
+ }
8411
+ getJsonError(json) {
8412
+ try {
8413
+ JSON.parse(json);
8414
+ }
8415
+ catch (e) {
8416
+ return e.message;
8417
+ }
8418
+ return;
8419
+ }
8420
+ getErrorPos(errorMessage) {
8421
+ if (!errorMessage) {
8422
+ return;
8423
+ }
8424
+ const matches = errorMessage.match(/at position (\d+)/);
8425
+ const pos = matches === null || matches === void 0 ? void 0 : matches[1];
8426
+ return pos != null ? +pos : undefined;
8427
+ }
8428
+ syntaxHighlight(json, errorPos) {
8429
+ json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
8430
+ let hasMarkedError = false;
8431
+ return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, (match, ...args) => {
8432
+ let cls = 'number';
8433
+ if (/^"/.test(match)) {
8434
+ if (/:$/.test(match)) {
8435
+ cls = 'key';
8436
+ }
8437
+ else {
8438
+ cls = 'string';
8439
+ }
8440
+ }
8441
+ else if (/true|false/.test(match)) {
8442
+ cls = 'boolean';
8443
+ }
8444
+ else if (/null/.test(match)) {
8445
+ cls = 'null';
8446
+ }
8447
+ let errorClass = '';
8448
+ if (errorPos && !hasMarkedError) {
8449
+ const length = args[0].length;
8450
+ const offset = args[4];
8451
+ if (errorPos <= length + offset) {
8452
+ errorClass = 'je-error';
8453
+ hasMarkedError = true;
8454
+ }
8455
+ }
8456
+ return '<span class="je-' + cls + ' ' + errorClass + '">' + match + '</span>';
8457
+ });
8458
+ }
8459
+ }
8460
+ JsonEditorFormInputComponent.id = 'json-editor-form-input';
8461
+ JsonEditorFormInputComponent.decorators = [
8462
+ { type: Component, args: [{
8463
+ selector: 'vdr-json-editor-form-input',
8464
+ template: "<div #editor class=\"json-editor\" [class.invalid]=\"!isValid\" [style.height]=\"height || '300px'\"></div>\r\n<div class=\"error-message\">\r\n <span *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n</div>\r\n",
8465
+ changeDetection: ChangeDetectionStrategy.OnPush,
8466
+ styles: [".json-editor{min-height:6rem;background-color:var(--color-json-editor-background-color);color:var(--color-json-editor-text);border:1px solid var(--color-component-border-200);border-radius:3px;padding:6px;-moz-tab-size:4;tab-size:4;font-family:\"Source Code Pro\",\"Lucida Console\",Monaco,monospace;font-size:14px;font-weight:400;height:340px;letter-spacing:normal;line-height:20px;resize:both;text-align:initial;min-width:200px}.json-editor:focus{border-color:var(--color-primary-500)}.json-editor.invalid{border-color:var(--clr-forms-invalid-color)}.json-editor ::ng-deep .je-string{color:var(--color-json-editor-string)}.json-editor ::ng-deep .je-number{color:var(--color-json-editor-number)}.json-editor ::ng-deep .je-boolean{color:var(--color-json-editor-boolean)}.json-editor ::ng-deep .je-null{color:var(--color-json-editor-null)}.json-editor ::ng-deep .je-key{color:var(--color-json-editor-key)}.json-editor ::ng-deep .je-error{-webkit-text-decoration-line:underline;text-decoration-line:underline;-webkit-text-decoration-style:wavy;text-decoration-style:wavy;-webkit-text-decoration-color:var(--color-json-editor-error);text-decoration-color:var(--color-json-editor-error)}.error-message{min-height:1rem;color:var(--color-json-editor-error)}\n"]
8467
+ },] }
8468
+ ];
8469
+ JsonEditorFormInputComponent.ctorParameters = () => [
8470
+ { type: ChangeDetectorRef }
8471
+ ];
8472
+ JsonEditorFormInputComponent.propDecorators = {
8473
+ editorElementRef: [{ type: ViewChild, args: ['editor',] }]
8474
+ };
8475
+
8476
+ /**
8477
+ * @description
8478
+ * An input for monetary values. Should be used with `int` type fields.
8479
+ *
8480
+ * @docsCategory custom-input-components
8481
+ * @docsPage default-inputs
8482
+ */
8483
+ class CurrencyFormInputComponent {
8484
+ constructor(dataService) {
8485
+ this.dataService = dataService;
8486
+ this.currencyCode$ = this.dataService.settings
8487
+ .getActiveChannel()
8488
+ .mapStream(data => data.activeChannel.currencyCode);
8489
+ }
8490
+ }
8491
+ CurrencyFormInputComponent.id = 'currency-form-input';
8492
+ CurrencyFormInputComponent.decorators = [
8493
+ { type: Component, args: [{
8494
+ selector: 'vdr-currency-form-input',
8495
+ template: "<vdr-currency-input\r\n [formControl]=\"formControl\"\r\n [readonly]=\"readonly\"\r\n [currencyCode]=\"currencyCode$ | async\"\r\n></vdr-currency-input>\r\n",
8496
+ changeDetection: ChangeDetectionStrategy.OnPush,
8497
+ styles: [""]
8498
+ },] }
8499
+ ];
8500
+ CurrencyFormInputComponent.ctorParameters = () => [
8501
+ { type: DataService }
8502
+ ];
8503
+ CurrencyFormInputComponent.propDecorators = {
8504
+ readonly: [{ type: Input }]
8505
+ };
8506
+
8507
+ /**
8508
+ * @description
8509
+ * Allows the selection of a Customer via an autocomplete select input.
8510
+ * Should be used with `ID` type fields which represent Customer IDs.
8511
+ *
8512
+ * @docsCategory custom-input-components
8513
+ * @docsPage default-inputs
8514
+ */
8515
+ class CustomerGroupFormInputComponent {
8516
+ constructor(dataService) {
8517
+ this.dataService = dataService;
8518
+ }
8519
+ ngOnInit() {
8520
+ this.customerGroups$ = this.dataService.customer
7839
8521
  .getCustomerGroupList({
7840
8522
  take: 1000,
7841
8523
  })
@@ -7862,13 +8544,32 @@ CustomerGroupFormInputComponent.propDecorators = {
7862
8544
  readonly: [{ type: Input }]
7863
8545
  };
7864
8546
 
8547
+ /**
8548
+ * @description
8549
+ * Allows selection of a datetime. Default input for `datetime` type fields.
8550
+ *
8551
+ * @docsCategory custom-input-components
8552
+ * @docsPage default-inputs
8553
+ */
7865
8554
  class DateFormInputComponent {
8555
+ get min() {
8556
+ var _a;
8557
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
8558
+ }
8559
+ get max() {
8560
+ var _a;
8561
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
8562
+ }
8563
+ get yearRange() {
8564
+ var _a;
8565
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.yearRange) || this.config.yearRange;
8566
+ }
7866
8567
  }
7867
8568
  DateFormInputComponent.id = 'date-form-input';
7868
8569
  DateFormInputComponent.decorators = [
7869
8570
  { type: Component, args: [{
7870
8571
  selector: 'vdr-date-form-input',
7871
- template: "<vdr-datetime-picker\r\n [formControl]=\"formControl\"\r\n [min]=\"config?.min\"\r\n [max]=\"config?.max\"\r\n [yearRange]=\"config?.yearRange\"\r\n [readonly]=\"readonly\"\r\n>\r\n</vdr-datetime-picker>\r\n",
8572
+ template: "<vdr-datetime-picker\r\n [formControl]=\"formControl\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [yearRange]=\"yearRange\"\r\n [readonly]=\"readonly\"\r\n>\r\n</vdr-datetime-picker>\r\n",
7872
8573
  changeDetection: ChangeDetectionStrategy.OnPush,
7873
8574
  styles: [""]
7874
8575
  },] }
@@ -7877,6 +8578,14 @@ DateFormInputComponent.propDecorators = {
7877
8578
  readonly: [{ type: Input }]
7878
8579
  };
7879
8580
 
8581
+ /**
8582
+ * @description
8583
+ * Allows the selection of multiple FacetValues via an autocomplete select input.
8584
+ * Should be used with `ID` type **list** fields which represent FacetValue IDs.
8585
+ *
8586
+ * @docsCategory custom-input-components
8587
+ * @docsPage default-inputs
8588
+ */
7880
8589
  class FacetValueFormInputComponent {
7881
8590
  constructor(dataService) {
7882
8591
  this.dataService = dataService;
@@ -7902,13 +8611,40 @@ FacetValueFormInputComponent.ctorParameters = () => [
7902
8611
  { type: DataService }
7903
8612
  ];
7904
8613
 
8614
+ /**
8615
+ * @description
8616
+ * Displays a number input. Default input for `int` and `float` type fields.
8617
+ *
8618
+ * @docsCategory custom-input-components
8619
+ * @docsPage default-inputs
8620
+ */
7905
8621
  class NumberFormInputComponent {
8622
+ get prefix() {
8623
+ var _a;
8624
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.prefix) || this.config.prefix;
8625
+ }
8626
+ get suffix() {
8627
+ var _a;
8628
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.suffix) || this.config.suffix;
8629
+ }
8630
+ get min() {
8631
+ var _a;
8632
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
8633
+ }
8634
+ get max() {
8635
+ var _a;
8636
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
8637
+ }
8638
+ get step() {
8639
+ var _a;
8640
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.step) || this.config.step;
8641
+ }
7906
8642
  }
7907
8643
  NumberFormInputComponent.id = 'number-form-input';
7908
8644
  NumberFormInputComponent.decorators = [
7909
8645
  { type: Component, args: [{
7910
8646
  selector: 'vdr-number-form-input',
7911
- template: "<vdr-affixed-input [suffix]=\"config?.suffix\" [prefix]=\"config?.prefix\">\r\n <input\r\n type=\"number\"\r\n [readonly]=\"readonly\"\r\n [min]=\"config?.min\"\r\n [max]=\"config?.max\"\r\n [step]=\"config?.step\"\r\n [formControl]=\"formControl\"\r\n />\r\n</vdr-affixed-input>\r\n",
8647
+ template: "<vdr-affixed-input\r\n [suffix]=\"suffix\"\r\n [prefix]=\"prefix\"\r\n>\r\n <input\r\n type=\"number\"\r\n [readonly]=\"readonly\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"step\"\r\n [formControl]=\"formControl\"\r\n />\r\n</vdr-affixed-input>\r\n",
7912
8648
  changeDetection: ChangeDetectionStrategy.OnPush,
7913
8649
  styles: [""]
7914
8650
  },] }
@@ -7917,6 +8653,13 @@ NumberFormInputComponent.propDecorators = {
7917
8653
  readonly: [{ type: Input }]
7918
8654
  };
7919
8655
 
8656
+ /**
8657
+ * @description
8658
+ * Displays a password text input. Should be used with `string` type fields.
8659
+ *
8660
+ * @docsCategory custom-input-components
8661
+ * @docsPage default-inputs
8662
+ */
7920
8663
  class PasswordFormInputComponent {
7921
8664
  }
7922
8665
  PasswordFormInputComponent.id = 'password-form-input';
@@ -7929,6 +8672,14 @@ PasswordFormInputComponent.decorators = [
7929
8672
  },] }
7930
8673
  ];
7931
8674
 
8675
+ /**
8676
+ * @description
8677
+ * Allows the selection of multiple ProductVariants via an autocomplete select input.
8678
+ * Should be used with `ID` type **list** fields which represent ProductVariant IDs.
8679
+ *
8680
+ * @docsCategory custom-input-components
8681
+ * @docsPage default-inputs
8682
+ */
7932
8683
  class ProductSelectorFormInputComponent {
7933
8684
  constructor(dataService) {
7934
8685
  this.dataService = dataService;
@@ -7976,6 +8727,15 @@ ProductSelectorFormInputComponent.ctorParameters = () => [
7976
8727
  { type: DataService }
7977
8728
  ];
7978
8729
 
8730
+ /**
8731
+ * @description
8732
+ * The default input component for `relation` type custom fields. Allows the selection
8733
+ * of a ProductVariant, Product, Customer or Asset. For other entity types, a custom
8734
+ * implementation will need to be defined. See {@link registerFormInputComponent}.
8735
+ *
8736
+ * @docsCategory custom-input-components
8737
+ * @docsPage default-inputs
8738
+ */
7979
8739
  class RelationFormInputComponent {
7980
8740
  }
7981
8741
  RelationFormInputComponent.id = 'relation-form-input';
@@ -7991,13 +8751,44 @@ RelationFormInputComponent.propDecorators = {
7991
8751
  readonly: [{ type: Input }]
7992
8752
  };
7993
8753
 
8754
+ /**
8755
+ * @description
8756
+ * Uses the {@link RichTextEditorComponent} as in input for `text` type fields.
8757
+ *
8758
+ * @docsCategory custom-input-components
8759
+ * @docsPage default-inputs
8760
+ */
8761
+ class RichTextFormInputComponent {
8762
+ }
8763
+ RichTextFormInputComponent.id = 'rich-text-form-input';
8764
+ RichTextFormInputComponent.decorators = [
8765
+ { type: Component, args: [{
8766
+ selector: 'vdr-rich-text-form-input',
8767
+ template: "<vdr-rich-text-editor\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n></vdr-rich-text-editor>\r\n",
8768
+ changeDetection: ChangeDetectionStrategy.OnPush,
8769
+ styles: [":host textarea{resize:both;height:6rem;width:100%}\n"]
8770
+ },] }
8771
+ ];
8772
+
8773
+ /**
8774
+ * @description
8775
+ * Uses a select input to allow the selection of a string value. Should be used with
8776
+ * `string` type fields with options.
8777
+ *
8778
+ * @docsCategory custom-input-components
8779
+ * @docsPage default-inputs
8780
+ */
7994
8781
  class SelectFormInputComponent {
8782
+ get options() {
8783
+ var _a;
8784
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.options) || this.config.options;
8785
+ }
7995
8786
  }
7996
8787
  SelectFormInputComponent.id = 'select-form-input';
7997
8788
  SelectFormInputComponent.decorators = [
7998
8789
  { type: Component, args: [{
7999
8790
  selector: 'vdr-select-form-input',
8000
- template: "<select clrSelect [formControl]=\"formControl\" [vdrDisabled]=\"readonly\">\r\n <option *ngIf=\"config.nullable\" [ngValue]=\"null\"></option>\r\n <option *ngFor=\"let option of config.options\" [value]=\"option.value\">\r\n {{ (option | customFieldLabel) || option.label || option.value }}\r\n </option>\r\n</select>\r\n",
8791
+ template: "<select clrSelect [formControl]=\"formControl\" [vdrDisabled]=\"readonly\">\r\n <option *ngIf=\"config.nullable\" [ngValue]=\"null\"></option>\r\n <option *ngFor=\"let option of options\" [value]=\"option.value\">\r\n {{ (option | customFieldLabel) || option.label || option.value }}\r\n </option>\r\n</select>\r\n",
8001
8792
  changeDetection: ChangeDetectionStrategy.OnPush,
8002
8793
  styles: ["select{width:100%}\n"]
8003
8794
  },] }
@@ -8006,18 +8797,40 @@ SelectFormInputComponent.propDecorators = {
8006
8797
  readonly: [{ type: Input }]
8007
8798
  };
8008
8799
 
8800
+ /**
8801
+ * @description
8802
+ * Uses a regular text form input. This is the default input for `string` and `localeString` type fields.
8803
+ *
8804
+ * @docsCategory custom-input-components
8805
+ * @docsPage default-inputs
8806
+ */
8009
8807
  class TextFormInputComponent {
8808
+ get prefix() {
8809
+ var _a;
8810
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.prefix) || this.config.prefix;
8811
+ }
8812
+ get suffix() {
8813
+ var _a;
8814
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.suffix) || this.config.suffix;
8815
+ }
8010
8816
  }
8011
8817
  TextFormInputComponent.id = 'text-form-input';
8012
8818
  TextFormInputComponent.decorators = [
8013
8819
  { type: Component, args: [{
8014
8820
  selector: 'vdr-text-form-input',
8015
- template: "<input\r\n type=\"text\"\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n/>\r\n",
8821
+ template: "<vdr-affixed-input\r\n [suffix]=\"suffix\"\r\n [prefix]=\"prefix\"\r\n>\r\n <input type=\"text\" [readonly]=\"readonly\" [formControl]=\"formControl\" />\r\n</vdr-affixed-input>\r\n",
8016
8822
  changeDetection: ChangeDetectionStrategy.OnPush,
8017
8823
  styles: ["input{width:100%}\n"]
8018
8824
  },] }
8019
8825
  ];
8020
8826
 
8827
+ /**
8828
+ * @description
8829
+ * Uses textarea form input. This is the default input for `text` type fields.
8830
+ *
8831
+ * @docsCategory custom-input-components
8832
+ * @docsPage default-inputs
8833
+ */
8021
8834
  class TextareaFormInputComponent {
8022
8835
  get spellcheck() {
8023
8836
  return this.config.spellcheck === true;
@@ -8046,11 +8859,14 @@ const defaultFormInputs = [
8046
8859
  PasswordFormInputComponent,
8047
8860
  RelationFormInputComponent,
8048
8861
  TextareaFormInputComponent,
8862
+ RichTextFormInputComponent,
8863
+ JsonEditorFormInputComponent,
8049
8864
  ];
8050
8865
  /**
8051
8866
  * @description
8052
8867
  * Registers a custom FormInputComponent which can be used to control the argument inputs
8053
- * of a {@link ConfigurableOperationDef} (e.g. CollectionFilter, ShippingMethod etc)
8868
+ * of a {@link ConfigurableOperationDef} (e.g. CollectionFilter, ShippingMethod etc) or for
8869
+ * a custom field.
8054
8870
  *
8055
8871
  * @example
8056
8872
  * ```TypeScript
@@ -8063,6 +8879,35 @@ const defaultFormInputs = [
8063
8879
  * })
8064
8880
  * export class MyUiExtensionModule {}
8065
8881
  * ```
8882
+ *
8883
+ * This input component can then be used in a custom field:
8884
+ *
8885
+ * @example
8886
+ * ```TypeScript
8887
+ * const config = {
8888
+ * // ...
8889
+ * customFields: {
8890
+ * ProductVariant: [
8891
+ * {
8892
+ * name: 'rrp',
8893
+ * type: 'int',
8894
+ * ui: { component: 'my-custom-input' },
8895
+ * },
8896
+ * ]
8897
+ * }
8898
+ * }
8899
+ * ```
8900
+ *
8901
+ * or with an argument of a {@link ConfigurableOperationDef}:
8902
+ *
8903
+ * @example
8904
+ * ```TypeScript
8905
+ * args: {
8906
+ * rrp: { type: 'int', ui: { component: 'my-custom-input' } },
8907
+ * }
8908
+ * ```
8909
+ *
8910
+ * @docsCategory custom-input-components
8066
8911
  */
8067
8912
  function registerFormInputComponent(id, component) {
8068
8913
  return {
@@ -8076,6 +8921,8 @@ function registerFormInputComponent(id, component) {
8076
8921
  }
8077
8922
  /**
8078
8923
  * @description
8924
+ * **Deprecated** use `registerFormInputComponent()` in combination with the customField `ui` config instead.
8925
+ *
8079
8926
  * Registers a custom component to act as the form input control for the given custom field.
8080
8927
  * This should be used in the NgModule `providers` array of your ui extension module.
8081
8928
  *
@@ -8090,6 +8937,10 @@ function registerFormInputComponent(id, component) {
8090
8937
  * })
8091
8938
  * export class MyUiExtensionModule {}
8092
8939
  * ```
8940
+ *
8941
+ * @deprecated use `registerFormInputComponent()` in combination with the customField `ui` config instead.
8942
+ *
8943
+ * @docsCategory custom-input-components
8093
8944
  */
8094
8945
  function registerCustomFieldComponent(entity, fieldName, component) {
8095
8946
  return {
@@ -8163,9 +9014,9 @@ class ActionBarItemsComponent {
8163
9014
  ActionBarItemsComponent.decorators = [
8164
9015
  { type: Component, args: [{
8165
9016
  selector: 'vdr-action-bar-items',
8166
- template: "<ng-container *ngFor=\"let item of items$ | async\">\r\n <button *vdrIfPermissions=\"item.requiresPermission\"\r\n [routerLink]=\"getRouterLink(item)\"\r\n [disabled]=\"item.disabled ? (item.disabled | async) : false\"\r\n (click)=\"handleClick($event, item)\"\r\n [ngClass]=\"getButtonStyles(item)\">\r\n <clr-icon *ngIf=\"item.icon\" [attr.shape]=\"item.icon\"></clr-icon>\r\n {{ item.label | translate }}\r\n </button>\r\n</ng-container>\r\n",
9017
+ template: "<vdr-ui-extension-point [locationId]=\"locationId\" api=\"actionBar\" [leftPx]=\"-24\" [topPx]=\"-6\">\r\n <ng-container *ngFor=\"let item of items$ | async\">\r\n <button\r\n *vdrIfPermissions=\"item.requiresPermission\"\r\n [routerLink]=\"getRouterLink(item)\"\r\n [disabled]=\"item.disabled ? (item.disabled | async) : false\"\r\n (click)=\"handleClick($event, item)\"\r\n [ngClass]=\"getButtonStyles(item)\"\r\n >\r\n <clr-icon *ngIf=\"item.icon\" [attr.shape]=\"item.icon\"></clr-icon>\r\n {{ item.label | translate }}\r\n </button>\r\n </ng-container>\r\n</vdr-ui-extension-point>\r\n",
8167
9018
  changeDetection: ChangeDetectionStrategy.OnPush,
8168
- styles: [""]
9019
+ styles: [":host{display:inline-block;min-height:36px}\n"]
8169
9020
  },] }
8170
9021
  ];
8171
9022
  ActionBarItemsComponent.ctorParameters = () => [
@@ -8216,7 +9067,7 @@ ActionBarComponent.decorators = [
8216
9067
  { type: Component, args: [{
8217
9068
  selector: 'vdr-action-bar',
8218
9069
  template: "<div class=\"left-content\" [class.grow]=\"left?.grow\"><ng-content select=\"vdr-ab-left\"></ng-content></div>\r\n<div class=\"right-content\" [class.grow]=\"right?.grow\"><ng-content select=\"vdr-ab-right\"></ng-content></div>\r\n",
8219
- styles: [":host{display:flex;justify-content:space-between;align-items:flex-start;background-color:var(--color-component-bg-100);position:sticky;top:-24px;z-index:25;border-bottom:1px solid var(--color-component-border-200)}:host>.grow{flex:1}\n"]
9070
+ styles: [":host{display:flex;justify-content:space-between;align-items:baseline;background-color:var(--color-component-bg-100);position:sticky;top:-24px;z-index:25;border-bottom:1px solid var(--color-component-border-200)}:host>.grow{flex:1}\n"]
8220
9071
  },] }
8221
9072
  ];
8222
9073
  ActionBarComponent.propDecorators = {
@@ -8229,7 +9080,7 @@ class AddressFormComponent {
8229
9080
  AddressFormComponent.decorators = [
8230
9081
  { type: Component, args: [{
8231
9082
  selector: 'vdr-address-form',
8232
- template: "<form [formGroup]=\"formGroup\">\r\n <clr-input-container>\r\n <label>{{ 'customer.full-name' | translate }}</label>\r\n <input formControlName=\"fullName\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.street-line-1' | translate }}</label>\r\n <input formControlName=\"streetLine1\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.street-line-2' | translate }}</label>\r\n <input formControlName=\"streetLine2\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.city' | translate }}</label>\r\n <input formControlName=\"city\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.province' | translate }}</label>\r\n <input formControlName=\"province\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.postal-code' | translate }}</label>\r\n <input formControlName=\"postalCode\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.country' | translate }}</label>\r\n <select name=\"countryCode\" formControlName=\"countryCode\" clrInput clrSelect>\r\n <option *ngFor=\"let country of availableCountries\" [value]=\"country.code\">\r\n {{ country.name }}\r\n </option>\r\n </select>\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <clr-input-container>\r\n <label>{{ 'customer.phone-number' | translate }}</label>\r\n <input formControlName=\"phoneNumber\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n <section formGroupName=\"customFields\" *ngIf=\"formGroup.get('customFields') as customFieldsGroup\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <ng-container *ngFor=\"let customField of customFields\">\r\n <vdr-custom-field-control\r\n entityName=\"Address\"\r\n [customFieldsFormGroup]=\"customFieldsGroup\"\r\n [customField]=\"customField\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </section>\r\n</form>\r\n",
9083
+ template: "<form [formGroup]=\"formGroup\">\r\n <clr-input-container>\r\n <label>{{ 'customer.full-name' | translate }}</label>\r\n <input formControlName=\"fullName\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.street-line-1' | translate }}</label>\r\n <input formControlName=\"streetLine1\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.street-line-2' | translate }}</label>\r\n <input formControlName=\"streetLine2\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.city' | translate }}</label>\r\n <input formControlName=\"city\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.province' | translate }}</label>\r\n <input formControlName=\"province\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.postal-code' | translate }}</label>\r\n <input formControlName=\"postalCode\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n </div>\r\n <div class=\"clr-col-md-4\">\r\n <clr-input-container>\r\n <label>{{ 'customer.country' | translate }}</label>\r\n <select name=\"countryCode\" formControlName=\"countryCode\" clrInput clrSelect>\r\n <option *ngFor=\"let country of availableCountries\" [value]=\"country.code\">\r\n {{ country.name }}\r\n </option>\r\n </select>\r\n </clr-input-container>\r\n </div>\r\n </div>\r\n <clr-input-container>\r\n <label>{{ 'customer.phone-number' | translate }}</label>\r\n <input formControlName=\"phoneNumber\" type=\"text\" clrInput/>\r\n </clr-input-container>\r\n <section formGroupName=\"customFields\" *ngIf=\"formGroup.get('customFields') as customFieldsGroup\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Address\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"customFieldsGroup\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n</form>\r\n",
8233
9084
  changeDetection: ChangeDetectionStrategy.OnPush,
8234
9085
  styles: [""]
8235
9086
  },] }
@@ -8546,7 +9397,25 @@ AssetGalleryComponent.propDecorators = {
8546
9397
  };
8547
9398
 
8548
9399
  /**
9400
+ * @description
8549
9401
  * A dialog which allows the creation and selection of assets.
9402
+ *
9403
+ * @example
9404
+ * ```TypeScript
9405
+ * selectAssets() {
9406
+ * this.modalService
9407
+ * .fromComponent(AssetPickerDialogComponent, {
9408
+ * size: 'xl',
9409
+ * })
9410
+ * .subscribe(result => {
9411
+ * if (result && result.length) {
9412
+ * // ...
9413
+ * }
9414
+ * });
9415
+ * }
9416
+ * ```
9417
+ *
9418
+ * @docsCategory components
8550
9419
  */
8551
9420
  class AssetPickerDialogComponent {
8552
9421
  constructor(dataService, notificationService) {
@@ -8762,10 +9631,6 @@ class AssetPreviewComponent {
8762
9631
  this.subscription.unsubscribe();
8763
9632
  }
8764
9633
  }
8765
- customFieldIsSet(name) {
8766
- var _a;
8767
- return !!((_a = this.customFieldsForm) === null || _a === void 0 ? void 0 : _a.get([name]));
8768
- }
8769
9634
  getSourceFileName() {
8770
9635
  const parts = this.asset.source.split('/');
8771
9636
  return parts[parts.length - 1];
@@ -8861,7 +9726,7 @@ class AssetPreviewComponent {
8861
9726
  AssetPreviewComponent.decorators = [
8862
9727
  { type: Component, args: [{
8863
9728
  selector: 'vdr-asset-preview',
8864
- template: "<div class=\"preview-image\" #previewDiv [class.centered]=\"centered\">\r\n <div class=\"image-wrapper\">\r\n <vdr-focal-point-control\r\n [width]=\"width\"\r\n [height]=\"height\"\r\n [fpx]=\"fpx\"\r\n [fpy]=\"fpy\"\r\n [editable]=\"settingFocalPoint\"\r\n (focalPointChange)=\"onFocalPointChange($event)\"\r\n >\r\n <img\r\n class=\"asset-image\"\r\n [src]=\"asset | assetPreview: size\"\r\n #imageElement\r\n (load)=\"onImageLoad()\"\r\n />\r\n </vdr-focal-point-control>\r\n <div class=\"focal-point-info\" *ngIf=\"settingFocalPoint\">\r\n <button class=\"icon-button\" (click)=\"setFocalPointCancel()\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"setFocalPointEnd()\" [disabled]=\"!lastFocalPoint\">\r\n <clr-icon shape=\"crosshairs\"></clr-icon>\r\n {{ 'asset.set-focal-point' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"controls\" [class.fade]=\"settingFocalPoint\">\r\n <form [formGroup]=\"form\">\r\n <clr-input-container class=\"name-input\" *ngIf=\"editable\">\r\n <label>{{ 'common.name' | translate }}</label>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateAsset'] | hasPermission) || settingFocalPoint\"\r\n />\r\n </clr-input-container>\r\n\r\n <vdr-labeled-data [label]=\"'common.name' | translate\" *ngIf=\"!editable\">\r\n <span class=\"elide\">\r\n {{ asset.name }}\r\n </span>\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.source-file' | translate\">\r\n <a [href]=\"asset.source\" [title]=\"asset.source\" target=\"_blank\" class=\"elide source-link\">{{\r\n getSourceFileName()\r\n }}</a>\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.original-asset-size' | translate\">\r\n {{ asset.fileSize | filesize }}\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.dimensions' | translate\">\r\n {{ asset.width }} x {{ asset.height }}\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.focal-point' | translate\">\r\n <span *ngIf=\"fpx\"\r\n ><clr-icon shape=\"crosshairs\"></clr-icon> x: {{ fpx | number: '1.2-2' }}, y:\r\n {{ fpy | number: '1.2-2' }}</span\r\n >\r\n <span *ngIf=\"!fpx\">{{ 'common.not-set' | translate }}</span>\r\n <br />\r\n <button\r\n class=\"btn btn-secondary-outline btn-sm\"\r\n [disabled]=\"settingFocalPoint\"\r\n (click)=\"setFocalPointStart()\"\r\n >\r\n <ng-container *ngIf=\"!fpx\">{{ 'asset.set-focal-point' | translate }}</ng-container>\r\n <ng-container *ngIf=\"fpx\">{{ 'asset.update-focal-point' | translate }}</ng-container>\r\n </button>\r\n <button\r\n class=\"btn btn-warning-outline btn-sm\"\r\n [disabled]=\"settingFocalPoint\"\r\n *ngIf=\"!!fpx\"\r\n (click)=\"removeFocalPoint()\"\r\n >\r\n {{ 'asset.unset-focal-point' | translate }}\r\n </button>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'common.tags' | translate\">\r\n <ng-container *ngIf=\"editable\">\r\n <vdr-tag-selector formControlName=\"tags\"></vdr-tag-selector>\r\n <button class=\"btn btn-link btn-sm\" (click)=\"manageTags()\">\r\n <clr-icon shape=\"tags\"></clr-icon>\r\n {{ 'common.manage-tags' | translate }}\r\n </button>\r\n </ng-container>\r\n <div *ngIf=\"!editable\">\r\n <vdr-chip *ngFor=\"let tag of asset.tags\" [colorFrom]=\"tag.value\">\r\n <clr-icon shape=\"tag\" class=\"mr2\"></clr-icon>\r\n {{ tag.value }}</vdr-chip\r\n >\r\n </div>\r\n </vdr-labeled-data>\r\n </form>\r\n <section *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <ng-container *ngFor=\"let customField of customFields\">\r\n <vdr-custom-field-control\r\n *ngIf=\"customFieldIsSet(customField.name)\"\r\n entityName=\"Asset\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"customFieldsForm\"\r\n [customField]=\"customField\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </section>\r\n <div class=\"flex-spacer\"></div>\r\n <div class=\"preview-select\">\r\n <clr-select-container>\r\n <label>{{ 'asset.preview' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"size\" [disabled]=\"settingFocalPoint\">\r\n <option value=\"tiny\">tiny</option>\r\n <option value=\"thumb\">thumb</option>\r\n <option value=\"small\">small</option>\r\n <option value=\"medium\">medium</option>\r\n <option value=\"large\">large</option>\r\n <option value=\"\">full size</option>\r\n </select>\r\n </clr-select-container>\r\n <div class=\"asset-detail\">{{ width }} x {{ height }}</div>\r\n </div>\r\n <a\r\n *ngIf=\"!editable\"\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['/catalog', 'assets', asset.id]\"\r\n (click)=\"editClick.emit()\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon> {{ 'common.edit' | translate }}\r\n </a>\r\n</div>\r\n",
9729
+ template: "<div class=\"preview-image\" #previewDiv [class.centered]=\"centered\">\r\n <div class=\"image-wrapper\">\r\n <vdr-focal-point-control\r\n [width]=\"width\"\r\n [height]=\"height\"\r\n [fpx]=\"fpx\"\r\n [fpy]=\"fpy\"\r\n [editable]=\"settingFocalPoint\"\r\n (focalPointChange)=\"onFocalPointChange($event)\"\r\n >\r\n <img\r\n class=\"asset-image\"\r\n [src]=\"asset | assetPreview: size\"\r\n #imageElement\r\n (load)=\"onImageLoad()\"\r\n />\r\n </vdr-focal-point-control>\r\n <div class=\"focal-point-info\" *ngIf=\"settingFocalPoint\">\r\n <button class=\"icon-button\" (click)=\"setFocalPointCancel()\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"setFocalPointEnd()\" [disabled]=\"!lastFocalPoint\">\r\n <clr-icon shape=\"crosshairs\"></clr-icon>\r\n {{ 'asset.set-focal-point' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"controls\" [class.fade]=\"settingFocalPoint\">\r\n <form [formGroup]=\"form\">\r\n <clr-input-container class=\"name-input\" *ngIf=\"editable\">\r\n <label>{{ 'common.name' | translate }}</label>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateAsset'] | hasPermission) || settingFocalPoint\"\r\n />\r\n </clr-input-container>\r\n\r\n <vdr-labeled-data [label]=\"'common.name' | translate\" *ngIf=\"!editable\">\r\n <span class=\"elide\">\r\n {{ asset.name }}\r\n </span>\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.source-file' | translate\">\r\n <a [href]=\"asset.source\" [title]=\"asset.source\" target=\"_blank\" class=\"elide source-link\">{{\r\n getSourceFileName()\r\n }}</a>\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.original-asset-size' | translate\">\r\n {{ asset.fileSize | filesize }}\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.dimensions' | translate\">\r\n {{ asset.width }} x {{ asset.height }}\r\n </vdr-labeled-data>\r\n\r\n <vdr-labeled-data [label]=\"'asset.focal-point' | translate\">\r\n <span *ngIf=\"fpx\"\r\n ><clr-icon shape=\"crosshairs\"></clr-icon> x: {{ fpx | number: '1.2-2' }}, y:\r\n {{ fpy | number: '1.2-2' }}</span\r\n >\r\n <span *ngIf=\"!fpx\">{{ 'common.not-set' | translate }}</span>\r\n <br />\r\n <button\r\n class=\"btn btn-secondary-outline btn-sm\"\r\n [disabled]=\"settingFocalPoint\"\r\n (click)=\"setFocalPointStart()\"\r\n >\r\n <ng-container *ngIf=\"!fpx\">{{ 'asset.set-focal-point' | translate }}</ng-container>\r\n <ng-container *ngIf=\"fpx\">{{ 'asset.update-focal-point' | translate }}</ng-container>\r\n </button>\r\n <button\r\n class=\"btn btn-warning-outline btn-sm\"\r\n [disabled]=\"settingFocalPoint\"\r\n *ngIf=\"!!fpx\"\r\n (click)=\"removeFocalPoint()\"\r\n >\r\n {{ 'asset.unset-focal-point' | translate }}\r\n </button>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'common.tags' | translate\">\r\n <ng-container *ngIf=\"editable\">\r\n <vdr-tag-selector formControlName=\"tags\"></vdr-tag-selector>\r\n <button class=\"btn btn-link btn-sm\" (click)=\"manageTags()\">\r\n <clr-icon shape=\"tags\"></clr-icon>\r\n {{ 'common.manage-tags' | translate }}\r\n </button>\r\n </ng-container>\r\n <div *ngIf=\"!editable\">\r\n <vdr-chip *ngFor=\"let tag of asset.tags\" [colorFrom]=\"tag.value\">\r\n <clr-icon shape=\"tag\" class=\"mr2\"></clr-icon>\r\n {{ tag.value }}</vdr-chip\r\n >\r\n </div>\r\n </vdr-labeled-data>\r\n </form>\r\n <section *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Asset\"\r\n [compact]=\"true\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"customFieldsForm\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateAsset'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <div class=\"flex-spacer\"></div>\r\n <div class=\"preview-select\">\r\n <clr-select-container>\r\n <label>{{ 'asset.preview' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"size\" [disabled]=\"settingFocalPoint\">\r\n <option value=\"tiny\">tiny</option>\r\n <option value=\"thumb\">thumb</option>\r\n <option value=\"small\">small</option>\r\n <option value=\"medium\">medium</option>\r\n <option value=\"large\">large</option>\r\n <option value=\"\">full size</option>\r\n </select>\r\n </clr-select-container>\r\n <div class=\"asset-detail\">{{ width }} x {{ height }}</div>\r\n </div>\r\n <a\r\n *ngIf=\"!editable\"\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['/catalog', 'assets', asset.id]\"\r\n (click)=\"editClick.emit()\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </a>\r\n</div>\r\n",
8865
9730
  changeDetection: ChangeDetectionStrategy.OnPush,
8866
9731
  styles: [":host{display:flex;height:100%}.preview-image{width:100%;height:100%;min-height:60vh;overflow:auto;text-align:center;box-shadow:inset 0 0 5px #0000001a;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACuoAAArqAVDM774AAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAK0lEQVQ4T2P4jwP8xgFGNSADqDwGIF0DlMYAUH0YYFQDMoDKYwASNfz/DwB/JvcficphowAAAABJRU5ErkJggg==);flex:1}.preview-image.centered{display:flex;align-items:center;justify-content:center}.preview-image vdr-focal-point-control{position:relative;box-shadow:0 0 10px -3px #00000026}.preview-image .image-wrapper{position:relative}.preview-image .asset-image{width:100%}.preview-image .focal-point-info{position:absolute;display:flex;right:0}.controls{display:flex;flex-direction:column;margin-left:12px;min-width:15vw;max-width:25vw;transition:opacity .3s}.controls.fade{opacity:.5}.controls .name-input{margin-bottom:24px}.controls ::ng-deep .clr-control-container{width:100%}.controls ::ng-deep .clr-control-container .clr-input{width:100%}.controls .elide{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:block}.controls .source-link{direction:rtl}.controls .preview-select{display:flex;align-items:center;margin-bottom:12px}.controls .preview-select clr-select-container{margin-right:12px}\n"]
8867
9732
  },] }
@@ -9153,12 +10018,23 @@ ChannelBadgeComponent.propDecorators = {
9153
10018
  };
9154
10019
 
9155
10020
  /**
10021
+ * @description
9156
10022
  * A chip component for displaying a label with an optional action icon.
10023
+ *
10024
+ * @example
10025
+ * ```HTML
10026
+ * <vdr-chip [colorFrom]="item.value"
10027
+ * icon="close"
10028
+ * (iconClick)="clear(item)">
10029
+ * {{ item.value }}</vdr-chip>
10030
+ * ```
10031
+ * @docsCategory components
9157
10032
  */
9158
10033
  class ChipComponent {
9159
10034
  constructor() {
9160
10035
  this.invert = false;
9161
10036
  /**
10037
+ * @description
9162
10038
  * If set, the chip will have an auto-generated background
9163
10039
  * color based on the string value passed in.
9164
10040
  */
@@ -9412,8 +10288,19 @@ ConfigurableInputComponent.propDecorators = {
9412
10288
  };
9413
10289
 
9414
10290
  /**
10291
+ * @description
9415
10292
  * A form input control which displays currency in decimal format, whilst working
9416
10293
  * with the integer cent value in the background.
10294
+ *
10295
+ * @example
10296
+ * ```HTML
10297
+ * <vdr-currency-input
10298
+ * [(ngModel)]="entityPrice"
10299
+ * [currencyCode]="currencyCode"
10300
+ * ></vdr-currency-input>
10301
+ * ```
10302
+ *
10303
+ * @docsCategory components
9417
10304
  */
9418
10305
  class CurrencyInputComponent {
9419
10306
  constructor(dataService, changeDetectorRef) {
@@ -9540,6 +10427,90 @@ CurrencyInputComponent.propDecorators = {
9540
10427
  valueChange: [{ type: Output }]
9541
10428
  };
9542
10429
 
10430
+ /**
10431
+ * @description
10432
+ * Registers a {@link CustomDetailComponent} to be placed in a given location. This allows you
10433
+ * to embed any type of custom Angular component in the entity detail pages of the Admin UI.
10434
+ *
10435
+ * @docsCategory custom-detail-components
10436
+ */
10437
+ function registerCustomDetailComponent(config) {
10438
+ return {
10439
+ provide: APP_INITIALIZER,
10440
+ multi: true,
10441
+ useFactory: (customDetailComponentService) => () => {
10442
+ customDetailComponentService.registerCustomDetailComponent(config);
10443
+ },
10444
+ deps: [CustomDetailComponentService],
10445
+ };
10446
+ }
10447
+ class CustomDetailComponentService {
10448
+ constructor() {
10449
+ this.customDetailComponents = new Map();
10450
+ }
10451
+ registerCustomDetailComponent(config) {
10452
+ var _a;
10453
+ if (this.customDetailComponents.has(config.locationId)) {
10454
+ (_a = this.customDetailComponents.get(config.locationId)) === null || _a === void 0 ? void 0 : _a.push(config);
10455
+ }
10456
+ else {
10457
+ this.customDetailComponents.set(config.locationId, [config]);
10458
+ }
10459
+ }
10460
+ getCustomDetailComponentsFor(locationId) {
10461
+ var _a;
10462
+ return (_a = this.customDetailComponents.get(locationId)) !== null && _a !== void 0 ? _a : [];
10463
+ }
10464
+ }
10465
+ CustomDetailComponentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CustomDetailComponentService_Factory() { return new CustomDetailComponentService(); }, token: CustomDetailComponentService, providedIn: "root" });
10466
+ CustomDetailComponentService.decorators = [
10467
+ { type: Injectable, args: [{
10468
+ providedIn: 'root',
10469
+ },] }
10470
+ ];
10471
+
10472
+ class CustomDetailComponentHostComponent {
10473
+ constructor(viewContainerRef, componentFactoryResolver, customDetailComponentService) {
10474
+ this.viewContainerRef = viewContainerRef;
10475
+ this.componentFactoryResolver = componentFactoryResolver;
10476
+ this.customDetailComponentService = customDetailComponentService;
10477
+ this.componentRefs = [];
10478
+ }
10479
+ ngOnInit() {
10480
+ const customComponents = this.customDetailComponentService.getCustomDetailComponentsFor(this.locationId);
10481
+ for (const config of customComponents) {
10482
+ const factory = this.componentFactoryResolver.resolveComponentFactory(config.component);
10483
+ const componentRef = this.viewContainerRef.createComponent(factory);
10484
+ componentRef.instance.entity$ = this.entity$;
10485
+ componentRef.instance.detailForm = this.detailForm;
10486
+ this.componentRefs.push(componentRef);
10487
+ }
10488
+ }
10489
+ ngOnDestroy() {
10490
+ for (const ref of this.componentRefs) {
10491
+ ref.destroy();
10492
+ }
10493
+ }
10494
+ }
10495
+ CustomDetailComponentHostComponent.decorators = [
10496
+ { type: Component, args: [{
10497
+ selector: 'vdr-custom-detail-component-host',
10498
+ template: "<vdr-ui-extension-point [locationId]=\"locationId\" api=\"detailComponent\"></vdr-ui-extension-point>\r\n",
10499
+ changeDetection: ChangeDetectionStrategy.OnPush,
10500
+ styles: [""]
10501
+ },] }
10502
+ ];
10503
+ CustomDetailComponentHostComponent.ctorParameters = () => [
10504
+ { type: ViewContainerRef },
10505
+ { type: ComponentFactoryResolver },
10506
+ { type: CustomDetailComponentService }
10507
+ ];
10508
+ CustomDetailComponentHostComponent.propDecorators = {
10509
+ locationId: [{ type: Input }],
10510
+ entity$: [{ type: Input }],
10511
+ detailForm: [{ type: Input }]
10512
+ };
10513
+
9543
10514
  /**
9544
10515
  * This component renders the appropriate type of form input control based
9545
10516
  * on the "type" property of the provided CustomFieldConfig.
@@ -9627,6 +10598,65 @@ DataTableColumnComponent.propDecorators = {
9627
10598
  template: [{ type: ViewChild, args: [TemplateRef, { static: true },] }]
9628
10599
  };
9629
10600
 
10601
+ /**
10602
+ * @description
10603
+ * A table for displaying PaginatedList results. It is designed to be used inside components which
10604
+ * extend the {@link BaseListComponent} class.
10605
+ *
10606
+ * @example
10607
+ * ```HTML
10608
+ * <vdr-data-table
10609
+ * [items]="items$ | async"
10610
+ * [itemsPerPage]="itemsPerPage$ | async"
10611
+ * [totalItems]="totalItems$ | async"
10612
+ * [currentPage]="currentPage$ | async"
10613
+ * (pageChange)="setPageNumber($event)"
10614
+ * (itemsPerPageChange)="setItemsPerPage($event)"
10615
+ * >
10616
+ * <!-- The header columns are defined first -->
10617
+ * <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>
10618
+ * <vdr-dt-column></vdr-dt-column>
10619
+ * <vdr-dt-column></vdr-dt-column>
10620
+ *
10621
+ * <!-- Then we define how a row is rendered -->
10622
+ * <ng-template let-taxRate="item">
10623
+ * <td class="left align-middle">{{ taxRate.name }}</td>
10624
+ * <td class="left align-middle">{{ taxRate.category.name }}</td>
10625
+ * <td class="left align-middle">{{ taxRate.zone.name }}</td>
10626
+ * <td class="left align-middle">{{ taxRate.value }}%</td>
10627
+ * <td class="right align-middle">
10628
+ * <vdr-table-row-action
10629
+ * iconShape="edit"
10630
+ * [label]="'common.edit' | translate"
10631
+ * [linkTo]="['./', taxRate.id]"
10632
+ * ></vdr-table-row-action>
10633
+ * </td>
10634
+ * <td class="right align-middle">
10635
+ * <vdr-dropdown>
10636
+ * <button type="button" class="btn btn-link btn-sm" vdrDropdownTrigger>
10637
+ * {{ 'common.actions' | translate }}
10638
+ * <clr-icon shape="caret down"></clr-icon>
10639
+ * </button>
10640
+ * <vdr-dropdown-menu vdrPosition="bottom-right">
10641
+ * <button
10642
+ * type="button"
10643
+ * class="delete-button"
10644
+ * (click)="deleteTaxRate(taxRate)"
10645
+ * [disabled]="!(['DeleteSettings', 'DeleteTaxRate'] | hasPermission)"
10646
+ * vdrDropdownItem
10647
+ * >
10648
+ * <clr-icon shape="trash" class="is-danger"></clr-icon>
10649
+ * {{ 'common.delete' | translate }}
10650
+ * </button>
10651
+ * </vdr-dropdown-menu>
10652
+ * </vdr-dropdown>
10653
+ * </td>
10654
+ * </ng-template>
10655
+ * </vdr-data-table>
10656
+ * ```
10657
+ *
10658
+ * @docsCategory components
10659
+ */
9630
10660
  class DataTableComponent {
9631
10661
  constructor() {
9632
10662
  this.allSelectChange = new EventEmitter();
@@ -9884,27 +10914,43 @@ DatetimePickerService.decorators = [
9884
10914
  ];
9885
10915
  DatetimePickerService.ctorParameters = () => [];
9886
10916
 
10917
+ /**
10918
+ * @description
10919
+ * A form input for selecting datetime values.
10920
+ *
10921
+ * @example
10922
+ * ```HTML
10923
+ * <vdr-datetime-picker [(ngModel)]="startDate"></vdr-datetime-picker>
10924
+ * ```
10925
+ *
10926
+ * @docsCategory components
10927
+ */
9887
10928
  class DatetimePickerComponent {
9888
10929
  constructor(changeDetectorRef, datetimePickerService) {
9889
10930
  this.changeDetectorRef = changeDetectorRef;
9890
10931
  this.datetimePickerService = datetimePickerService;
9891
10932
  /**
10933
+ * @description
9892
10934
  * The day that the week should start with in the calendar view.
9893
10935
  */
9894
10936
  this.weekStartDay = 'mon';
9895
10937
  /**
10938
+ * @description
9896
10939
  * The granularity of the minutes time picker
9897
10940
  */
9898
10941
  this.timeGranularityInterval = 5;
9899
10942
  /**
10943
+ * @description
9900
10944
  * The minimum date as an ISO string
9901
10945
  */
9902
10946
  this.min = null;
9903
10947
  /**
10948
+ * @description
9904
10949
  * The maximum date as an ISO string
9905
10950
  */
9906
10951
  this.max = null;
9907
10952
  /**
10953
+ * @description
9908
10954
  * Sets the readonly state
9909
10955
  */
9910
10956
  this.readonly = false;
@@ -10068,6 +11114,31 @@ DatetimePickerComponent.propDecorators = {
10068
11114
  calendarTable: [{ type: ViewChild, args: ['calendarTable',] }]
10069
11115
  };
10070
11116
 
11117
+ /**
11118
+ * @description
11119
+ * Used for building dropdown menus.
11120
+ *
11121
+ * @example
11122
+ * ```HTML
11123
+ * <vdr-dropdown>
11124
+ * <button class="btn btn-outline" vdrDropdownTrigger>
11125
+ * <clr-icon shape="plus"></clr-icon>
11126
+ * Select type
11127
+ * </button>
11128
+ * <vdr-dropdown-menu vdrPosition="bottom-left">
11129
+ * <button
11130
+ * *ngFor="let typeName of allTypes"
11131
+ * type="button"
11132
+ * vdrDropdownItem
11133
+ * (click)="selectType(typeName)"
11134
+ * >
11135
+ * typeName
11136
+ * </button>
11137
+ * </vdr-dropdown-menu>
11138
+ * </vdr-dropdown>
11139
+ * ```
11140
+ * @docsCategory components
11141
+ */
10071
11142
  class DropdownComponent {
10072
11143
  constructor() {
10073
11144
  this.isOpen = false;
@@ -10341,6 +11412,19 @@ class ExtensionHostService {
10341
11412
  this.destroyMessage$.next();
10342
11413
  break;
10343
11414
  }
11415
+ case 'active-route': {
11416
+ const routeData = {
11417
+ url: window.location.href,
11418
+ origin: window.location.origin,
11419
+ pathname: window.location.pathname,
11420
+ params: this.routeSnapshot.params,
11421
+ queryParams: this.routeSnapshot.queryParams,
11422
+ fragment: this.routeSnapshot.fragment,
11423
+ };
11424
+ this.sendMessage({ data: routeData, error: false, complete: false, requestId: data.requestId }, origin);
11425
+ this.sendMessage({ data: null, error: false, complete: true, requestId: data.requestId }, origin);
11426
+ break;
11427
+ }
10344
11428
  case 'graphql-query': {
10345
11429
  const { document, variables, fetchPolicy } = data.data;
10346
11430
  this.dataService
@@ -10367,8 +11451,9 @@ class ExtensionHostService {
10367
11451
  }
10368
11452
  };
10369
11453
  }
10370
- init(extensionWindow) {
11454
+ init(extensionWindow, routeSnapshot) {
10371
11455
  this.extensionWindow = extensionWindow;
11456
+ this.routeSnapshot = routeSnapshot;
10372
11457
  window.addEventListener('message', this.handleMessage);
10373
11458
  }
10374
11459
  destroy() {
@@ -10425,7 +11510,7 @@ class ExtensionHostComponent {
10425
11510
  if (this.openInIframe) {
10426
11511
  const extensionWindow = this.extensionFrame.nativeElement.contentWindow;
10427
11512
  if (extensionWindow) {
10428
- this.extensionHostService.init(extensionWindow);
11513
+ this.extensionHostService.init(extensionWindow, this.route.snapshot);
10429
11514
  }
10430
11515
  }
10431
11516
  }
@@ -10439,7 +11524,7 @@ class ExtensionHostComponent {
10439
11524
  if (!extensionWindow) {
10440
11525
  return;
10441
11526
  }
10442
- this.extensionHostService.init(extensionWindow);
11527
+ this.extensionHostService.init(extensionWindow, this.route.snapshot);
10443
11528
  this.extensionWindowIsOpen = true;
10444
11529
  this.extensionWindow = extensionWindow;
10445
11530
  let timer;
@@ -10505,6 +11590,28 @@ function flattenFacetValues(facetsWithValues) {
10505
11590
  return facetsWithValues.reduce((flattened, facet) => flattened.concat(facet.values), []);
10506
11591
  }
10507
11592
 
11593
+ /**
11594
+ * @description
11595
+ * A form control for selecting facet values.
11596
+ *
11597
+ * @example
11598
+ * ```HTML
11599
+ * <vdr-facet-value-selector
11600
+ * [facets]="facets"
11601
+ * (selectedValuesChange)="selectedValues = $event"
11602
+ * ></vdr-facet-value-selector>
11603
+ * ```
11604
+ * The `facets` input should be provided from the parent component
11605
+ * like this:
11606
+ *
11607
+ * @example
11608
+ * ```TypeScript
11609
+ * this.facets = this.dataService
11610
+ * .facet.getAllFacets()
11611
+ * .mapSingle(data => data.facets.items);
11612
+ * ```
11613
+ * @docsCategory components
11614
+ */
10508
11615
  class FacetValueSelectorComponent {
10509
11616
  constructor(dataService) {
10510
11617
  this.dataService = dataService;
@@ -10948,7 +12055,15 @@ DialogTitleDirective.ctorParameters = () => [
10948
12055
  ];
10949
12056
 
10950
12057
  /**
12058
+ * @description
10951
12059
  * This component displays a plain JavaScript object as an expandable tree.
12060
+ *
12061
+ * @example
12062
+ * ```HTML
12063
+ * <vdr-object-tree [value]="payment.metadata"></vdr-object-tree>
12064
+ * ```
12065
+ *
12066
+ * @docsCategory components
10952
12067
  */
10953
12068
  class ObjectTreeComponent {
10954
12069
  constructor(parent) {
@@ -10991,6 +12106,16 @@ ObjectTreeComponent.propDecorators = {
10991
12106
  isArrayItem: [{ type: Input }]
10992
12107
  };
10993
12108
 
12109
+ /**
12110
+ * @description
12111
+ * Displays the state of an order in a colored chip.
12112
+ *
12113
+ * @example
12114
+ * ```HTML
12115
+ * <vdr-order-state-label [state]="order.state"></vdr-order-state-label>
12116
+ * ```
12117
+ * @docsCategory components
12118
+ */
10994
12119
  class OrderStateLabelComponent {
10995
12120
  get chipColorType() {
10996
12121
  switch (this.state) {
@@ -11044,6 +12169,18 @@ PaginationControlsComponent.propDecorators = {
11044
12169
  pageChange: [{ type: Output }]
11045
12170
  };
11046
12171
 
12172
+ /**
12173
+ * @description
12174
+ * A component for selecting product variants via an autocomplete-style select input.
12175
+ *
12176
+ * @example
12177
+ * ```HTML
12178
+ * <vdr-product-selector
12179
+ * (productSelected)="selectResult($event)"></vdr-product-selector>
12180
+ * ```
12181
+ *
12182
+ * @docsCategory components
12183
+ */
11047
12184
  class ProductSelectorComponent {
11048
12185
  constructor(dataService) {
11049
12186
  this.dataService = dataService;
@@ -11764,7 +12901,18 @@ ProsemirrorService.ctorParameters = () => [
11764
12901
  ];
11765
12902
 
11766
12903
  /**
11767
- * A rich text (HTML) editor based on Trix (https://github.com/basecamp/trix)
12904
+ * @description
12905
+ * A rich text (HTML) editor based on Prosemirror (https://prosemirror.net/)
12906
+ *
12907
+ * @example
12908
+ * ```HTML
12909
+ * <vdr-rich-text-editor
12910
+ * [(ngModel)]="description"
12911
+ * label="Description"
12912
+ * ></vdr-rich-text-editor>
12913
+ * ```
12914
+ *
12915
+ * @docsCategory components
11768
12916
  */
11769
12917
  class RichTextEditorComponent {
11770
12918
  constructor(changeDetector, prosemirrorService) {
@@ -11821,7 +12969,7 @@ RichTextEditorComponent.decorators = [
11821
12969
  },
11822
12970
  ProsemirrorService,
11823
12971
  ],
11824
- styles: ["@charset \"UTF-8\";::ng-deep .ProseMirror{position:relative}::ng-deep .ProseMirror{word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-feature-settings:none;font-variant-ligatures:none}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid var(--color-primary-500)}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{content:\"\";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid var(--color-primary-500);pointer-events:none}::ng-deep .ProseMirror-textblock-dropdown{min-width:3em}::ng-deep .ProseMirror-menu{margin:0 -4px;line-height:1}::ng-deep .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;white-space:pre}::ng-deep .ProseMirror-menuitem{margin-right:3px;display:inline-block}::ng-deep .ProseMirror-menuseparator{border-right:1px solid var(--color-component-border-200);margin-right:3px}::ng-deep .ProseMirror-menu-dropdown,::ng-deep .ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}::ng-deep .ProseMirror-menu-dropdown{vertical-align:1px;cursor:pointer;position:relative;padding-right:15px}::ng-deep .ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 4px;display:inline-block;position:relative}::ng-deep .ProseMirror-menu-dropdown:after{content:\"\";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}::ng-deep .ProseMirror-menu-dropdown-menu,::ng-deep .ProseMirror-menu-submenu{position:absolute;background:white;color:var(--color-grey-600);border:1px solid var(--color-component-border-200);padding:2px}::ng-deep .ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em}::ng-deep .ProseMirror-menu-dropdown-item{cursor:pointer;padding:2px 8px 2px 4px}::ng-deep .ProseMirror-menu-dropdown-item:hover{background:var(--color-component-bg-100)}::ng-deep .ProseMirror-menu-submenu-wrap{position:relative;margin-right:-4px}::ng-deep .ProseMirror-menu-submenu-label:after{content:\"\";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}::ng-deep .ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:-3px}::ng-deep .ProseMirror-menu-active{background:var(--color-component-bg-100);border-radius:4px}::ng-deep .ProseMirror-menu-disabled{opacity:.3}::ng-deep .ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,::ng-deep .ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}::ng-deep .ProseMirror-menubar{border-top-left-radius:inherit;border-top-right-radius:inherit;position:relative;min-height:1em;color:var(--color-grey-600);padding:1px 6px;top:0;left:0;right:0;background:var(--color-component-bg-100);z-index:10;box-sizing:border-box;overflow:visible}::ng-deep .ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:2px 8px;cursor:pointer}::ng-deep .ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}::ng-deep .ProseMirror-icon svg{fill:currentColor;height:1em}::ng-deep .ProseMirror-icon span{vertical-align:text-top}::ng-deep .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}::ng-deep .ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px;list-style-position:initial}::ng-deep .ProseMirror blockquote{padding-left:1em;border-left:3px solid var(--color-grey-100);margin-left:0;margin-right:0}::ng-deep .ProseMirror-prompt{background:white;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;z-index:11;box-shadow:-.5px 2px 5px #0003}::ng-deep .ProseMirror-prompt h5{margin:0;font-weight:normal;font-size:100%;color:var(--color-grey-500)}::ng-deep .ProseMirror-prompt input[type=text],::ng-deep .ProseMirror-prompt textarea{background:var(--color-component-bg-100);border:none;outline:none}::ng-deep .ProseMirror-prompt input[type=text]{padding:0 4px}::ng-deep .ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:var(--color-grey-400);border:none;background:transparent;padding:0}::ng-deep .ProseMirror-prompt-close:after{content:\"\\e2\\153\\2022\";font-size:12px}::ng-deep .ProseMirror-invalid{background:var(--color-warning-200);border:1px solid var(--color-warning-300);border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}::ng-deep .ProseMirror-prompt-buttons{margin-top:5px;display:none}::ng-deep #editor,::ng-deep .editor{background:var(--color-form-input-bg);color:#000;background-clip:padding-box;border-radius:4px;border:2px solid rgba(0,0,0,.2);padding:5px 0;margin-bottom:23px}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror{padding:4px 8px 4px 14px;line-height:1.2;outline:none}::ng-deep .ProseMirror p{margin-bottom:.5rem;color:var(--color-grey-800)}:host{display:block;max-width:710px;margin-bottom:.5rem}:host.readonly ::ng-deep .ProseMirror-menubar{display:none}::ng-deep .ProseMirror-menubar{position:sticky;top:24px;margin-top:6px;border:1px solid var(--color-component-border-200);border-bottom:none;background-color:var(--color-component-bg-200);color:var(--color-icon-button);padding:6px 12px}::ng-deep .vdr-prosemirror{background:var(--color-form-input-bg);min-height:128px;border:1px solid var(--color-component-border-200);border-radius:0 0 3px 3px;transition:border-color .2s;overflow:auto}::ng-deep .vdr-prosemirror:focus{border-color:var(--color-primary-500)!important;box-shadow:0 0 1px 1px var(--color-primary-100)}::ng-deep .vdr-prosemirror hr{padding:2px 10px;border:none;margin:1em 0}::ng-deep .vdr-prosemirror hr:after{content:\"\";display:block;height:1px;background-color:silver;line-height:2px}::ng-deep .vdr-prosemirror img{cursor:default;max-width:100%}\n"]
12972
+ styles: ["@charset \"UTF-8\";::ng-deep .ProseMirror{position:relative}::ng-deep .ProseMirror{word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-feature-settings:none;font-variant-ligatures:none}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid var(--color-primary-500)}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{content:\"\";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid var(--color-primary-500);pointer-events:none}::ng-deep .ProseMirror-textblock-dropdown{min-width:3em}::ng-deep .ProseMirror-menu{margin:0 -4px;line-height:1}::ng-deep .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;white-space:pre}::ng-deep .ProseMirror-menuitem{margin-right:3px;display:inline-block}::ng-deep .ProseMirror-menuseparator{border-right:1px solid var(--color-component-border-200);margin-right:3px}::ng-deep .ProseMirror-menu-dropdown,::ng-deep .ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}::ng-deep .ProseMirror-menu-dropdown{vertical-align:1px;cursor:pointer;position:relative;padding-right:15px}::ng-deep .ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 4px;display:inline-block;position:relative}::ng-deep .ProseMirror-menu-dropdown:after{content:\"\";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}::ng-deep .ProseMirror-menu-dropdown-menu,::ng-deep .ProseMirror-menu-submenu{position:absolute;background:white;color:var(--color-grey-600);border:1px solid var(--color-component-border-200);padding:2px}::ng-deep .ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em}::ng-deep .ProseMirror-menu-dropdown-item{cursor:pointer;padding:2px 8px 2px 4px}::ng-deep .ProseMirror-menu-dropdown-item:hover{background:var(--color-component-bg-100)}::ng-deep .ProseMirror-menu-submenu-wrap{position:relative;margin-right:-4px}::ng-deep .ProseMirror-menu-submenu-label:after{content:\"\";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}::ng-deep .ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:-3px}::ng-deep .ProseMirror-menu-active{background:var(--color-component-bg-100);border-radius:4px}::ng-deep .ProseMirror-menu-disabled{opacity:.3}::ng-deep .ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,::ng-deep .ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}::ng-deep .ProseMirror-menubar{border-top-left-radius:inherit;border-top-right-radius:inherit;position:relative;min-height:1em;color:var(--color-grey-600);padding:1px 6px;top:0;left:0;right:0;background:var(--color-component-bg-100);z-index:10;box-sizing:border-box;overflow:visible}::ng-deep .ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:2px 8px;cursor:pointer}::ng-deep .ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}::ng-deep .ProseMirror-icon svg{fill:currentColor;height:1em}::ng-deep .ProseMirror-icon span{vertical-align:text-top}::ng-deep .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}::ng-deep .ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px;list-style-position:initial}::ng-deep .ProseMirror blockquote{padding-left:1em;border-left:3px solid var(--color-grey-100);margin-left:0;margin-right:0}::ng-deep .ProseMirror-prompt{background:white;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;z-index:11;box-shadow:-.5px 2px 5px #0003}::ng-deep .ProseMirror-prompt h5{margin:0;font-weight:normal;font-size:100%;color:var(--color-grey-500)}::ng-deep .ProseMirror-prompt input[type=text],::ng-deep .ProseMirror-prompt textarea{background:var(--color-component-bg-100);border:none;outline:none}::ng-deep .ProseMirror-prompt input[type=text]{padding:0 4px}::ng-deep .ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:var(--color-grey-400);border:none;background:transparent;padding:0}::ng-deep .ProseMirror-prompt-close:after{content:\"\\e2\\153\\2022\";font-size:12px}::ng-deep .ProseMirror-invalid{background:var(--color-warning-200);border:1px solid var(--color-warning-300);border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}::ng-deep .ProseMirror-prompt-buttons{margin-top:5px;display:none}::ng-deep #editor,::ng-deep .editor{background:var(--color-form-input-bg);color:#000;background-clip:padding-box;border-radius:4px;border:2px solid rgba(0,0,0,.2);padding:5px 0;margin-bottom:23px}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror{padding:4px 8px 4px 14px;line-height:1.2;outline:none}::ng-deep .ProseMirror p{margin-bottom:.5rem;color:var(--color-grey-800)!important}:host{display:block;max-width:710px;margin-bottom:.5rem}:host.readonly ::ng-deep .ProseMirror-menubar{display:none}::ng-deep .ProseMirror-menubar{position:sticky;top:24px;margin-top:6px;border:1px solid var(--color-component-border-200);border-bottom:none;background-color:var(--color-component-bg-200);color:var(--color-icon-button);padding:6px 12px;display:flex;flex-wrap:wrap}::ng-deep .vdr-prosemirror{background:var(--color-form-input-bg);min-height:128px;min-width:200px;border:1px solid var(--color-component-border-200);border-radius:0 0 3px 3px;transition:border-color .2s;overflow:auto;text-align:initial}::ng-deep .vdr-prosemirror:focus{border-color:var(--color-primary-500)!important;box-shadow:0 0 1px 1px var(--color-primary-100)}::ng-deep .vdr-prosemirror hr{padding:2px 10px;border:none;margin:1em 0}::ng-deep .vdr-prosemirror hr:after{content:\"\";display:block;height:1px;background-color:silver;line-height:2px}::ng-deep .vdr-prosemirror img{cursor:default;max-width:100%}\n"]
11825
12973
  },] }
11826
12974
  ];
11827
12975
  RichTextEditorComponent.ctorParameters = () => [
@@ -11879,6 +13027,53 @@ StatusBadgeComponent.propDecorators = {
11879
13027
  type: [{ type: Input }]
11880
13028
  };
11881
13029
 
13030
+ class TabbedCustomFieldsComponent {
13031
+ constructor() {
13032
+ this.readonly = false;
13033
+ this.compact = false;
13034
+ this.showLabel = true;
13035
+ this.defaultTabName = '__default_tab__';
13036
+ }
13037
+ ngOnInit() {
13038
+ this.tabbedCustomFields = this.groupByTabs(this.customFields);
13039
+ }
13040
+ customFieldIsSet(name) {
13041
+ return !!this.customFieldsFormGroup.get(name);
13042
+ }
13043
+ groupByTabs(customFieldConfigs) {
13044
+ var _a, _b, _c;
13045
+ const tabMap = new Map();
13046
+ for (const field of customFieldConfigs) {
13047
+ const tabName = (_b = (_a = field.ui) === null || _a === void 0 ? void 0 : _a.tab) !== null && _b !== void 0 ? _b : this.defaultTabName;
13048
+ if (tabMap.has(tabName)) {
13049
+ (_c = tabMap.get(tabName)) === null || _c === void 0 ? void 0 : _c.push(field);
13050
+ }
13051
+ else {
13052
+ tabMap.set(tabName, [field]);
13053
+ }
13054
+ }
13055
+ return Array.from(tabMap.entries())
13056
+ .sort((a, b) => (a[0] === this.defaultTabName ? -1 : 1))
13057
+ .map(([tabName, customFields]) => ({ tabName, customFields }));
13058
+ }
13059
+ }
13060
+ TabbedCustomFieldsComponent.decorators = [
13061
+ { type: Component, args: [{
13062
+ selector: 'vdr-tabbed-custom-fields',
13063
+ template: "<ng-container *ngIf=\"1 < tabbedCustomFields.length; else singleGroup\">\r\n <clr-tabs>\r\n <clr-tab *ngFor=\"let group of tabbedCustomFields\">\r\n <button clrTabLink>\r\n {{\r\n group.tabName === defaultTabName\r\n ? ('common.general' | translate)\r\n : (group.tabName | translate)\r\n }}\r\n </button>\r\n <clr-tab-content *clrIfActive>\r\n <div class=\"mt4\">\r\n <ng-container *ngFor=\"let customField of group.customFields\">\r\n <vdr-custom-field-control\r\n *ngIf=\"customFieldIsSet(customField.name)\"\r\n [entityName]=\"entityName\"\r\n [customFieldsFormGroup]=\"customFieldsFormGroup\"\r\n [customField]=\"customField\"\r\n [readonly]=\"readonly\"\r\n [compact]=\"compact\"\r\n [showLabel]=\"showLabel\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </div>\r\n </clr-tab-content>\r\n </clr-tab>\r\n </clr-tabs>\r\n</ng-container>\r\n<ng-template #singleGroup>\r\n <ng-container *ngFor=\"let customField of tabbedCustomFields[0]?.customFields\">\r\n <vdr-custom-field-control\r\n *ngIf=\"customFieldIsSet(customField.name)\"\r\n [entityName]=\"entityName\"\r\n [customFieldsFormGroup]=\"customFieldsFormGroup\"\r\n [customField]=\"customField\"\r\n [readonly]=\"readonly\"\r\n [compact]=\"compact\"\r\n [showLabel]=\"showLabel\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n</ng-template>\r\n",
13064
+ changeDetection: ChangeDetectionStrategy.OnPush,
13065
+ styles: [""]
13066
+ },] }
13067
+ ];
13068
+ TabbedCustomFieldsComponent.propDecorators = {
13069
+ entityName: [{ type: Input }],
13070
+ customFields: [{ type: Input }],
13071
+ customFieldsFormGroup: [{ type: Input }],
13072
+ readonly: [{ type: Input }],
13073
+ compact: [{ type: Input }],
13074
+ showLabel: [{ type: Input }]
13075
+ };
13076
+
11882
13077
  /**
11883
13078
  * A button link to be used as actions in rows of a table.
11884
13079
  */
@@ -12001,13 +13196,42 @@ TitleInputComponent.decorators = [
12001
13196
  selector: 'vdr-title-input',
12002
13197
  template: "<ng-content></ng-content>\r\n<div class=\"edit-icon\" *ngIf=\"!readonly\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n</div>\r\n",
12003
13198
  changeDetection: ChangeDetectionStrategy.OnPush,
12004
- styles: [":host{display:block;position:relative}:host ::ng-deep input{font-size:18px;color:var(--clr-p1-color);max-width:100%}:host ::ng-deep input:not(:focus){border-color:transparent!important;background-color:transparent!important}:host ::ng-deep input:focus{background-color:var(--clr-global-app-background)}:host ::ng-deep .clr-control-container{max-width:100%}:host ::ng-deep .clr-input-wrapper{max-width:100%!important}:host .edit-icon{position:absolute;right:8px;top:6px;color:var(--color-grey-300);opacity:0;transition:opacity .2s}:host:hover ::ng-deep input:not(:focus){background-color:var(--color-component-bg-200)!important}:host:hover .edit-icon{opacity:1}:host.readonly .edit-icon{display:none}:host.readonly:hover ::ng-deep input:not(:focus){background-color:var(--color-grey-200)!important}\n"]
13199
+ styles: [":host{display:block;position:relative}:host ::ng-deep input{font-size:18px;color:var(--clr-p1-color);max-width:100%}:host ::ng-deep input:not(:focus){border-color:transparent!important;background-color:var(--color-component-bg-100)!important}:host ::ng-deep input:focus{background-color:var(--clr-global-app-background)}:host ::ng-deep .clr-control-container{max-width:100%}:host ::ng-deep .clr-input-wrapper{max-width:100%!important}:host .edit-icon{position:absolute;right:8px;top:6px;color:var(--color-grey-400);opacity:0;transition:opacity .2s}:host:hover ::ng-deep input:not(:focus){background-color:var(--color-component-bg-200)!important}:host:hover .edit-icon{opacity:1}:host.readonly .edit-icon{display:none}:host.readonly:hover ::ng-deep input:not(:focus){background-color:var(--color-grey-200)!important}\n"]
12005
13200
  },] }
12006
13201
  ];
12007
13202
  TitleInputComponent.propDecorators = {
12008
13203
  readonly: [{ type: HostBinding, args: ['class.readonly',] }, { type: Input }]
12009
13204
  };
12010
13205
 
13206
+ class UiExtensionPointComponent {
13207
+ constructor(dataService) {
13208
+ this.dataService = dataService;
13209
+ this.isDevMode = isDevMode();
13210
+ }
13211
+ ngOnInit() {
13212
+ this.display$ = this.dataService.client
13213
+ .uiState()
13214
+ .mapStream(({ uiState }) => uiState.displayUiExtensionPoints);
13215
+ }
13216
+ }
13217
+ UiExtensionPointComponent.decorators = [
13218
+ { type: Component, args: [{
13219
+ selector: 'vdr-ui-extension-point',
13220
+ template: "<div [class.highlight]=\"isDevMode && (display$ | async)\" class=\"wrapper\">\r\n <vdr-dropdown *ngIf=\"isDevMode && (display$ | async)\">\r\n <button class=\"btn btn-icon btn-link extension-point-info-trigger\"\r\n [style.top.px]=\"topPx ?? 0\"\r\n [style.left.px]=\"leftPx ?? 0\"\r\n vdrDropdownTrigger>\r\n <clr-icon shape=\"plugin\" class=\"\" size=\"16\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <div class=\"extension-info\">\r\n <pre *ngIf=\"api === 'actionBar'\">\r\naddActionBarItem({{ '{' }}\r\n id: 'my-button',\r\n label: 'My Action',\r\n locationId: '{{ locationId }}',\r\n{{ '}' }})</pre>\r\n <pre *ngIf=\"api === 'navMenu'\">\r\naddNavMenuItem({{ '{' }}\r\n id: 'my-menu-item',\r\n label: 'My Menu Item',\r\n routerLink: ['/extensions/my-plugin'],\r\n {{ '}' }},\r\n '{{ locationId }}'\r\n)</pre>\r\n <pre *ngIf=\"api === 'detailComponent'\">\r\nregisterCustomDetailComponent({{ '{' }}\r\n locationId: '{{ locationId }}',\r\n component: MyCustomComponent,\r\n{{ '}' }})</pre>\r\n </div>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n <ng-content></ng-content>\r\n</div>\r\n",
13221
+ changeDetection: ChangeDetectionStrategy.OnPush,
13222
+ styles: [":host{position:relative;display:inline-block}.wrapper{display:inline-block;height:100%}.extension-point-info-trigger{position:absolute;margin:0;padding:0;z-index:100}.extension-point-info-trigger clr-icon{color:var(--color-success-500)}.extension-info{padding:12px}pre{padding:6px;font-family:\"Source Code Pro\",\"Lucida Console\",Monaco,monospace;background-color:var(--color-grey-200)}\n"]
13223
+ },] }
13224
+ ];
13225
+ UiExtensionPointComponent.ctorParameters = () => [
13226
+ { type: DataService }
13227
+ ];
13228
+ UiExtensionPointComponent.propDecorators = {
13229
+ locationId: [{ type: Input }],
13230
+ topPx: [{ type: Input }],
13231
+ leftPx: [{ type: Input }],
13232
+ api: [{ type: Input }]
13233
+ };
13234
+
12011
13235
  /**
12012
13236
  * Allows declarative binding to the "disabled" property of a reactive form
12013
13237
  * control.
@@ -12153,6 +13377,20 @@ IfDefaultChannelActiveDirective.propDecorators = {
12153
13377
  vdrIfMultichannelElse: [{ type: Input }]
12154
13378
  };
12155
13379
 
13380
+ /**
13381
+ * @description
13382
+ * Structural directive that displays the given element if the Vendure instance has multiple channels
13383
+ * configured.
13384
+ *
13385
+ * @example
13386
+ * ```html
13387
+ * <div *vdrIfMultichannel class="channel-selector">
13388
+ * <!-- ... -->
13389
+ * </ng-container>
13390
+ * ```
13391
+ *
13392
+ * @docsCategory directives
13393
+ */
12156
13394
  class IfMultichannelDirective extends IfDirectiveBase {
12157
13395
  constructor(_viewContainer, templateRef, dataService) {
12158
13396
  super(_viewContainer, templateRef, () => {
@@ -12184,6 +13422,7 @@ IfMultichannelDirective.propDecorators = {
12184
13422
  };
12185
13423
 
12186
13424
  /**
13425
+ * @description
12187
13426
  * Conditionally shows/hides templates based on the current active user having the specified permission.
12188
13427
  * Based on the ngIf source. Also support "else" templates:
12189
13428
  *
@@ -12195,6 +13434,8 @@ IfMultichannelDirective.propDecorators = {
12195
13434
  *
12196
13435
  * The permission can be a single string, or an array. If an array is passed, then _all_ of the permissions
12197
13436
  * must match (logical AND)
13437
+ *
13438
+ * @docsCategory directives
12198
13439
  */
12199
13440
  class IfPermissionsDirective extends IfDirectiveBase {
12200
13441
  constructor(_viewContainer, templateRef, dataService, changeDetectorRef) {
@@ -12324,6 +13565,7 @@ class DynamicFormInputComponent {
12324
13565
  this.onChange(val);
12325
13566
  this.control.patchValue(val, { emitEvent: false });
12326
13567
  });
13568
+ setTimeout(() => this.changeDetectorRef.markForCheck());
12327
13569
  }
12328
13570
  };
12329
13571
  // initial render
@@ -12827,6 +14069,20 @@ RelationCardComponent.propDecorators = {
12827
14069
  detailTemplate: [{ type: ContentChild, args: [RelationCardDetailDirective, { read: TemplateRef },] }]
12828
14070
  };
12829
14071
 
14072
+ /**
14073
+ * @description
14074
+ * Given an Asset object (an object with `preview` and optionally `focalPoint` properties), this pipe
14075
+ * returns a string with query parameters designed to work with the image resize capabilities of the
14076
+ * AssetServerPlugin.
14077
+ *
14078
+ * @example
14079
+ * ```HTML
14080
+ * <img [src]="asset | assetPreview:'tiny'" />
14081
+ * <img [src]="asset | assetPreview:150" />
14082
+ * ```
14083
+ *
14084
+ * @docsCategory pipes
14085
+ */
12830
14086
  class AssetPreviewPipe {
12831
14087
  transform(asset, preset = 'thumb') {
12832
14088
  if (!asset) {
@@ -12911,8 +14167,16 @@ CustomFieldLabelPipe.ctorParameters = () => [
12911
14167
  ];
12912
14168
 
12913
14169
  /**
14170
+ * @description
12914
14171
  * Displays a number of milliseconds in a more human-readable format,
12915
14172
  * e.g. "12ms", "33s", "2:03m"
14173
+ *
14174
+ * @example
14175
+ * ```TypeScript
14176
+ * {{ timeInMs | duration }}
14177
+ * ```
14178
+ *
14179
+ * @docsCategory pipes
12916
14180
  */
12917
14181
  class DurationPipe {
12918
14182
  constructor(i18nService) {
@@ -12948,7 +14212,15 @@ DurationPipe.ctorParameters = () => [
12948
14212
  ];
12949
14213
 
12950
14214
  /**
14215
+ * @description
12951
14216
  * Formats a number into a human-readable file size string.
14217
+ *
14218
+ * @example
14219
+ * ```TypeScript
14220
+ * {{ fileSizeInBytes | filesize }}
14221
+ * ```
14222
+ *
14223
+ * @docsCategory pipes
12952
14224
  */
12953
14225
  class FileSizePipe {
12954
14226
  transform(value, useSiUnits = true) {
@@ -12982,13 +14254,15 @@ function humanFileSize(bytes, si) {
12982
14254
  }
12983
14255
 
12984
14256
  /**
14257
+ * @description
12985
14258
  * A pipe which checks the provided permission against all the permissions of the current user.
12986
14259
  * Returns `true` if the current user has that permission.
12987
14260
  *
12988
14261
  * @example
12989
- * ```
14262
+ * ```HTML
12990
14263
  * <button [disabled]="!('UpdateCatalog' | hasPermission)">Save Changes</button>
12991
14264
  * ```
14265
+ * @docsCategory pipes
12992
14266
  */
12993
14267
  class HasPermissionPipe {
12994
14268
  constructor(dataService, changeDetectorRef) {
@@ -13051,9 +14325,12 @@ class LocaleBasePipe {
13051
14325
  if (dataService && changeDetectorRef) {
13052
14326
  this.subscription = dataService.client
13053
14327
  .uiState()
13054
- .mapStream(data => data.uiState.language)
13055
- .subscribe(languageCode => {
13056
- this.locale = languageCode.replace(/_/g, '-');
14328
+ .mapStream(data => data.uiState)
14329
+ .subscribe(({ language, locale }) => {
14330
+ this.locale = language.replace(/_/g, '-');
14331
+ if (locale) {
14332
+ this.locale += `-${locale}`;
14333
+ }
13057
14334
  changeDetectorRef.markForCheck();
13058
14335
  });
13059
14336
  }
@@ -13073,7 +14350,15 @@ LocaleBasePipe.ctorParameters = () => [
13073
14350
  ];
13074
14351
 
13075
14352
  /**
14353
+ * @description
13076
14354
  * Displays a human-readable name for a given ISO 4217 currency code.
14355
+ *
14356
+ * @example
14357
+ * ```HTML
14358
+ * {{ order.currencyCode | localeCurrencyName }}
14359
+ * ```
14360
+ *
14361
+ * @docsCategory pipes
13077
14362
  */
13078
14363
  class LocaleCurrencyNamePipe extends LocaleBasePipe {
13079
14364
  constructor(dataService, changeDetectorRef) {
@@ -13119,6 +14404,18 @@ LocaleCurrencyNamePipe.ctorParameters = () => [
13119
14404
  { type: ChangeDetectorRef, decorators: [{ type: Optional }] }
13120
14405
  ];
13121
14406
 
14407
+ /**
14408
+ * @description
14409
+ * Formats a Vendure monetary value (in cents) into the correct format for the configured currency and display
14410
+ * locale.
14411
+ *
14412
+ * @example
14413
+ * ```HTML
14414
+ * {{ variant.priceWithTax | localeCurrency }}
14415
+ * ```
14416
+ *
14417
+ * @docsCategory pipes
14418
+ */
13122
14419
  class LocaleCurrencyPipe extends LocaleBasePipe {
13123
14420
  constructor(dataService, changeDetectorRef) {
13124
14421
  super(dataService, changeDetectorRef);
@@ -13148,6 +14445,13 @@ LocaleCurrencyPipe.ctorParameters = () => [
13148
14445
  * @description
13149
14446
  * A replacement of the Angular DatePipe which makes use of the Intl API
13150
14447
  * to format dates according to the selected UI language.
14448
+ *
14449
+ * @example
14450
+ * ```HTML
14451
+ * {{ order.orderPlacedAt | localeDate }}
14452
+ * ```
14453
+ *
14454
+ * @docsCategory pipes
13151
14455
  */
13152
14456
  class LocaleDatePipe extends LocaleBasePipe {
13153
14457
  constructor(dataService, changeDetectorRef) {
@@ -13215,7 +14519,15 @@ LocaleDatePipe.ctorParameters = () => [
13215
14519
  ];
13216
14520
 
13217
14521
  /**
13218
- * Displays a human-readable name for a given ISO 4217 currency code.
14522
+ * @description
14523
+ * Displays a human-readable name for a given ISO 639-1 language code.
14524
+ *
14525
+ * @example
14526
+ * ```HTML
14527
+ * {{ 'zh_Hant' | localeLanguageName }}
14528
+ * ```
14529
+ *
14530
+ * @docsCategory pipes
13219
14531
  */
13220
14532
  class LocaleLanguageNamePipe extends LocaleBasePipe {
13221
14533
  constructor(dataService, changeDetectorRef) {
@@ -13251,6 +14563,51 @@ LocaleLanguageNamePipe.ctorParameters = () => [
13251
14563
  { type: ChangeDetectorRef, decorators: [{ type: Optional }] }
13252
14564
  ];
13253
14565
 
14566
+ /**
14567
+ * @description
14568
+ * Displays a human-readable name for a given region.
14569
+ *
14570
+ * @example
14571
+ * ```HTML
14572
+ * {{ 'GB' | localeRegionName }}
14573
+ * ```
14574
+ *
14575
+ * @docsCategory pipes
14576
+ */
14577
+ class LocaleRegionNamePipe extends LocaleBasePipe {
14578
+ constructor(dataService, changeDetectorRef) {
14579
+ super(dataService, changeDetectorRef);
14580
+ }
14581
+ transform(value, locale) {
14582
+ var _a;
14583
+ if (value == null || value === '') {
14584
+ return '';
14585
+ }
14586
+ if (typeof value !== 'string') {
14587
+ return `Invalid region code "${value}"`;
14588
+ }
14589
+ const activeLocale = typeof locale === 'string' ? locale : (_a = this.locale) !== null && _a !== void 0 ? _a : 'en';
14590
+ // Awaiting TS types for this API: https://github.com/microsoft/TypeScript/pull/44022/files
14591
+ const DisplayNames = Intl.DisplayNames;
14592
+ try {
14593
+ return new DisplayNames([activeLocale.replace('_', '-')], { type: 'region' }).of(value.replace('_', '-'));
14594
+ }
14595
+ catch (e) {
14596
+ return value;
14597
+ }
14598
+ }
14599
+ }
14600
+ LocaleRegionNamePipe.decorators = [
14601
+ { type: Pipe, args: [{
14602
+ name: 'localeRegionName',
14603
+ pure: false,
14604
+ },] }
14605
+ ];
14606
+ LocaleRegionNamePipe.ctorParameters = () => [
14607
+ { type: DataService, decorators: [{ type: Optional }] },
14608
+ { type: ChangeDetectorRef, decorators: [{ type: Optional }] }
14609
+ ];
14610
+
13254
14611
  /**
13255
14612
  * Formats a string into sentence case (first letter of first word uppercase).
13256
14613
  */
@@ -13398,7 +14755,15 @@ StringToColorPipe.decorators = [
13398
14755
  ];
13399
14756
 
13400
14757
  /**
14758
+ * @description
13401
14759
  * Converts a date into the format "3 minutes ago", "5 hours ago" etc.
14760
+ *
14761
+ * @example
14762
+ * ```HTML
14763
+ * {{ order.orderPlacedAt | timeAgo }}
14764
+ * ```
14765
+ *
14766
+ * @docsCategory pipes
13402
14767
  */
13403
14768
  class TimeAgoPipe {
13404
14769
  constructor(i18nService) {
@@ -13560,11 +14925,15 @@ const DECLARATIONS = [
13560
14925
  LocaleDatePipe,
13561
14926
  LocaleCurrencyPipe,
13562
14927
  LocaleLanguageNamePipe,
14928
+ LocaleRegionNamePipe,
13563
14929
  TagSelectorComponent,
13564
14930
  ManageTagsDialogComponent,
13565
14931
  RelationSelectorDialogComponent,
13566
14932
  RelationCardComponent,
13567
14933
  StatusBadgeComponent,
14934
+ TabbedCustomFieldsComponent,
14935
+ UiExtensionPointComponent,
14936
+ CustomDetailComponentHostComponent,
13568
14937
  ];
13569
14938
  const DYNAMIC_FORM_INPUTS = [
13570
14939
  TextFormInputComponent,
@@ -13585,6 +14954,8 @@ const DYNAMIC_FORM_INPUTS = [
13585
14954
  RelationCardDetailDirective,
13586
14955
  RelationSelectorDialogComponent,
13587
14956
  TextareaFormInputComponent,
14957
+ RichTextFormInputComponent,
14958
+ JsonEditorFormInputComponent,
13588
14959
  ];
13589
14960
  class SharedModule {
13590
14961
  }
@@ -13705,6 +15076,45 @@ AppComponentModule.decorators = [
13705
15076
  },] }
13706
15077
  ];
13707
15078
 
15079
+ /**
15080
+ * @description
15081
+ * A base class for entity detail views. It should be used in conjunction with the
15082
+ * {@link BaseEntityResolver}.
15083
+ *
15084
+ * @example
15085
+ * ```TypeScript
15086
+ * \@Component({
15087
+ * selector: 'app-my-entity',
15088
+ * templateUrl: './my-entity.component.html',
15089
+ * styleUrls: ['./my-entity.component.scss'],
15090
+ * changeDetection: ChangeDetectionStrategy.OnPush,
15091
+ * })
15092
+ * export class GlobalSettingsComponent extends BaseDetailComponent<MyEntity.Fragment> implements OnInit {
15093
+ * detailForm: FormGroup;
15094
+ *
15095
+ * constructor(
15096
+ * router: Router,
15097
+ * route: ActivatedRoute,
15098
+ * serverConfigService: ServerConfigService,
15099
+ * protected dataService: DataService,
15100
+ * private formBuilder: FormBuilder,
15101
+ * ) {
15102
+ * super(route, router, serverConfigService, dataService);
15103
+ * this.detailForm = this.formBuilder.group({
15104
+ * name: [''],
15105
+ * });
15106
+ * }
15107
+ *
15108
+ * protected setFormValues(entity: MyEntity.Fragment, languageCode: LanguageCode): void {
15109
+ * this.detailForm.patchValue({
15110
+ * name: entity.name,
15111
+ * });
15112
+ * }
15113
+ * }
15114
+ * ```
15115
+ *
15116
+ * @docsCategory list-detail-views
15117
+ */
13708
15118
  class BaseDetailComponent {
13709
15119
  constructor(route, router, serverConfigService, dataService) {
13710
15120
  this.route = route;
@@ -13743,6 +15153,19 @@ class BaseDetailComponent {
13743
15153
  canDeactivate() {
13744
15154
  return this.detailForm && this.detailForm.pristine;
13745
15155
  }
15156
+ setCustomFieldFormValues(customFields, formGroup, entity, currentTranslation) {
15157
+ var _a, _b;
15158
+ for (const fieldDef of customFields) {
15159
+ const key = fieldDef.name;
15160
+ const value = fieldDef.type === 'localeString'
15161
+ ? (_a = currentTranslation.customFields) === null || _a === void 0 ? void 0 : _a[key]
15162
+ : (_b = entity.customFields) === null || _b === void 0 ? void 0 : _b[key];
15163
+ const control = formGroup === null || formGroup === void 0 ? void 0 : formGroup.get(key);
15164
+ if (control) {
15165
+ control.patchValue(value);
15166
+ }
15167
+ }
15168
+ }
13746
15169
  getCustomFieldConfig(key) {
13747
15170
  return this.serverConfigService.getCustomFieldsFor(key);
13748
15171
  }
@@ -13763,8 +15186,34 @@ function createResolveData(resolver) {
13763
15186
  };
13764
15187
  }
13765
15188
  /**
15189
+ * @description
13766
15190
  * A base resolver for an entity detail route. Resolves to an observable of the given entity, or a "blank"
13767
- * version if the route id equals "create".
15191
+ * version if the route id equals "create". Should be used together with details views which extend the
15192
+ * {@link BaseDetailComponent}.
15193
+ *
15194
+ * @example
15195
+ * ```TypeScript
15196
+ * \@Injectable({
15197
+ * providedIn: 'root',
15198
+ * })
15199
+ * export class MyEntityResolver extends BaseEntityResolver<MyEntity.Fragment> {
15200
+ * constructor(router: Router, dataService: DataService) {
15201
+ * super(
15202
+ * router,
15203
+ * {
15204
+ * __typename: 'MyEntity',
15205
+ * id: '',
15206
+ * createdAt: '',
15207
+ * updatedAt: '',
15208
+ * name: '',
15209
+ * },
15210
+ * id => dataService.query(GET_MY_ENTITY, { id }).mapStream(data => data.myEntity),
15211
+ * );
15212
+ * }
15213
+ * }
15214
+ * ```
15215
+ *
15216
+ * @docsCategory list-detail-views
13768
15217
  */
13769
15218
  class BaseEntityResolver {
13770
15219
  constructor(router, emptyEntity, entityStream) {
@@ -13772,6 +15221,7 @@ class BaseEntityResolver {
13772
15221
  this.emptyEntity = emptyEntity;
13773
15222
  this.entityStream = entityStream;
13774
15223
  }
15224
+ /** @internal */
13775
15225
  resolve(route, state) {
13776
15226
  const id = route.paramMap.get('id');
13777
15227
  // Complete the entity stream upon navigating away
@@ -13787,8 +15237,70 @@ class BaseEntityResolver {
13787
15237
  }
13788
15238
 
13789
15239
  /**
15240
+ * @description
13790
15241
  * This is a base class which implements the logic required to fetch and manipulate
13791
15242
  * a list of data from a query which returns a PaginatedList type.
15243
+ *
15244
+ * @example
15245
+ * ```TypeScript
15246
+ * \@Component({
15247
+ * selector: 'my-entity-list',
15248
+ * templateUrl: './my-entity-list.component.html',
15249
+ * styleUrls: ['./my-entity-list.component.scss'],
15250
+ * changeDetection: ChangeDetectionStrategy.OnPush,
15251
+ * })
15252
+ * export class MyEntityListComponent extends BaseListComponent<GetMyEntityList.Query, GetMyEntityList.Items> {
15253
+ * constructor(
15254
+ * private dataService: DataService,
15255
+ * router: Router,
15256
+ * route: ActivatedRoute,
15257
+ * ) {
15258
+ * super(router, route);
15259
+ * super.setQueryFn(
15260
+ * (...args: any[]) => this.dataService.query<GetMyEntityList.Query>(GET_MY_ENTITY_LIST),
15261
+ * data => data.myEntities,
15262
+ * );
15263
+ * }
15264
+ * }
15265
+ * ```
15266
+ *
15267
+ * The template for the component will typically use the {@link DataTableComponent} to display the results.
15268
+ *
15269
+ * @example
15270
+ * ```HTML
15271
+ * <vdr-action-bar>
15272
+ * <vdr-ab-right>
15273
+ * <a class="btn btn-primary" [routerLink]="['./create']" *vdrIfPermissions="['CreateSettings', 'CreateTaxRate']">
15274
+ * <clr-icon shape="plus"></clr-icon>
15275
+ * Create new my entity
15276
+ * </a>
15277
+ * </vdr-ab-right>
15278
+ * </vdr-action-bar>
15279
+ *
15280
+ * <vdr-data-table
15281
+ * [items]="items$ | async"
15282
+ * [itemsPerPage]="itemsPerPage$ | async"
15283
+ * [totalItems]="totalItems$ | async"
15284
+ * [currentPage]="currentPage$ | async"
15285
+ * (pageChange)="setPageNumber($event)"
15286
+ * (itemsPerPageChange)="setItemsPerPage($event)"
15287
+ * >
15288
+ * <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>
15289
+ * <vdr-dt-column></vdr-dt-column>
15290
+ * <ng-template let-myEntity="item">
15291
+ * <td class="left align-middle">{{ myEntity.name }}</td>
15292
+ * <td class="right align-middle">
15293
+ * <vdr-table-row-action
15294
+ * iconShape="edit"
15295
+ * [label]="'common.edit' | translate"
15296
+ * [linkTo]="['./', myEntity.id]"
15297
+ * ></vdr-table-row-action>
15298
+ * </td>
15299
+ * </ng-template>
15300
+ * </vdr-data-table>
15301
+ * ```
15302
+ *
15303
+ * @docsCategory list-detail-views
13792
15304
  */
13793
15305
  // tslint:disable-next-line:directive-class-suffix
13794
15306
  class BaseListComponent {
@@ -13801,6 +15313,7 @@ class BaseListComponent {
13801
15313
  this.defaults = { take: 10, skip: 0 };
13802
15314
  }
13803
15315
  /**
15316
+ * @description
13804
15317
  * Sets the fetch function for the list being implemented.
13805
15318
  */
13806
15319
  setQueryFn(listQueryFn, mappingFn, onPageChangeFn, defaults) {
@@ -13813,6 +15326,7 @@ class BaseListComponent {
13813
15326
  this.defaults = defaults;
13814
15327
  }
13815
15328
  }
15329
+ /** @internal */
13816
15330
  ngOnInit() {
13817
15331
  if (!this.listQueryFn) {
13818
15332
  throw new Error(`No listQueryFn has been defined. Please call super.setQueryFn() in the constructor.`);
@@ -13832,19 +15346,29 @@ class BaseListComponent {
13832
15346
  .pipe(takeUntil(this.destroy$))
13833
15347
  .subscribe(fetchPage);
13834
15348
  }
15349
+ /** @internal */
13835
15350
  ngOnDestroy() {
13836
15351
  this.destroy$.next();
13837
15352
  this.destroy$.complete();
13838
15353
  this.listQuery.completed$.next();
13839
15354
  }
15355
+ /**
15356
+ * @description
15357
+ * Sets the current page number in the url.
15358
+ */
13840
15359
  setPageNumber(page) {
13841
15360
  this.setQueryParam('page', page, { replaceUrl: true });
13842
15361
  }
15362
+ /**
15363
+ * @description
15364
+ * Sets the number of items per page in the url.
15365
+ */
13843
15366
  setItemsPerPage(perPage) {
13844
15367
  this.setQueryParam('perPage', perPage, { replaceUrl: true });
13845
15368
  }
13846
15369
  /**
13847
- * Re-fetch the current page
15370
+ * @description
15371
+ * Re-fetch the current page of results.
13848
15372
  */
13849
15373
  refresh() {
13850
15374
  this.refresh$.next(undefined);
@@ -13969,7 +15493,7 @@ function patchObject(obj, patch) {
13969
15493
  }
13970
15494
 
13971
15495
  // Auto-generated by the set-version.js script.
13972
- const ADMIN_UI_VERSION = '1.3.3';
15496
+ const ADMIN_UI_VERSION = '1.4.1';
13973
15497
 
13974
15498
  /**
13975
15499
  * Responsible for registering dashboard widget components and querying for layouts.
@@ -14189,5 +15713,5 @@ function unicodePatternValidator(patternRe) {
14189
15713
  * Generated bundle index. Do not edit.
14190
15714
  */
14191
15715
 
14192
- export { ADDRESS_FRAGMENT, ADD_CUSTOMERS_TO_GROUP, ADD_MANUAL_PAYMENT_TO_ORDER, ADD_MEMBERS_TO_ZONE, ADD_NOTE_TO_CUSTOMER, ADD_NOTE_TO_ORDER, ADD_OPTION_GROUP_TO_PRODUCT, ADD_OPTION_TO_GROUP, ADMINISTRATOR_FRAGMENT, ADMIN_UI_VERSION, ALL_CUSTOM_FIELDS_FRAGMENT, ASSET_FRAGMENT, ASSIGN_PRODUCTS_TO_CHANNEL, ASSIGN_ROLE_TO_ADMINISTRATOR, ASSIGN_VARIANTS_TO_CHANNEL, ATTEMPT_LOGIN, AUTH_REDIRECT_PARAM, ActionBarComponent, ActionBarItemsComponent, ActionBarLeftComponent, ActionBarRightComponent, AddressFormComponent, AdjustmentType, AdministratorDataService, AffixedInputComponent, AppComponent, AppComponentModule, AppShellComponent, AssetFileInputComponent, AssetGalleryComponent, AssetPickerDialogComponent, AssetPreviewComponent, AssetPreviewDialogComponent, AssetPreviewPipe, AssetSearchInputComponent, AssetType, AuthDataService, AuthGuard, AuthService, BOOLEAN_CUSTOM_FIELD_FRAGMENT, BaseDataService, BaseDetailComponent, BaseEntityResolver, BaseListComponent, BooleanFormInputComponent, BreadcrumbComponent, CANCEL_JOB, CANCEL_ORDER, CHANNEL_FRAGMENT, COLLECTION_FRAGMENT, CONFIGURABLE_OPERATION_DEF_FRAGMENT, CONFIGURABLE_OPERATION_FRAGMENT, COUNTRY_FRAGMENT, CREATE_ADMINISTRATOR, CREATE_ASSETS, CREATE_CHANNEL, CREATE_COLLECTION, CREATE_COUNTRY, CREATE_CUSTOMER, CREATE_CUSTOMER_ADDRESS, CREATE_CUSTOMER_GROUP, CREATE_FACET, CREATE_FACET_VALUES, CREATE_FULFILLMENT, CREATE_PAYMENT_METHOD, CREATE_PRODUCT, CREATE_PRODUCT_OPTION_GROUP, CREATE_PRODUCT_VARIANTS, CREATE_PROMOTION, CREATE_ROLE, CREATE_SHIPPING_METHOD, CREATE_TAG, CREATE_TAX_CATEGORY, CREATE_TAX_RATE, CREATE_ZONE, CURRENT_USER_FRAGMENT, CUSTOMER_FRAGMENT, CUSTOM_FIELD_CONFIG_FRAGMENT, CanDeactivateDetailGuard, ChannelAssignmentControlComponent, ChannelBadgeComponent, ChannelLabelPipe, ChannelSwitcherComponent, CheckJobsLink, ChipComponent, ClientDataService, CollectionDataService, ComponentRegistryService, ConfigurableInputComponent, CoreModule, CurrencyCode, CurrencyFormInputComponent, CurrencyInputComponent, CustomFieldComponentService, CustomFieldControlComponent, CustomFieldLabelPipe, CustomHttpTranslationLoader, CustomerDataService, CustomerGroupFormInputComponent, CustomerLabelComponent, DATE_TIME_CUSTOM_FIELD_FRAGMENT, DELETE_ADMINISTRATOR, DELETE_ASSETS, DELETE_CHANNEL, DELETE_COLLECTION, DELETE_COUNTRY, DELETE_CUSTOMER, DELETE_CUSTOMER_GROUP, DELETE_CUSTOMER_NOTE, DELETE_FACET, DELETE_FACET_VALUES, DELETE_ORDER_NOTE, DELETE_PAYMENT_METHOD, DELETE_PRODUCT, DELETE_PRODUCT_VARIANT, DELETE_PROMOTION, DELETE_ROLE, DELETE_SHIPPING_METHOD, DELETE_TAG, DELETE_TAX_CATEGORY, DELETE_TAX_RATE, DELETE_ZONE, DISCOUNT_FRAGMENT, DashboardWidgetService, DataModule, DataService, DataTableColumnComponent, DataTableComponent, DateFormInputComponent, DatetimePickerComponent, DatetimePickerService, DefaultInterceptor, DeletionResult, DialogButtonsDirective, DialogComponentOutletComponent, DialogTitleDirective, DisabledDirective, DropdownComponent, DropdownItemDirective, DropdownMenuComponent, DropdownTriggerDirective, DurationPipe, DynamicFormInputComponent, ERROR_RESULT_FRAGMENT, EditNoteDialogComponent, EmptyPlaceholderComponent, EntityInfoComponent, ErrorCode, ExtensionHostComponent, ExtensionHostConfig, ExtensionHostService, ExternalImageDialogComponent, FACET_VALUE_FRAGMENT, FACET_WITH_VALUES_FRAGMENT, FLOAT_CUSTOM_FIELD_FRAGMENT, FULFILLMENT_FRAGMENT, FacetDataService, FacetValueChipComponent, FacetValueFormInputComponent, FacetValueSelectorComponent, FetchAdapter, FileSizePipe, FocalPointControlComponent, FormFieldComponent, FormFieldControlDirective, FormItemComponent, FormattedAddressComponent, GET_ACTIVE_ADMINISTRATOR, GET_ACTIVE_CHANNEL, GET_ADJUSTMENT_OPERATIONS, GET_ADMINISTRATOR, GET_ADMINISTRATORS, GET_ASSET, GET_ASSET_LIST, GET_AVAILABLE_COUNTRIES, GET_CHANNEL, GET_CHANNELS, GET_CLIENT_STATE, GET_COLLECTION, GET_COLLECTION_CONTENTS, GET_COLLECTION_FILTERS, GET_COLLECTION_LIST, GET_COUNTRY, GET_COUNTRY_LIST, GET_CURRENT_USER, GET_CUSTOMER, GET_CUSTOMER_GROUPS, GET_CUSTOMER_GROUP_WITH_CUSTOMERS, GET_CUSTOMER_HISTORY, GET_CUSTOMER_LIST, GET_FACET_LIST, GET_FACET_WITH_VALUES, GET_GLOBAL_SETTINGS, GET_JOBS_BY_ID, GET_JOBS_LIST, GET_JOB_INFO, GET_JOB_QUEUE_LIST, GET_NEWTORK_STATUS, GET_ORDER, GET_ORDERS_LIST, GET_ORDER_HISTORY, GET_ORDER_SUMMARY, GET_PAYMENT_METHOD, GET_PAYMENT_METHOD_LIST, GET_PAYMENT_METHOD_OPERATIONS, GET_PENDING_SEARCH_INDEX_UPDATES, GET_PRODUCT_LIST, GET_PRODUCT_OPTION_GROUP, GET_PRODUCT_OPTION_GROUPS, GET_PRODUCT_SIMPLE, GET_PRODUCT_VARIANT, GET_PRODUCT_VARIANT_LIST, GET_PRODUCT_VARIANT_LIST_SIMPLE, GET_PRODUCT_VARIANT_OPTIONS, GET_PRODUCT_WITH_VARIANTS, GET_PROMOTION, GET_PROMOTION_LIST, GET_ROLE, GET_ROLES, GET_SERVER_CONFIG, GET_SHIPPING_METHOD, GET_SHIPPING_METHOD_LIST, GET_SHIPPING_METHOD_OPERATIONS, GET_TAG, GET_TAG_LIST, GET_TAX_CATEGORIES, GET_TAX_CATEGORY, GET_TAX_RATE, GET_TAX_RATE_LIST, GET_UI_STATE, GET_USER_STATUS, GET_ZONE, GET_ZONES, GLOBAL_SETTINGS_FRAGMENT, GlobalFlag, HasPermissionPipe, HealthCheckService, HelpTooltipComponent, HistoryEntryDetailComponent, HistoryEntryType, HttpLoaderFactory, I18nService, INT_CUSTOM_FIELD_FRAGMENT, IfDefaultChannelActiveDirective, IfDirectiveBase, IfMultichannelDirective, IfPermissionsDirective, InjectableTranslateMessageFormatCompiler, ItemsPerPageControlsComponent, JOB_INFO_FRAGMENT, JobQueueService, JobState, LOCALE_STRING_CUSTOM_FIELD_FRAGMENT, LOG_OUT, LabeledDataComponent, LanguageCode, LanguageSelectorComponent, LinkDialogComponent, LocalStorageService, LocaleBasePipe, LocaleCurrencyNamePipe, LocaleCurrencyPipe, LocaleDatePipe, LocaleLanguageNamePipe, LogicalOperator, MODIFY_ORDER, MOVE_COLLECTION, MainNavComponent, ManageTagsDialogComponent, ModalDialogComponent, ModalService, NavBuilderService, NotificationComponent, NotificationService, NumberFormInputComponent, ORDER_ADDRESS_FRAGMENT, ORDER_DETAIL_FRAGMENT, ORDER_FRAGMENT, ORDER_LINE_FRAGMENT, ObjectTreeComponent, OmitTypenameLink, OrderDataService, OrderStateLabelComponent, OverlayHostComponent, OverlayHostService, PAYMENT_METHOD_FRAGMENT, PRODUCT_DETAIL_FRAGMENT, PRODUCT_OPTION_FRAGMENT, PRODUCT_OPTION_GROUP_FRAGMENT, PRODUCT_OPTION_GROUP_WITH_OPTIONS_FRAGMENT, PRODUCT_SELECTOR_SEARCH, PRODUCT_VARIANT_FRAGMENT, PROMOTION_FRAGMENT, PaginationControlsComponent, PasswordFormInputComponent, PercentageSuffixInputComponent, Permission, ProductDataService, ProductSelectorComponent, ProductSelectorFormInputComponent, PromotionDataService, ProsemirrorService, QueryResult, REFUND_FRAGMENT, REFUND_ORDER, REINDEX, RELATION_CUSTOM_FIELD_FRAGMENT, REMOVE_CUSTOMERS_FROM_GROUP, REMOVE_MEMBERS_FROM_ZONE, REMOVE_OPTION_GROUP_FROM_PRODUCT, REMOVE_PRODUCTS_FROM_CHANNEL, REMOVE_VARIANTS_FROM_CHANNEL, REQUEST_COMPLETED, REQUEST_STARTED, ROLE_FRAGMENT, RUN_PENDING_SEARCH_INDEX_UPDATES, RelationAssetInputComponent, RelationCardComponent, RelationCardDetailDirective, RelationCardPreviewDirective, RelationCustomerInputComponent, RelationFormInputComponent, RelationProductInputComponent, RelationProductVariantInputComponent, RelationSelectorDialogComponent, RichTextEditorComponent, SEARCH_PRODUCTS, SETTLE_PAYMENT, SETTLE_REFUND, SET_ACTIVE_CHANNEL, SET_AS_LOGGED_IN, SET_AS_LOGGED_OUT, SET_CONTENT_LANGUAGE, SET_UI_LANGUAGE, SET_UI_THEME, SHIPPING_METHOD_FRAGMENT, STRING_CUSTOM_FIELD_FRAGMENT, SelectFormInputComponent, SelectToggleComponent, SentenceCasePipe, ServerConfigService, SettingsDataService, SharedModule, ShippingMethodDataService, SimpleDialogComponent, SingleSearchSelectionModel, SingleSearchSelectionModelFactory, SortOrder, SortPipe, StateI18nTokenPipe, StatusBadgeComponent, StockMovementType, StringToColorPipe, TAG_FRAGMENT, TAX_CATEGORY_FRAGMENT, TAX_RATE_FRAGMENT, TEST_ELIGIBLE_SHIPPING_METHODS, TEST_SHIPPING_METHOD, TEXT_CUSTOM_FIELD_FRAGMENT, TRANSITION_FULFILLMENT_TO_STATE, TRANSITION_ORDER_TO_STATE, TRANSITION_PAYMENT_TO_STATE, TableRowActionComponent, TagSelectorComponent, TextFormInputComponent, TextareaFormInputComponent, ThemeSwitcherComponent, TimeAgoPipe, TimelineEntryComponent, TitleInputComponent, UPDATE_ACTIVE_ADMINISTRATOR, UPDATE_ADMINISTRATOR, UPDATE_ASSET, UPDATE_CHANNEL, UPDATE_COLLECTION, UPDATE_COUNTRY, UPDATE_CUSTOMER, UPDATE_CUSTOMER_ADDRESS, UPDATE_CUSTOMER_GROUP, UPDATE_CUSTOMER_NOTE, UPDATE_FACET, UPDATE_FACET_VALUES, UPDATE_GLOBAL_SETTINGS, UPDATE_ORDER_CUSTOM_FIELDS, UPDATE_ORDER_NOTE, UPDATE_PAYMENT_METHOD, UPDATE_PRODUCT, UPDATE_PRODUCT_OPTION, UPDATE_PRODUCT_OPTION_GROUP, UPDATE_PRODUCT_VARIANTS, UPDATE_PROMOTION, UPDATE_ROLE, UPDATE_SHIPPING_METHOD, UPDATE_TAG, UPDATE_TAX_CATEGORY, UPDATE_TAX_RATE, UPDATE_USER_CHANNELS, UPDATE_ZONE, USER_STATUS_FRAGMENT, UiLanguageSwitcherDialogComponent, UserMenuComponent, ZONE_FRAGMENT, addActionBarItem, addCustomFields, addNavMenuItem, addNavMenuSection, blockQuoteRule, buildInputRules, buildKeymap, buildMenuItems, bulletListRule, canInsert, clientResolvers, codeBlockRule, configurableDefinitionToInstance, configurableOperationValueIsValid, createApollo, createResolveData, createUpdatedTranslatable, dayOfWeekIndex, defaultFormInputs, detailBreadcrumb, encodeConfigArgValue, findTranslation, flattenFacetValues, getAppConfig, getClientDefaults, getConfigArgValue, getDefaultConfigArgValue, getDefaultUiLanguage, getLocales, getMarkRange, getServerLocation, headingRule, hostExternalFrame, initializeServerConfigService, insertImageItem, interpolateDescription, result as introspectionResult, isEntityCreateOrUpdateMutation, linkItem, linkSelectPlugin, loadAppConfig, markActive, orderedListRule, registerCustomFieldComponent, registerDashboardWidget, registerDefaultFormInputs, registerFormInputComponent, removeReadonlyCustomFields, setDashboardWidgetLayout, stringToColor, toConfigurableOperationInput, transformRelationCustomFieldInputs, unicodePatternValidator, weekDayNames, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8 };
15716
+ export { ADDRESS_FRAGMENT, ADD_CUSTOMERS_TO_GROUP, ADD_MANUAL_PAYMENT_TO_ORDER, ADD_MEMBERS_TO_ZONE, ADD_NOTE_TO_CUSTOMER, ADD_NOTE_TO_ORDER, ADD_OPTION_GROUP_TO_PRODUCT, ADD_OPTION_TO_GROUP, ADMINISTRATOR_FRAGMENT, ADMIN_UI_VERSION, ALL_CUSTOM_FIELDS_FRAGMENT, ASSET_FRAGMENT, ASSIGN_PRODUCTS_TO_CHANNEL, ASSIGN_ROLE_TO_ADMINISTRATOR, ASSIGN_VARIANTS_TO_CHANNEL, ATTEMPT_LOGIN, AUTH_REDIRECT_PARAM, ActionBarComponent, ActionBarItemsComponent, ActionBarLeftComponent, ActionBarRightComponent, AddressFormComponent, AdjustmentType, AdministratorDataService, AffixedInputComponent, AppComponent, AppComponentModule, AppShellComponent, AssetFileInputComponent, AssetGalleryComponent, AssetPickerDialogComponent, AssetPreviewComponent, AssetPreviewDialogComponent, AssetPreviewPipe, AssetSearchInputComponent, AssetType, AuthDataService, AuthGuard, AuthService, BOOLEAN_CUSTOM_FIELD_FRAGMENT, BaseDataService, BaseDetailComponent, BaseEntityResolver, BaseListComponent, BooleanFormInputComponent, BreadcrumbComponent, CANCEL_JOB, CANCEL_ORDER, CHANNEL_FRAGMENT, COLLECTION_FRAGMENT, CONFIGURABLE_OPERATION_DEF_FRAGMENT, CONFIGURABLE_OPERATION_FRAGMENT, COUNTRY_FRAGMENT, CREATE_ADMINISTRATOR, CREATE_ASSETS, CREATE_CHANNEL, CREATE_COLLECTION, CREATE_COUNTRY, CREATE_CUSTOMER, CREATE_CUSTOMER_ADDRESS, CREATE_CUSTOMER_GROUP, CREATE_FACET, CREATE_FACET_VALUES, CREATE_FULFILLMENT, CREATE_PAYMENT_METHOD, CREATE_PRODUCT, CREATE_PRODUCT_OPTION_GROUP, CREATE_PRODUCT_VARIANTS, CREATE_PROMOTION, CREATE_ROLE, CREATE_SHIPPING_METHOD, CREATE_TAG, CREATE_TAX_CATEGORY, CREATE_TAX_RATE, CREATE_ZONE, CURRENT_USER_FRAGMENT, CUSTOMER_FRAGMENT, CUSTOMER_GROUP_FRAGMENT, CUSTOM_FIELD_CONFIG_FRAGMENT, CanDeactivateDetailGuard, ChannelAssignmentControlComponent, ChannelBadgeComponent, ChannelLabelPipe, ChannelSwitcherComponent, CheckJobsLink, ChipComponent, ClientDataService, CollectionDataService, ComponentRegistryService, ConfigurableInputComponent, CoreModule, CurrencyCode, CurrencyFormInputComponent, CurrencyInputComponent, CustomDetailComponentHostComponent, CustomDetailComponentService, CustomFieldComponentService, CustomFieldControlComponent, CustomFieldLabelPipe, CustomHttpTranslationLoader, CustomerDataService, CustomerGroupFormInputComponent, CustomerLabelComponent, DATE_TIME_CUSTOM_FIELD_FRAGMENT, DELETE_ADMINISTRATOR, DELETE_ASSETS, DELETE_CHANNEL, DELETE_COLLECTION, DELETE_COUNTRY, DELETE_CUSTOMER, DELETE_CUSTOMER_GROUP, DELETE_CUSTOMER_NOTE, DELETE_FACET, DELETE_FACET_VALUES, DELETE_ORDER_NOTE, DELETE_PAYMENT_METHOD, DELETE_PRODUCT, DELETE_PRODUCT_VARIANT, DELETE_PROMOTION, DELETE_ROLE, DELETE_SHIPPING_METHOD, DELETE_TAG, DELETE_TAX_CATEGORY, DELETE_TAX_RATE, DELETE_ZONE, DISCOUNT_FRAGMENT, DashboardWidgetService, DataModule, DataService, DataTableColumnComponent, DataTableComponent, DateFormInputComponent, DatetimePickerComponent, DatetimePickerService, DefaultInterceptor, DeletionResult, DialogButtonsDirective, DialogComponentOutletComponent, DialogTitleDirective, DisabledDirective, DropdownComponent, DropdownItemDirective, DropdownMenuComponent, DropdownTriggerDirective, DurationPipe, DynamicFormInputComponent, ERROR_RESULT_FRAGMENT, EditNoteDialogComponent, EmptyPlaceholderComponent, EntityInfoComponent, ErrorCode, ExtensionHostComponent, ExtensionHostConfig, ExtensionHostService, ExternalImageDialogComponent, FACET_VALUE_FRAGMENT, FACET_WITH_VALUES_FRAGMENT, FLOAT_CUSTOM_FIELD_FRAGMENT, FULFILLMENT_FRAGMENT, FacetDataService, FacetValueChipComponent, FacetValueFormInputComponent, FacetValueSelectorComponent, FetchAdapter, FileSizePipe, FocalPointControlComponent, FormFieldComponent, FormFieldControlDirective, FormItemComponent, FormattedAddressComponent, GET_ACTIVE_ADMINISTRATOR, GET_ACTIVE_CHANNEL, GET_ADJUSTMENT_OPERATIONS, GET_ADMINISTRATOR, GET_ADMINISTRATORS, GET_ASSET, GET_ASSET_LIST, GET_AVAILABLE_COUNTRIES, GET_CHANNEL, GET_CHANNELS, GET_CLIENT_STATE, GET_COLLECTION, GET_COLLECTION_CONTENTS, GET_COLLECTION_FILTERS, GET_COLLECTION_LIST, GET_COUNTRY, GET_COUNTRY_LIST, GET_CURRENT_USER, GET_CUSTOMER, GET_CUSTOMER_GROUPS, GET_CUSTOMER_GROUP_WITH_CUSTOMERS, GET_CUSTOMER_HISTORY, GET_CUSTOMER_LIST, GET_FACET_LIST, GET_FACET_WITH_VALUES, GET_GLOBAL_SETTINGS, GET_JOBS_BY_ID, GET_JOBS_LIST, GET_JOB_INFO, GET_JOB_QUEUE_LIST, GET_NEWTORK_STATUS, GET_ORDER, GET_ORDERS_LIST, GET_ORDER_HISTORY, GET_ORDER_SUMMARY, GET_PAYMENT_METHOD, GET_PAYMENT_METHOD_LIST, GET_PAYMENT_METHOD_OPERATIONS, GET_PENDING_SEARCH_INDEX_UPDATES, GET_PRODUCT_LIST, GET_PRODUCT_OPTION_GROUP, GET_PRODUCT_OPTION_GROUPS, GET_PRODUCT_SIMPLE, GET_PRODUCT_VARIANT, GET_PRODUCT_VARIANT_LIST, GET_PRODUCT_VARIANT_LIST_SIMPLE, GET_PRODUCT_VARIANT_OPTIONS, GET_PRODUCT_WITH_VARIANTS, GET_PROMOTION, GET_PROMOTION_LIST, GET_ROLE, GET_ROLES, GET_SERVER_CONFIG, GET_SHIPPING_METHOD, GET_SHIPPING_METHOD_LIST, GET_SHIPPING_METHOD_OPERATIONS, GET_TAG, GET_TAG_LIST, GET_TAX_CATEGORIES, GET_TAX_CATEGORY, GET_TAX_RATE, GET_TAX_RATE_LIST, GET_TAX_RATE_LIST_SIMPLE, GET_UI_STATE, GET_USER_STATUS, GET_ZONE, GET_ZONES, GLOBAL_SETTINGS_FRAGMENT, GlobalFlag, HasPermissionPipe, HealthCheckService, HelpTooltipComponent, HistoryEntryDetailComponent, HistoryEntryType, HttpLoaderFactory, I18nService, INT_CUSTOM_FIELD_FRAGMENT, IfDefaultChannelActiveDirective, IfDirectiveBase, IfMultichannelDirective, IfPermissionsDirective, InjectableTranslateMessageFormatCompiler, ItemsPerPageControlsComponent, JOB_INFO_FRAGMENT, JobQueueService, JobState, JsonEditorFormInputComponent, LOCALE_STRING_CUSTOM_FIELD_FRAGMENT, LOG_OUT, LabeledDataComponent, LanguageCode, LanguageSelectorComponent, LinkDialogComponent, LocalStorageService, LocaleBasePipe, LocaleCurrencyNamePipe, LocaleCurrencyPipe, LocaleDatePipe, LocaleLanguageNamePipe, LocaleRegionNamePipe, LogicalOperator, MODIFY_ORDER, MOVE_COLLECTION, MainNavComponent, ManageTagsDialogComponent, ModalDialogComponent, ModalService, NavBuilderService, NotificationComponent, NotificationService, NumberFormInputComponent, ORDER_ADDRESS_FRAGMENT, ORDER_DETAIL_FRAGMENT, ORDER_FRAGMENT, ORDER_LINE_FRAGMENT, ObjectTreeComponent, OmitTypenameLink, OrderDataService, OrderStateLabelComponent, OverlayHostComponent, OverlayHostService, PAYMENT_METHOD_FRAGMENT, PRODUCT_DETAIL_FRAGMENT, PRODUCT_OPTION_FRAGMENT, PRODUCT_OPTION_GROUP_FRAGMENT, PRODUCT_OPTION_GROUP_WITH_OPTIONS_FRAGMENT, PRODUCT_SELECTOR_SEARCH, PRODUCT_VARIANT_FRAGMENT, PROMOTION_FRAGMENT, PaginationControlsComponent, PasswordFormInputComponent, PercentageSuffixInputComponent, Permission, ProductDataService, ProductSelectorComponent, ProductSelectorFormInputComponent, PromotionDataService, ProsemirrorService, QueryResult, REFUND_FRAGMENT, REFUND_ORDER, REINDEX, RELATION_CUSTOM_FIELD_FRAGMENT, REMOVE_CUSTOMERS_FROM_GROUP, REMOVE_MEMBERS_FROM_ZONE, REMOVE_OPTION_GROUP_FROM_PRODUCT, REMOVE_PRODUCTS_FROM_CHANNEL, REMOVE_VARIANTS_FROM_CHANNEL, REQUEST_COMPLETED, REQUEST_STARTED, ROLE_FRAGMENT, RUN_PENDING_SEARCH_INDEX_UPDATES, RelationAssetInputComponent, RelationCardComponent, RelationCardDetailDirective, RelationCardPreviewDirective, RelationCustomerInputComponent, RelationFormInputComponent, RelationProductInputComponent, RelationProductVariantInputComponent, RelationSelectorDialogComponent, RichTextEditorComponent, RichTextFormInputComponent, SEARCH_PRODUCTS, SETTLE_PAYMENT, SETTLE_REFUND, SET_ACTIVE_CHANNEL, SET_AS_LOGGED_IN, SET_AS_LOGGED_OUT, SET_CONTENT_LANGUAGE, SET_DISPLAY_UI_EXTENSION_POINTS, SET_UI_LANGUAGE_AND_LOCALE, SET_UI_LOCALE, SET_UI_THEME, SHIPPING_METHOD_FRAGMENT, STRING_CUSTOM_FIELD_FRAGMENT, SelectFormInputComponent, SelectToggleComponent, SentenceCasePipe, ServerConfigService, SettingsDataService, SharedModule, ShippingMethodDataService, SimpleDialogComponent, SingleSearchSelectionModel, SingleSearchSelectionModelFactory, SortOrder, SortPipe, StateI18nTokenPipe, StatusBadgeComponent, StockMovementType, StringToColorPipe, TAG_FRAGMENT, TAX_CATEGORY_FRAGMENT, TAX_RATE_FRAGMENT, TEST_ELIGIBLE_SHIPPING_METHODS, TEST_SHIPPING_METHOD, TEXT_CUSTOM_FIELD_FRAGMENT, TRANSITION_FULFILLMENT_TO_STATE, TRANSITION_ORDER_TO_STATE, TRANSITION_PAYMENT_TO_STATE, TabbedCustomFieldsComponent, TableRowActionComponent, TagSelectorComponent, TextFormInputComponent, TextareaFormInputComponent, ThemeSwitcherComponent, TimeAgoPipe, TimelineEntryComponent, TitleInputComponent, UPDATE_ACTIVE_ADMINISTRATOR, UPDATE_ADMINISTRATOR, UPDATE_ASSET, UPDATE_CHANNEL, UPDATE_COLLECTION, UPDATE_COUNTRY, UPDATE_CUSTOMER, UPDATE_CUSTOMER_ADDRESS, UPDATE_CUSTOMER_GROUP, UPDATE_CUSTOMER_NOTE, UPDATE_FACET, UPDATE_FACET_VALUES, UPDATE_GLOBAL_SETTINGS, UPDATE_ORDER_CUSTOM_FIELDS, UPDATE_ORDER_NOTE, UPDATE_PAYMENT_METHOD, UPDATE_PRODUCT, UPDATE_PRODUCT_OPTION, UPDATE_PRODUCT_OPTION_GROUP, UPDATE_PRODUCT_VARIANTS, UPDATE_PROMOTION, UPDATE_ROLE, UPDATE_SHIPPING_METHOD, UPDATE_TAG, UPDATE_TAX_CATEGORY, UPDATE_TAX_RATE, UPDATE_USER_CHANNELS, UPDATE_ZONE, USER_STATUS_FRAGMENT, UiExtensionPointComponent, UiLanguageSwitcherDialogComponent, UserMenuComponent, ZONE_FRAGMENT, addActionBarItem, addCustomFields, addNavMenuItem, addNavMenuSection, blockQuoteRule, buildInputRules, buildKeymap, buildMenuItems, bulletListRule, canInsert, clientResolvers, codeBlockRule, configurableDefinitionToInstance, configurableOperationValueIsValid, createApollo, createResolveData, createUpdatedTranslatable, dayOfWeekIndex, defaultFormInputs, detailBreadcrumb, encodeConfigArgValue, findTranslation, flattenFacetValues, getAppConfig, getClientDefaults, getConfigArgValue, getDefaultConfigArgValue, getDefaultUiLanguage, getDefaultUiLocale, getLocales, getMarkRange, getServerLocation, headingRule, hostExternalFrame, initializeServerConfigService, insertImageItem, interpolateDescription, result as introspectionResult, isEntityCreateOrUpdateMutation, jsonValidator, linkItem, linkSelectPlugin, loadAppConfig, markActive, orderedListRule, registerCustomDetailComponent, registerCustomFieldComponent, registerDashboardWidget, registerDefaultFormInputs, registerFormInputComponent, removeReadonlyCustomFields, setDashboardWidgetLayout, stringToColor, toConfigurableOperationInput, transformRelationCustomFieldInputs, unicodePatternValidator, weekDayNames, ɵ1, ɵ10, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9 };
14193
15717
  //# sourceMappingURL=vendure-admin-ui-core.js.map