@vendure/admin-ui 1.5.1 → 1.6.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 (124) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +206 -172
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +1790 -1300
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-dashboard.umd.js +3 -3
  6. package/bundles/vendure-admin-ui-dashboard.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-login.umd.js +2 -2
  8. package/bundles/vendure-admin-ui-login.umd.js.map +1 -1
  9. package/bundles/vendure-admin-ui-marketing.umd.js +1 -1
  10. package/bundles/vendure-admin-ui-marketing.umd.js.map +1 -1
  11. package/bundles/vendure-admin-ui-order.umd.js +3 -3
  12. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  13. package/catalog/components/collection-contents/collection-contents.component.d.ts +7 -2
  14. package/catalog/components/collection-detail/collection-detail.component.d.ts +12 -4
  15. package/catalog/components/collection-list/collection-list.component.d.ts +2 -0
  16. package/catalog/components/collection-tree/array-to-tree.d.ts +1 -1
  17. package/catalog/components/collection-tree/collection-tree-node.component.d.ts +5 -1
  18. package/catalog/components/collection-tree/collection-tree.component.d.ts +1 -0
  19. package/catalog/providers/product-detail/product-detail.service.d.ts +2 -2
  20. package/catalog/public_api.d.ts +0 -1
  21. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  22. package/core/common/generated-types.d.ts +32 -3
  23. package/core/common/utilities/selection-manager.d.ts +23 -0
  24. package/core/common/version.d.ts +1 -1
  25. package/core/components/app-shell/app-shell.component.d.ts +1 -0
  26. package/core/data/definitions/collection-definitions.d.ts +1 -0
  27. package/core/data/providers/collection-data.service.d.ts +6 -2
  28. package/core/providers/local-storage/local-storage.service.d.ts +1 -0
  29. package/core/public_api.d.ts +5 -0
  30. package/core/shared/components/asset-gallery/asset-gallery.component.d.ts +21 -6
  31. package/core/shared/components/configurable-input/configurable-input.component.d.ts +7 -2
  32. package/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.d.ts +35 -0
  33. package/{catalog → core/shared}/components/product-search-input/product-search-input.component.d.ts +1 -1
  34. package/core/shared/components/select-toggle/select-toggle.component.d.ts +1 -0
  35. package/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.d.ts +25 -0
  36. package/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.d.ts +20 -0
  37. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +3 -1
  38. package/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.d.ts +5 -2
  39. package/core/vendure-admin-ui-core.metadata.json +1 -1
  40. package/dashboard/vendure-admin-ui-dashboard.metadata.json +1 -1
  41. package/esm2015/catalog/catalog.module.js +1 -3
  42. package/esm2015/catalog/components/assets/assets.component.js +1 -1
  43. package/esm2015/catalog/components/collection-contents/collection-contents.component.js +51 -14
  44. package/esm2015/catalog/components/collection-detail/collection-detail.component.js +67 -29
  45. package/esm2015/catalog/components/collection-list/collection-list.component.js +30 -4
  46. package/esm2015/catalog/components/collection-tree/array-to-tree.js +3 -3
  47. package/esm2015/catalog/components/collection-tree/collection-tree-node.component.js +27 -4
  48. package/esm2015/catalog/components/collection-tree/collection-tree.component.js +4 -2
  49. package/esm2015/catalog/components/product-detail/product-detail.component.js +1 -1
  50. package/esm2015/catalog/components/product-list/product-list.component.js +3 -3
  51. package/esm2015/catalog/components/product-variants-list/product-variants-list.component.js +1 -1
  52. package/esm2015/catalog/public_api.js +1 -2
  53. package/esm2015/core/app.component.module.js +1 -1
  54. package/esm2015/core/common/base-detail.component.js +1 -1
  55. package/esm2015/core/common/deactivate-aware.js +1 -1
  56. package/esm2015/core/common/generated-types.js +1 -1
  57. package/esm2015/core/common/introspection-result.js +255 -189
  58. package/esm2015/core/common/utilities/configurable-operation-utils.js +22 -4
  59. package/esm2015/core/common/utilities/selection-manager.js +64 -0
  60. package/esm2015/core/common/version.js +2 -2
  61. package/esm2015/core/components/app-shell/app-shell.component.js +4 -3
  62. package/esm2015/core/core.module.js +1 -1
  63. package/esm2015/core/data/definitions/collection-definitions.js +18 -1
  64. package/esm2015/core/data/definitions/order-definitions.js +431 -430
  65. package/esm2015/core/data/definitions/shared-definitions.js +29 -28
  66. package/esm2015/core/data/providers/collection-data.service.js +5 -2
  67. package/esm2015/core/providers/local-storage/local-storage.service.js +1 -1
  68. package/esm2015/core/public_api.js +6 -1
  69. package/esm2015/core/shared/components/asset-gallery/asset-gallery.component.js +24 -42
  70. package/esm2015/core/shared/components/asset-preview/asset-preview.component.js +4 -4
  71. package/esm2015/core/shared/components/configurable-input/configurable-input.component.js +13 -3
  72. package/esm2015/core/shared/components/help-tooltip/help-tooltip.component.js +1 -1
  73. package/esm2015/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.js +129 -0
  74. package/esm2015/core/shared/components/product-search-input/product-search-input.component.js +104 -0
  75. package/esm2015/core/shared/components/rich-text-editor/rich-text-editor.component.js +1 -1
  76. package/esm2015/core/shared/components/select-toggle/select-toggle.component.js +5 -3
  77. package/esm2015/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.js +45 -0
  78. package/esm2015/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.js +53 -0
  79. package/esm2015/core/shared/dynamic-form-inputs/register-dynamic-input-components.js +5 -1
  80. package/esm2015/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.js +8 -7
  81. package/esm2015/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.js +1 -1
  82. package/esm2015/core/shared/shared.module.js +9 -1
  83. package/esm2015/dashboard/components/dashboard/dashboard.component.js +1 -1
  84. package/esm2015/dashboard/components/dashboard-widget/dashboard-widget.component.js +2 -2
  85. package/esm2015/dashboard/widgets/order-summary-widget/order-summary-widget.component.js +1 -1
  86. package/esm2015/login/components/login/login.component.js +3 -3
  87. package/esm2015/marketing/components/promotion-detail/promotion-detail.component.js +2 -2
  88. package/esm2015/order/components/order-editor/order-editor.component.js +1 -1
  89. package/esm2015/order/components/order-list/order-list.component.js +2 -2
  90. package/esm2015/order/components/order-table/order-table.component.js +1 -1
  91. package/fesm2015/vendure-admin-ui-catalog.js +181 -157
  92. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  93. package/fesm2015/vendure-admin-ui-core.js +2611 -2129
  94. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  95. package/fesm2015/vendure-admin-ui-dashboard.js +3 -3
  96. package/fesm2015/vendure-admin-ui-dashboard.js.map +1 -1
  97. package/fesm2015/vendure-admin-ui-login.js +2 -2
  98. package/fesm2015/vendure-admin-ui-login.js.map +1 -1
  99. package/fesm2015/vendure-admin-ui-marketing.js +1 -1
  100. package/fesm2015/vendure-admin-ui-marketing.js.map +1 -1
  101. package/fesm2015/vendure-admin-ui-order.js +3 -3
  102. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  103. package/login/vendure-admin-ui-login.metadata.json +1 -1
  104. package/marketing/vendure-admin-ui-marketing.metadata.json +1 -1
  105. package/order/vendure-admin-ui-order.metadata.json +1 -1
  106. package/package.json +5 -5
  107. package/static/i18n-messages/cs.json +9 -0
  108. package/static/i18n-messages/de.json +9 -0
  109. package/static/i18n-messages/en.json +10 -1
  110. package/static/i18n-messages/es.json +9 -0
  111. package/static/i18n-messages/fr.json +9 -0
  112. package/static/i18n-messages/it.json +9 -0
  113. package/static/i18n-messages/pl.json +9 -0
  114. package/static/i18n-messages/pt_BR.json +9 -0
  115. package/static/i18n-messages/pt_PT.json +9 -0
  116. package/static/i18n-messages/ru.json +9 -0
  117. package/static/i18n-messages/uk.json +9 -0
  118. package/static/i18n-messages/zh_Hans.json +9 -0
  119. package/static/i18n-messages/zh_Hant.json +9 -0
  120. package/static/styles/global/_forms.scss +4 -5
  121. package/static/styles/global/_overrides.scss +10 -0
  122. package/static/styles/theme/default.scss +13 -1
  123. package/static/theme.min.css +1 -1
  124. package/esm2015/catalog/components/product-search-input/product-search-input.component.js +0 -104
@@ -361,13 +361,13 @@
361
361
  var UPDATE_ADMINISTRATOR = apolloAngular.gql(templateObject_7$9 || (templateObject_7$9 = __makeTemplateObject(["\n mutation UpdateAdministrator($input: UpdateAdministratorInput!) {\n updateAdministrator(input: $input) {\n ...Administrator\n }\n }\n ", "\n"], ["\n mutation UpdateAdministrator($input: UpdateAdministratorInput!) {\n updateAdministrator(input: $input) {\n ...Administrator\n }\n }\n ", "\n"])), ADMINISTRATOR_FRAGMENT);
362
362
  var UPDATE_ACTIVE_ADMINISTRATOR = apolloAngular.gql(templateObject_8$8 || (templateObject_8$8 = __makeTemplateObject(["\n mutation UpdateActiveAdministrator($input: UpdateActiveAdministratorInput!) {\n updateActiveAdministrator(input: $input) {\n ...Administrator\n }\n }\n ", "\n"], ["\n mutation UpdateActiveAdministrator($input: UpdateActiveAdministratorInput!) {\n updateActiveAdministrator(input: $input) {\n ...Administrator\n }\n }\n ", "\n"])), ADMINISTRATOR_FRAGMENT);
363
363
  var DELETE_ADMINISTRATOR = apolloAngular.gql(templateObject_9$8 || (templateObject_9$8 = __makeTemplateObject(["\n mutation DeleteAdministrator($id: ID!) {\n deleteAdministrator(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteAdministrator($id: ID!) {\n deleteAdministrator(id: $id) {\n result\n message\n }\n }\n"])));
364
- var GET_ROLES = apolloAngular.gql(templateObject_10$6 || (templateObject_10$6 = __makeTemplateObject(["\n query GetRoles($options: RoleListOptions) {\n roles(options: $options) {\n items {\n ...Role\n }\n totalItems\n }\n }\n ", "\n"], ["\n query GetRoles($options: RoleListOptions) {\n roles(options: $options) {\n items {\n ...Role\n }\n totalItems\n }\n }\n ", "\n"])), ROLE_FRAGMENT);
364
+ var GET_ROLES = apolloAngular.gql(templateObject_10$7 || (templateObject_10$7 = __makeTemplateObject(["\n query GetRoles($options: RoleListOptions) {\n roles(options: $options) {\n items {\n ...Role\n }\n totalItems\n }\n }\n ", "\n"], ["\n query GetRoles($options: RoleListOptions) {\n roles(options: $options) {\n items {\n ...Role\n }\n totalItems\n }\n }\n ", "\n"])), ROLE_FRAGMENT);
365
365
  var GET_ROLE = apolloAngular.gql(templateObject_11$5 || (templateObject_11$5 = __makeTemplateObject(["\n query GetRole($id: ID!) {\n role(id: $id) {\n ...Role\n }\n }\n ", "\n"], ["\n query GetRole($id: ID!) {\n role(id: $id) {\n ...Role\n }\n }\n ", "\n"])), ROLE_FRAGMENT);
366
366
  var CREATE_ROLE = apolloAngular.gql(templateObject_12$5 || (templateObject_12$5 = __makeTemplateObject(["\n mutation CreateRole($input: CreateRoleInput!) {\n createRole(input: $input) {\n ...Role\n }\n }\n ", "\n"], ["\n mutation CreateRole($input: CreateRoleInput!) {\n createRole(input: $input) {\n ...Role\n }\n }\n ", "\n"])), ROLE_FRAGMENT);
367
367
  var UPDATE_ROLE = apolloAngular.gql(templateObject_13$5 || (templateObject_13$5 = __makeTemplateObject(["\n mutation UpdateRole($input: UpdateRoleInput!) {\n updateRole(input: $input) {\n ...Role\n }\n }\n ", "\n"], ["\n mutation UpdateRole($input: UpdateRoleInput!) {\n updateRole(input: $input) {\n ...Role\n }\n }\n ", "\n"])), ROLE_FRAGMENT);
368
368
  var DELETE_ROLE = apolloAngular.gql(templateObject_14$5 || (templateObject_14$5 = __makeTemplateObject(["\n mutation DeleteRole($id: ID!) {\n deleteRole(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteRole($id: ID!) {\n deleteRole(id: $id) {\n result\n message\n }\n }\n"])));
369
369
  var ASSIGN_ROLE_TO_ADMINISTRATOR = apolloAngular.gql(templateObject_15$5 || (templateObject_15$5 = __makeTemplateObject(["\n mutation AssignRoleToAdministrator($administratorId: ID!, $roleId: ID!) {\n assignRoleToAdministrator(administratorId: $administratorId, roleId: $roleId) {\n ...Administrator\n }\n }\n ", "\n"], ["\n mutation AssignRoleToAdministrator($administratorId: ID!, $roleId: ID!) {\n assignRoleToAdministrator(administratorId: $administratorId, roleId: $roleId) {\n ...Administrator\n }\n }\n ", "\n"])), ADMINISTRATOR_FRAGMENT);
370
- var templateObject_1$b, templateObject_2$b, templateObject_3$b, templateObject_4$a, templateObject_5$9, templateObject_6$9, templateObject_7$9, templateObject_8$8, templateObject_9$8, templateObject_10$6, templateObject_11$5, templateObject_12$5, templateObject_13$5, templateObject_14$5, templateObject_15$5;
370
+ var templateObject_1$b, templateObject_2$b, templateObject_3$b, templateObject_4$a, templateObject_5$9, templateObject_6$9, templateObject_7$9, templateObject_8$8, templateObject_9$8, templateObject_10$7, templateObject_11$5, templateObject_12$5, templateObject_13$5, templateObject_14$5, templateObject_15$5;
371
371
 
372
372
  var AdministratorDataService = /** @class */ (function () {
373
373
  function AdministratorDataService(baseDataService) {
@@ -429,7 +429,7 @@
429
429
  }());
430
430
 
431
431
  var CONFIGURABLE_OPERATION_FRAGMENT = apolloAngular.gql(templateObject_1$a || (templateObject_1$a = __makeTemplateObject(["\n fragment ConfigurableOperation on ConfigurableOperation {\n args {\n name\n value\n }\n code\n }\n"], ["\n fragment ConfigurableOperation on ConfigurableOperation {\n args {\n name\n value\n }\n code\n }\n"])));
432
- var CONFIGURABLE_OPERATION_DEF_FRAGMENT = apolloAngular.gql(templateObject_2$a || (templateObject_2$a = __makeTemplateObject(["\n fragment ConfigurableOperationDef on ConfigurableOperationDefinition {\n args {\n name\n type\n required\n defaultValue\n list\n ui\n label\n }\n code\n description\n }\n"], ["\n fragment ConfigurableOperationDef on ConfigurableOperationDefinition {\n args {\n name\n type\n required\n defaultValue\n list\n ui\n label\n }\n code\n description\n }\n"])));
432
+ var CONFIGURABLE_OPERATION_DEF_FRAGMENT = apolloAngular.gql(templateObject_2$a || (templateObject_2$a = __makeTemplateObject(["\n fragment ConfigurableOperationDef on ConfigurableOperationDefinition {\n args {\n name\n type\n required\n defaultValue\n list\n ui\n label\n description\n }\n code\n description\n }\n"], ["\n fragment ConfigurableOperationDef on ConfigurableOperationDefinition {\n args {\n name\n type\n required\n defaultValue\n list\n ui\n label\n description\n }\n code\n description\n }\n"])));
433
433
  var ERROR_RESULT_FRAGMENT = apolloAngular.gql(templateObject_3$a || (templateObject_3$a = __makeTemplateObject(["\n fragment ErrorResult on ErrorResult {\n errorCode\n message\n }\n"], ["\n fragment ErrorResult on ErrorResult {\n errorCode\n message\n }\n"])));
434
434
  var templateObject_1$a, templateObject_2$a, templateObject_3$a;
435
435
 
@@ -544,14 +544,14 @@
544
544
  var SET_UI_LOCALE = apolloAngular.gql(templateObject_7$8 || (templateObject_7$8 = __makeTemplateObject(["\n mutation SetUiLocale($locale: String) {\n setUiLocale(locale: $locale) @client\n }\n"], ["\n mutation SetUiLocale($locale: String) {\n setUiLocale(locale: $locale) @client\n }\n"])));
545
545
  var SET_DISPLAY_UI_EXTENSION_POINTS = apolloAngular.gql(templateObject_8$7 || (templateObject_8$7 = __makeTemplateObject(["\n mutation SetDisplayUiExtensionPoints($display: Boolean!) {\n setDisplayUiExtensionPoints(display: $display) @client\n }\n"], ["\n mutation SetDisplayUiExtensionPoints($display: Boolean!) {\n setDisplayUiExtensionPoints(display: $display) @client\n }\n"])));
546
546
  var SET_CONTENT_LANGUAGE = apolloAngular.gql(templateObject_9$7 || (templateObject_9$7 = __makeTemplateObject(["\n mutation SetContentLanguage($languageCode: LanguageCode!) {\n setContentLanguage(languageCode: $languageCode) @client\n }\n"], ["\n mutation SetContentLanguage($languageCode: LanguageCode!) {\n setContentLanguage(languageCode: $languageCode) @client\n }\n"])));
547
- var SET_UI_THEME = apolloAngular.gql(templateObject_10$5 || (templateObject_10$5 = __makeTemplateObject(["\n mutation SetUiTheme($theme: String!) {\n setUiTheme(theme: $theme) @client\n }\n"], ["\n mutation SetUiTheme($theme: String!) {\n setUiTheme(theme: $theme) @client\n }\n"])));
547
+ var SET_UI_THEME = apolloAngular.gql(templateObject_10$6 || (templateObject_10$6 = __makeTemplateObject(["\n mutation SetUiTheme($theme: String!) {\n setUiTheme(theme: $theme) @client\n }\n"], ["\n mutation SetUiTheme($theme: String!) {\n setUiTheme(theme: $theme) @client\n }\n"])));
548
548
  var GET_NEWTORK_STATUS = apolloAngular.gql(templateObject_11$4 || (templateObject_11$4 = __makeTemplateObject(["\n query GetNetworkStatus {\n networkStatus @client {\n inFlightRequests\n }\n }\n"], ["\n query GetNetworkStatus {\n networkStatus @client {\n inFlightRequests\n }\n }\n"])));
549
549
  var GET_USER_STATUS = apolloAngular.gql(templateObject_12$4 || (templateObject_12$4 = __makeTemplateObject(["\n query GetUserStatus {\n userStatus @client {\n ...UserStatus\n }\n }\n ", "\n"], ["\n query GetUserStatus {\n userStatus @client {\n ...UserStatus\n }\n }\n ", "\n"])), USER_STATUS_FRAGMENT);
550
550
  var GET_UI_STATE = apolloAngular.gql(templateObject_13$4 || (templateObject_13$4 = __makeTemplateObject(["\n query GetUiState {\n uiState @client {\n language\n locale\n contentLanguage\n theme\n displayUiExtensionPoints\n }\n }\n"], ["\n query GetUiState {\n uiState @client {\n language\n locale\n contentLanguage\n theme\n displayUiExtensionPoints\n }\n }\n"])));
551
551
  var GET_CLIENT_STATE = apolloAngular.gql(templateObject_14$4 || (templateObject_14$4 = __makeTemplateObject(["\n query GetClientState {\n networkStatus @client {\n inFlightRequests\n }\n userStatus @client {\n ...UserStatus\n }\n uiState @client {\n language\n locale\n contentLanguage\n theme\n displayUiExtensionPoints\n }\n }\n ", "\n"], ["\n query GetClientState {\n networkStatus @client {\n inFlightRequests\n }\n userStatus @client {\n ...UserStatus\n }\n uiState @client {\n language\n locale\n contentLanguage\n theme\n displayUiExtensionPoints\n }\n }\n ", "\n"])), USER_STATUS_FRAGMENT);
552
552
  var SET_ACTIVE_CHANNEL = apolloAngular.gql(templateObject_15$4 || (templateObject_15$4 = __makeTemplateObject(["\n mutation SetActiveChannel($channelId: ID!) {\n setActiveChannel(channelId: $channelId) @client {\n ...UserStatus\n }\n }\n ", "\n"], ["\n mutation SetActiveChannel($channelId: ID!) {\n setActiveChannel(channelId: $channelId) @client {\n ...UserStatus\n }\n }\n ", "\n"])), USER_STATUS_FRAGMENT);
553
553
  var UPDATE_USER_CHANNELS = apolloAngular.gql(templateObject_16$4 || (templateObject_16$4 = __makeTemplateObject(["\n mutation UpdateUserChannels($channels: [CurrentUserChannelInput!]!) {\n updateUserChannels(channels: $channels) @client {\n ...UserStatus\n }\n }\n ", "\n"], ["\n mutation UpdateUserChannels($channels: [CurrentUserChannelInput!]!) {\n updateUserChannels(channels: $channels) @client {\n ...UserStatus\n }\n }\n ", "\n"])), USER_STATUS_FRAGMENT);
554
- var templateObject_1$8, templateObject_2$8, templateObject_3$8, templateObject_4$8, templateObject_5$8, templateObject_6$8, templateObject_7$8, templateObject_8$7, templateObject_9$7, templateObject_10$5, templateObject_11$4, templateObject_12$4, templateObject_13$4, templateObject_14$4, templateObject_15$4, templateObject_16$4;
554
+ var templateObject_1$8, templateObject_2$8, templateObject_3$8, templateObject_4$8, templateObject_5$8, templateObject_6$8, templateObject_7$8, templateObject_8$7, templateObject_9$7, templateObject_10$6, templateObject_11$4, templateObject_12$4, templateObject_13$4, templateObject_14$4, templateObject_15$4, templateObject_16$4;
555
555
 
556
556
  /**
557
557
  * @description
@@ -650,7 +650,7 @@
650
650
  var DELETE_COUNTRY = apolloAngular.gql(templateObject_7$7 || (templateObject_7$7 = __makeTemplateObject(["\n mutation DeleteCountry($id: ID!) {\n deleteCountry(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteCountry($id: ID!) {\n deleteCountry(id: $id) {\n result\n message\n }\n }\n"])));
651
651
  var ZONE_FRAGMENT = apolloAngular.gql(templateObject_8$6 || (templateObject_8$6 = __makeTemplateObject(["\n fragment Zone on Zone {\n id\n createdAt\n updatedAt\n name\n members {\n ...Country\n }\n }\n ", "\n"], ["\n fragment Zone on Zone {\n id\n createdAt\n updatedAt\n name\n members {\n ...Country\n }\n }\n ", "\n"])), COUNTRY_FRAGMENT);
652
652
  var GET_ZONES = apolloAngular.gql(templateObject_9$6 || (templateObject_9$6 = __makeTemplateObject(["\n query GetZones {\n zones {\n ...Zone\n members {\n createdAt\n updatedAt\n id\n name\n code\n enabled\n }\n }\n }\n ", "\n"], ["\n query GetZones {\n zones {\n ...Zone\n members {\n createdAt\n updatedAt\n id\n name\n code\n enabled\n }\n }\n }\n ", "\n"])), ZONE_FRAGMENT);
653
- var GET_ZONE = apolloAngular.gql(templateObject_10$4 || (templateObject_10$4 = __makeTemplateObject(["\n query GetZone($id: ID!) {\n zone(id: $id) {\n ...Zone\n }\n }\n ", "\n"], ["\n query GetZone($id: ID!) {\n zone(id: $id) {\n ...Zone\n }\n }\n ", "\n"])), ZONE_FRAGMENT);
653
+ var GET_ZONE = apolloAngular.gql(templateObject_10$5 || (templateObject_10$5 = __makeTemplateObject(["\n query GetZone($id: ID!) {\n zone(id: $id) {\n ...Zone\n }\n }\n ", "\n"], ["\n query GetZone($id: ID!) {\n zone(id: $id) {\n ...Zone\n }\n }\n ", "\n"])), ZONE_FRAGMENT);
654
654
  var CREATE_ZONE = apolloAngular.gql(templateObject_11$3 || (templateObject_11$3 = __makeTemplateObject(["\n mutation CreateZone($input: CreateZoneInput!) {\n createZone(input: $input) {\n ...Zone\n }\n }\n ", "\n"], ["\n mutation CreateZone($input: CreateZoneInput!) {\n createZone(input: $input) {\n ...Zone\n }\n }\n ", "\n"])), ZONE_FRAGMENT);
655
655
  var UPDATE_ZONE = apolloAngular.gql(templateObject_12$3 || (templateObject_12$3 = __makeTemplateObject(["\n mutation UpdateZone($input: UpdateZoneInput!) {\n updateZone(input: $input) {\n ...Zone\n }\n }\n ", "\n"], ["\n mutation UpdateZone($input: UpdateZoneInput!) {\n updateZone(input: $input) {\n ...Zone\n }\n }\n ", "\n"])), ZONE_FRAGMENT);
656
656
  var DELETE_ZONE = apolloAngular.gql(templateObject_13$3 || (templateObject_13$3 = __makeTemplateObject(["\n mutation DeleteZone($id: ID!) {\n deleteZone(id: $id) {\n message\n result\n }\n }\n"], ["\n mutation DeleteZone($id: ID!) {\n deleteZone(id: $id) {\n message\n result\n }\n }\n"])));
@@ -706,7 +706,7 @@
706
706
  var REINDEX = apolloAngular.gql(templateObject_63 || (templateObject_63 = __makeTemplateObject(["\n mutation Reindex {\n reindex {\n ...JobInfo\n }\n }\n ", "\n"], ["\n mutation Reindex {\n reindex {\n ...JobInfo\n }\n }\n ", "\n"])), JOB_INFO_FRAGMENT);
707
707
  var GET_PENDING_SEARCH_INDEX_UPDATES = apolloAngular.gql(templateObject_64 || (templateObject_64 = __makeTemplateObject(["\n query GetPendingSearchIndexUpdates {\n pendingSearchIndexUpdates\n }\n"], ["\n query GetPendingSearchIndexUpdates {\n pendingSearchIndexUpdates\n }\n"])));
708
708
  var RUN_PENDING_SEARCH_INDEX_UPDATES = apolloAngular.gql(templateObject_65 || (templateObject_65 = __makeTemplateObject(["\n mutation RunPendingSearchIndexUpdates {\n runPendingSearchIndexUpdates {\n success\n }\n }\n"], ["\n mutation RunPendingSearchIndexUpdates {\n runPendingSearchIndexUpdates {\n success\n }\n }\n"])));
709
- var templateObject_1$7, templateObject_2$7, templateObject_3$7, templateObject_4$7, templateObject_5$7, templateObject_6$7, templateObject_7$7, templateObject_8$6, templateObject_9$6, templateObject_10$4, templateObject_11$3, templateObject_12$3, templateObject_13$3, templateObject_14$3, templateObject_15$3, templateObject_16$3, templateObject_17$3, templateObject_18$3, templateObject_19$3, templateObject_20$3, templateObject_21$3, templateObject_22$3, templateObject_23$2, templateObject_24$2, templateObject_25$2, templateObject_26$1, templateObject_27$1, templateObject_28$1, templateObject_29$1, templateObject_30$1, templateObject_31$1, templateObject_32$1, templateObject_33$1, templateObject_34$1, templateObject_35$1, templateObject_36$1, templateObject_37$1, templateObject_38$1, templateObject_39$1, templateObject_40$1, templateObject_41$1, templateObject_42$1, templateObject_43$1, templateObject_44$1, templateObject_45, templateObject_46, templateObject_47, templateObject_48, templateObject_49, templateObject_50, templateObject_51, templateObject_52, templateObject_53, templateObject_54, templateObject_55, templateObject_56, templateObject_57, templateObject_58, templateObject_59, templateObject_60, templateObject_61, templateObject_62, templateObject_63, templateObject_64, templateObject_65;
709
+ var templateObject_1$7, templateObject_2$7, templateObject_3$7, templateObject_4$7, templateObject_5$7, templateObject_6$7, templateObject_7$7, templateObject_8$6, templateObject_9$6, templateObject_10$5, templateObject_11$3, templateObject_12$3, templateObject_13$3, templateObject_14$3, templateObject_15$3, templateObject_16$3, templateObject_17$3, templateObject_18$3, templateObject_19$3, templateObject_20$3, templateObject_21$3, templateObject_22$3, templateObject_23$2, templateObject_24$2, templateObject_25$2, templateObject_26$1, templateObject_27$1, templateObject_28$1, templateObject_29$1, templateObject_30$1, templateObject_31$1, templateObject_32$1, templateObject_33$1, templateObject_34$1, templateObject_35$1, templateObject_36$1, templateObject_37$1, templateObject_38$1, templateObject_39$1, templateObject_40$1, templateObject_41$1, templateObject_42$1, templateObject_43$1, templateObject_44$1, templateObject_45, templateObject_46, templateObject_47, templateObject_48, templateObject_49, templateObject_50, templateObject_51, templateObject_52, templateObject_53, templateObject_54, templateObject_55, templateObject_56, templateObject_57, templateObject_58, templateObject_59, templateObject_60, templateObject_61, templateObject_62, templateObject_63, templateObject_64, templateObject_65;
710
710
 
711
711
  function initializeServerConfigService(serverConfigService) {
712
712
  return serverConfigService.init();
@@ -1238,7 +1238,7 @@
1238
1238
  var PRODUCT_OPTION_GROUP_WITH_OPTIONS_FRAGMENT = apolloAngular.gql(templateObject_7$6 || (templateObject_7$6 = __makeTemplateObject(["\n fragment ProductOptionGroupWithOptions on ProductOptionGroup {\n id\n createdAt\n updatedAt\n languageCode\n code\n name\n translations {\n id\n name\n }\n options {\n id\n languageCode\n name\n code\n translations {\n name\n }\n }\n }\n"], ["\n fragment ProductOptionGroupWithOptions on ProductOptionGroup {\n id\n createdAt\n updatedAt\n languageCode\n code\n name\n translations {\n id\n name\n }\n options {\n id\n languageCode\n name\n code\n translations {\n name\n }\n }\n }\n"])));
1239
1239
  var UPDATE_PRODUCT = apolloAngular.gql(templateObject_8$5 || (templateObject_8$5 = __makeTemplateObject(["\n mutation UpdateProduct($input: UpdateProductInput!, $variantListOptions: ProductVariantListOptions) {\n updateProduct(input: $input) {\n ...ProductDetail\n variantList(options: $variantListOptions) {\n items {\n ...ProductVariant\n }\n totalItems\n }\n }\n }\n ", "\n ", "\n"], ["\n mutation UpdateProduct($input: UpdateProductInput!, $variantListOptions: ProductVariantListOptions) {\n updateProduct(input: $input) {\n ...ProductDetail\n variantList(options: $variantListOptions) {\n items {\n ...ProductVariant\n }\n totalItems\n }\n }\n }\n ", "\n ", "\n"])), PRODUCT_DETAIL_FRAGMENT, PRODUCT_VARIANT_FRAGMENT);
1240
1240
  var CREATE_PRODUCT = apolloAngular.gql(templateObject_9$5 || (templateObject_9$5 = __makeTemplateObject(["\n mutation CreateProduct($input: CreateProductInput!, $variantListOptions: ProductVariantListOptions) {\n createProduct(input: $input) {\n ...ProductDetail\n variantList(options: $variantListOptions) {\n items {\n ...ProductVariant\n }\n totalItems\n }\n }\n }\n ", "\n ", "\n"], ["\n mutation CreateProduct($input: CreateProductInput!, $variantListOptions: ProductVariantListOptions) {\n createProduct(input: $input) {\n ...ProductDetail\n variantList(options: $variantListOptions) {\n items {\n ...ProductVariant\n }\n totalItems\n }\n }\n }\n ", "\n ", "\n"])), PRODUCT_DETAIL_FRAGMENT, PRODUCT_VARIANT_FRAGMENT);
1241
- var DELETE_PRODUCT = apolloAngular.gql(templateObject_10$3 || (templateObject_10$3 = __makeTemplateObject(["\n mutation DeleteProduct($id: ID!) {\n deleteProduct(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteProduct($id: ID!) {\n deleteProduct(id: $id) {\n result\n message\n }\n }\n"])));
1241
+ var DELETE_PRODUCT = apolloAngular.gql(templateObject_10$4 || (templateObject_10$4 = __makeTemplateObject(["\n mutation DeleteProduct($id: ID!) {\n deleteProduct(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteProduct($id: ID!) {\n deleteProduct(id: $id) {\n result\n message\n }\n }\n"])));
1242
1242
  var CREATE_PRODUCT_VARIANTS = apolloAngular.gql(templateObject_11$2 || (templateObject_11$2 = __makeTemplateObject(["\n mutation CreateProductVariants($input: [CreateProductVariantInput!]!) {\n createProductVariants(input: $input) {\n ...ProductVariant\n }\n }\n ", "\n"], ["\n mutation CreateProductVariants($input: [CreateProductVariantInput!]!) {\n createProductVariants(input: $input) {\n ...ProductVariant\n }\n }\n ", "\n"])), PRODUCT_VARIANT_FRAGMENT);
1243
1243
  var UPDATE_PRODUCT_VARIANTS = apolloAngular.gql(templateObject_12$2 || (templateObject_12$2 = __makeTemplateObject(["\n mutation UpdateProductVariants($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n ...ProductVariant\n }\n }\n ", "\n"], ["\n mutation UpdateProductVariants($input: [UpdateProductVariantInput!]!) {\n updateProductVariants(input: $input) {\n ...ProductVariant\n }\n }\n ", "\n"])), PRODUCT_VARIANT_FRAGMENT);
1244
1244
  var CREATE_PRODUCT_OPTION_GROUP = apolloAngular.gql(templateObject_13$2 || (templateObject_13$2 = __makeTemplateObject(["\n mutation CreateProductOptionGroup($input: CreateProductOptionGroupInput!) {\n createProductOptionGroup(input: $input) {\n ...ProductOptionGroupWithOptions\n }\n }\n ", "\n"], ["\n mutation CreateProductOptionGroup($input: CreateProductOptionGroupInput!) {\n createProductOptionGroup(input: $input) {\n ...ProductOptionGroupWithOptions\n }\n }\n ", "\n"])), PRODUCT_OPTION_GROUP_WITH_OPTIONS_FRAGMENT);
@@ -1273,7 +1273,7 @@
1273
1273
  var CREATE_TAG = apolloAngular.gql(templateObject_42 || (templateObject_42 = __makeTemplateObject(["\n mutation CreateTag($input: CreateTagInput!) {\n createTag(input: $input) {\n ...Tag\n }\n }\n ", "\n"], ["\n mutation CreateTag($input: CreateTagInput!) {\n createTag(input: $input) {\n ...Tag\n }\n }\n ", "\n"])), TAG_FRAGMENT);
1274
1274
  var UPDATE_TAG = apolloAngular.gql(templateObject_43 || (templateObject_43 = __makeTemplateObject(["\n mutation UpdateTag($input: UpdateTagInput!) {\n updateTag(input: $input) {\n ...Tag\n }\n }\n ", "\n"], ["\n mutation UpdateTag($input: UpdateTagInput!) {\n updateTag(input: $input) {\n ...Tag\n }\n }\n ", "\n"])), TAG_FRAGMENT);
1275
1275
  var DELETE_TAG = apolloAngular.gql(templateObject_44 || (templateObject_44 = __makeTemplateObject(["\n mutation DeleteTag($id: ID!) {\n deleteTag(id: $id) {\n message\n result\n }\n }\n"], ["\n mutation DeleteTag($id: ID!) {\n deleteTag(id: $id) {\n message\n result\n }\n }\n"])));
1276
- var templateObject_1$6, templateObject_2$6, templateObject_3$6, templateObject_4$6, templateObject_5$6, templateObject_6$6, templateObject_7$6, templateObject_8$5, templateObject_9$5, templateObject_10$3, templateObject_11$2, templateObject_12$2, templateObject_13$2, templateObject_14$2, templateObject_15$2, templateObject_16$2, templateObject_17$2, templateObject_18$2, templateObject_19$2, templateObject_20$2, templateObject_21$2, templateObject_22$2, templateObject_23$1, templateObject_24$1, templateObject_25$1, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31, templateObject_32, templateObject_33, templateObject_34, templateObject_35, templateObject_36, templateObject_37, templateObject_38, templateObject_39, templateObject_40, templateObject_41, templateObject_42, templateObject_43, templateObject_44;
1276
+ var templateObject_1$6, templateObject_2$6, templateObject_3$6, templateObject_4$6, templateObject_5$6, templateObject_6$6, templateObject_7$6, templateObject_8$5, templateObject_9$5, templateObject_10$4, templateObject_11$2, templateObject_12$2, templateObject_13$2, templateObject_14$2, templateObject_15$2, templateObject_16$2, templateObject_17$2, templateObject_18$2, templateObject_19$2, templateObject_20$2, templateObject_21$2, templateObject_22$2, templateObject_23$1, templateObject_24$1, templateObject_25$1, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31, templateObject_32, templateObject_33, templateObject_34, templateObject_35, templateObject_36, templateObject_37, templateObject_38, templateObject_39, templateObject_40, templateObject_41, templateObject_42, templateObject_43, templateObject_44;
1277
1277
 
1278
1278
  var GET_COLLECTION_FILTERS = apolloAngular.gql(templateObject_1$5 || (templateObject_1$5 = __makeTemplateObject(["\n query GetCollectionFilters {\n collectionFilters {\n ...ConfigurableOperationDef\n }\n }\n ", "\n"], ["\n query GetCollectionFilters {\n collectionFilters {\n ...ConfigurableOperationDef\n }\n }\n ", "\n"])), CONFIGURABLE_OPERATION_DEF_FRAGMENT);
1279
1279
  var COLLECTION_FRAGMENT = apolloAngular.gql(templateObject_2$5 || (templateObject_2$5 = __makeTemplateObject(["\n fragment Collection on Collection {\n id\n createdAt\n updatedAt\n name\n slug\n description\n isPrivate\n languageCode\n featuredAsset {\n ...Asset\n }\n assets {\n ...Asset\n }\n filters {\n ...ConfigurableOperation\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n parent {\n id\n name\n }\n children {\n id\n name\n }\n }\n ", "\n ", "\n"], ["\n fragment Collection on Collection {\n id\n createdAt\n updatedAt\n name\n slug\n description\n isPrivate\n languageCode\n featuredAsset {\n ...Asset\n }\n assets {\n ...Asset\n }\n filters {\n ...ConfigurableOperation\n }\n translations {\n id\n languageCode\n name\n slug\n description\n }\n parent {\n id\n name\n }\n children {\n id\n name\n }\n }\n ", "\n ", "\n"])), ASSET_FRAGMENT, CONFIGURABLE_OPERATION_FRAGMENT);
@@ -1283,8 +1283,9 @@
1283
1283
  var UPDATE_COLLECTION = apolloAngular.gql(templateObject_6$5 || (templateObject_6$5 = __makeTemplateObject(["\n mutation UpdateCollection($input: UpdateCollectionInput!) {\n updateCollection(input: $input) {\n ...Collection\n }\n }\n ", "\n"], ["\n mutation UpdateCollection($input: UpdateCollectionInput!) {\n updateCollection(input: $input) {\n ...Collection\n }\n }\n ", "\n"])), COLLECTION_FRAGMENT);
1284
1284
  var MOVE_COLLECTION = apolloAngular.gql(templateObject_7$5 || (templateObject_7$5 = __makeTemplateObject(["\n mutation MoveCollection($input: MoveCollectionInput!) {\n moveCollection(input: $input) {\n ...Collection\n }\n }\n ", "\n"], ["\n mutation MoveCollection($input: MoveCollectionInput!) {\n moveCollection(input: $input) {\n ...Collection\n }\n }\n ", "\n"])), COLLECTION_FRAGMENT);
1285
1285
  var DELETE_COLLECTION = apolloAngular.gql(templateObject_8$4 || (templateObject_8$4 = __makeTemplateObject(["\n mutation DeleteCollection($id: ID!) {\n deleteCollection(id: $id) {\n result\n message\n }\n }\n"], ["\n mutation DeleteCollection($id: ID!) {\n deleteCollection(id: $id) {\n result\n message\n }\n }\n"])));
1286
- var GET_COLLECTION_CONTENTS = apolloAngular.gql(templateObject_9$4 || (templateObject_9$4 = __makeTemplateObject(["\n query GetCollectionContents($id: ID!, $options: ProductVariantListOptions) {\n collection(id: $id) {\n id\n name\n productVariants(options: $options) {\n items {\n id\n productId\n name\n }\n totalItems\n }\n }\n }\n"], ["\n query GetCollectionContents($id: ID!, $options: ProductVariantListOptions) {\n collection(id: $id) {\n id\n name\n productVariants(options: $options) {\n items {\n id\n productId\n name\n }\n totalItems\n }\n }\n }\n"])));
1287
- var templateObject_1$5, templateObject_2$5, templateObject_3$5, templateObject_4$5, templateObject_5$5, templateObject_6$5, templateObject_7$5, templateObject_8$4, templateObject_9$4;
1286
+ var GET_COLLECTION_CONTENTS = apolloAngular.gql(templateObject_9$4 || (templateObject_9$4 = __makeTemplateObject(["\n query GetCollectionContents($id: ID!, $options: ProductVariantListOptions) {\n collection(id: $id) {\n id\n name\n productVariants(options: $options) {\n items {\n id\n productId\n name\n sku\n }\n totalItems\n }\n }\n }\n"], ["\n query GetCollectionContents($id: ID!, $options: ProductVariantListOptions) {\n collection(id: $id) {\n id\n name\n productVariants(options: $options) {\n items {\n id\n productId\n name\n sku\n }\n totalItems\n }\n }\n }\n"])));
1287
+ var PREVIEW_COLLECTION_CONTENTS = apolloAngular.gql(templateObject_10$3 || (templateObject_10$3 = __makeTemplateObject(["\n query PreviewCollectionContents(\n $input: PreviewCollectionVariantsInput!\n $options: ProductVariantListOptions\n ) {\n previewCollectionVariants(input: $input, options: $options) {\n items {\n id\n productId\n name\n sku\n }\n totalItems\n }\n }\n"], ["\n query PreviewCollectionContents(\n $input: PreviewCollectionVariantsInput!\n $options: ProductVariantListOptions\n ) {\n previewCollectionVariants(input: $input, options: $options) {\n items {\n id\n productId\n name\n sku\n }\n totalItems\n }\n }\n"])));
1288
+ var templateObject_1$5, templateObject_2$5, templateObject_3$5, templateObject_4$5, templateObject_5$5, templateObject_6$5, templateObject_7$5, templateObject_8$4, templateObject_9$4, templateObject_10$3;
1288
1289
 
1289
1290
  var CollectionDataService = /** @class */ (function () {
1290
1291
  function CollectionDataService(baseDataService) {
@@ -1342,6 +1343,9 @@
1342
1343
  id: id,
1343
1344
  });
1344
1345
  };
1346
+ CollectionDataService.prototype.previewCollectionVariants = function (input, options) {
1347
+ return this.baseDataService.query(PREVIEW_COLLECTION_CONTENTS, { input: input, options: options });
1348
+ };
1345
1349
  CollectionDataService.prototype.getCollectionContents = function (id, take, skip, filterTerm) {
1346
1350
  if (take === void 0) { take = 10; }
1347
1351
  if (skip === void 0) { skip = 0; }
@@ -1578,7 +1582,7 @@
1578
1582
  var DISCOUNT_FRAGMENT = apolloAngular.gql(templateObject_1$2 || (templateObject_1$2 = __makeTemplateObject(["\n fragment Discount on Discount {\n adjustmentSource\n amount\n amountWithTax\n description\n type\n }\n"], ["\n fragment Discount on Discount {\n adjustmentSource\n amount\n amountWithTax\n description\n type\n }\n"])));
1579
1583
  var REFUND_FRAGMENT = apolloAngular.gql(templateObject_2$2 || (templateObject_2$2 = __makeTemplateObject(["\n fragment Refund on Refund {\n id\n state\n items\n shipping\n adjustment\n transactionId\n paymentId\n }\n"], ["\n fragment Refund on Refund {\n id\n state\n items\n shipping\n adjustment\n transactionId\n paymentId\n }\n"])));
1580
1584
  var ORDER_ADDRESS_FRAGMENT = apolloAngular.gql(templateObject_3$2 || (templateObject_3$2 = __makeTemplateObject(["\n fragment OrderAddress on OrderAddress {\n fullName\n company\n streetLine1\n streetLine2\n city\n province\n postalCode\n country\n countryCode\n phoneNumber\n }\n"], ["\n fragment OrderAddress on OrderAddress {\n fullName\n company\n streetLine1\n streetLine2\n city\n province\n postalCode\n country\n countryCode\n phoneNumber\n }\n"])));
1581
- var ORDER_FRAGMENT = apolloAngular.gql(templateObject_4$2 || (templateObject_4$2 = __makeTemplateObject(["\n fragment Order on Order {\n id\n createdAt\n updatedAt\n orderPlacedAt\n code\n state\n nextStates\n total\n currencyCode\n customer {\n id\n firstName\n lastName\n }\n shippingLines {\n shippingMethod {\n name\n }\n }\n }\n"], ["\n fragment Order on Order {\n id\n createdAt\n updatedAt\n orderPlacedAt\n code\n state\n nextStates\n total\n currencyCode\n customer {\n id\n firstName\n lastName\n }\n shippingLines {\n shippingMethod {\n name\n }\n }\n }\n"])));
1585
+ var ORDER_FRAGMENT = apolloAngular.gql(templateObject_4$2 || (templateObject_4$2 = __makeTemplateObject(["\n fragment Order on Order {\n id\n createdAt\n updatedAt\n orderPlacedAt\n code\n state\n nextStates\n total\n totalWithTax\n currencyCode\n customer {\n id\n firstName\n lastName\n }\n shippingLines {\n shippingMethod {\n name\n }\n }\n }\n"], ["\n fragment Order on Order {\n id\n createdAt\n updatedAt\n orderPlacedAt\n code\n state\n nextStates\n total\n totalWithTax\n currencyCode\n customer {\n id\n firstName\n lastName\n }\n shippingLines {\n shippingMethod {\n name\n }\n }\n }\n"])));
1582
1586
  var FULFILLMENT_FRAGMENT = apolloAngular.gql(templateObject_5$2 || (templateObject_5$2 = __makeTemplateObject(["\n fragment Fulfillment on Fulfillment {\n id\n state\n nextStates\n createdAt\n updatedAt\n method\n orderItems {\n id\n }\n trackingCode\n }\n"], ["\n fragment Fulfillment on Fulfillment {\n id\n state\n nextStates\n createdAt\n updatedAt\n method\n orderItems {\n id\n }\n trackingCode\n }\n"])));
1583
1587
  var ORDER_LINE_FRAGMENT = apolloAngular.gql(templateObject_6$2 || (templateObject_6$2 = __makeTemplateObject(["\n fragment OrderLine on OrderLine {\n id\n featuredAsset {\n preview\n }\n productVariant {\n id\n name\n sku\n trackInventory\n stockOnHand\n }\n discounts {\n ...Discount\n }\n unitPrice\n unitPriceWithTax\n proratedUnitPrice\n proratedUnitPriceWithTax\n quantity\n items {\n id\n unitPrice\n unitPriceWithTax\n taxRate\n refundId\n cancelled\n fulfillment {\n ...Fulfillment\n }\n }\n linePrice\n lineTax\n linePriceWithTax\n discountedLinePrice\n discountedLinePriceWithTax\n }\n"], ["\n fragment OrderLine on OrderLine {\n id\n featuredAsset {\n preview\n }\n productVariant {\n id\n name\n sku\n trackInventory\n stockOnHand\n }\n discounts {\n ...Discount\n }\n unitPrice\n unitPriceWithTax\n proratedUnitPrice\n proratedUnitPriceWithTax\n quantity\n items {\n id\n unitPrice\n unitPriceWithTax\n taxRate\n refundId\n cancelled\n fulfillment {\n ...Fulfillment\n }\n }\n linePrice\n lineTax\n linePriceWithTax\n discountedLinePrice\n discountedLinePriceWithTax\n }\n"])));
1584
1588
  var ORDER_DETAIL_FRAGMENT = apolloAngular.gql(templateObject_7$2 || (templateObject_7$2 = __makeTemplateObject(["\n fragment OrderDetail on Order {\n id\n createdAt\n updatedAt\n code\n state\n nextStates\n active\n couponCodes\n customer {\n id\n firstName\n lastName\n }\n lines {\n ...OrderLine\n }\n surcharges {\n id\n sku\n description\n price\n priceWithTax\n taxRate\n }\n discounts {\n ...Discount\n }\n promotions {\n id\n couponCode\n }\n subTotal\n subTotalWithTax\n total\n totalWithTax\n currencyCode\n shipping\n shippingWithTax\n shippingLines {\n shippingMethod {\n id\n code\n name\n fulfillmentHandlerCode\n description\n }\n }\n taxSummary {\n description\n taxBase\n taxRate\n taxTotal\n }\n shippingAddress {\n ...OrderAddress\n }\n billingAddress {\n ...OrderAddress\n }\n payments {\n id\n createdAt\n transactionId\n amount\n method\n state\n nextStates\n errorMessage\n metadata\n refunds {\n id\n createdAt\n state\n items\n adjustment\n total\n paymentId\n reason\n transactionId\n method\n metadata\n orderItems {\n id\n }\n }\n }\n fulfillments {\n ...Fulfillment\n }\n modifications {\n id\n createdAt\n isSettled\n priceChange\n note\n payment {\n id\n amount\n }\n orderItems {\n id\n }\n refund {\n id\n paymentId\n total\n }\n surcharges {\n id\n }\n }\n }\n ", "\n ", "\n ", "\n ", "\n"], ["\n fragment OrderDetail on Order {\n id\n createdAt\n updatedAt\n code\n state\n nextStates\n active\n couponCodes\n customer {\n id\n firstName\n lastName\n }\n lines {\n ...OrderLine\n }\n surcharges {\n id\n sku\n description\n price\n priceWithTax\n taxRate\n }\n discounts {\n ...Discount\n }\n promotions {\n id\n couponCode\n }\n subTotal\n subTotalWithTax\n total\n totalWithTax\n currencyCode\n shipping\n shippingWithTax\n shippingLines {\n shippingMethod {\n id\n code\n name\n fulfillmentHandlerCode\n description\n }\n }\n taxSummary {\n description\n taxBase\n taxRate\n taxTotal\n }\n shippingAddress {\n ...OrderAddress\n }\n billingAddress {\n ...OrderAddress\n }\n payments {\n id\n createdAt\n transactionId\n amount\n method\n state\n nextStates\n errorMessage\n metadata\n refunds {\n id\n createdAt\n state\n items\n adjustment\n total\n paymentId\n reason\n transactionId\n method\n metadata\n orderItems {\n id\n }\n }\n }\n fulfillments {\n ...Fulfillment\n }\n modifications {\n id\n createdAt\n isSettled\n priceChange\n note\n payment {\n id\n amount\n }\n orderItems {\n id\n }\n refund {\n id\n paymentId\n total\n }\n surcharges {\n id\n }\n }\n }\n ", "\n ", "\n ", "\n ", "\n"])), DISCOUNT_FRAGMENT, ORDER_ADDRESS_FRAGMENT, FULFILLMENT_FRAGMENT, ORDER_LINE_FRAGMENT);
@@ -4148,6 +4152,7 @@
4148
4152
  this.modalService = modalService;
4149
4153
  this.localStorageService = localStorageService;
4150
4154
  this.availableLanguages = [];
4155
+ this.hideVendureBranding = getAppConfig().hideVendureBranding;
4151
4156
  }
4152
4157
  AppShellComponent.prototype.ngOnInit = function () {
4153
4158
  this.userName$ = this.dataService.client
@@ -4203,8 +4208,8 @@
4203
4208
  AppShellComponent.decorators = [
4204
4209
  { type: i0.Component, args: [{
4205
4210
  selector: 'vdr-app-shell',
4206
- 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",
4207
- 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"]
4211
+ 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\" /><span class=\"wordmark\" *ngIf=\"!hideVendureBranding\">vendure</span></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",
4212
+ styles: [".branding{min-width:0}.logo{width:40px}.wordmark{font-weight:bold;margin-left:12px;font-size:24px;color:var(--color-primary-500)}@media screen and (min-width: 768px){vdr-breadcrumb{margin-left:10.8rem}}.header-actions{align-items:center}.content-area{position:relative}::ng-deep .header{background-image:linear-gradient(to right,var(--color-header-gradient-from),var(--color-header-gradient-to))}\n"]
4208
4213
  },] }
4209
4214
  ];
4210
4215
  AppShellComponent.ctorParameters = function () { return [
@@ -5260,194 +5265,260 @@
5260
5265
 
5261
5266
  // tslint:disable
5262
5267
  var result = {
5263
- possibleTypes: {
5264
- AddFulfillmentToOrderResult: [
5265
- 'Fulfillment',
5266
- 'EmptyOrderLineSelectionError',
5267
- 'ItemsAlreadyFulfilledError',
5268
- 'InsufficientStockOnHandError',
5269
- 'InvalidFulfillmentHandlerError',
5270
- 'FulfillmentStateTransitionError',
5271
- 'CreateFulfillmentError',
5268
+ "possibleTypes": {
5269
+ "AddFulfillmentToOrderResult": [
5270
+ "Fulfillment",
5271
+ "EmptyOrderLineSelectionError",
5272
+ "ItemsAlreadyFulfilledError",
5273
+ "InsufficientStockOnHandError",
5274
+ "InvalidFulfillmentHandlerError",
5275
+ "FulfillmentStateTransitionError",
5276
+ "CreateFulfillmentError"
5272
5277
  ],
5273
- AddManualPaymentToOrderResult: ['Order', 'ManualPaymentStateError'],
5274
- AuthenticationResult: ['CurrentUser', 'InvalidCredentialsError'],
5275
- CancelOrderResult: [
5276
- 'Order',
5277
- 'EmptyOrderLineSelectionError',
5278
- 'QuantityTooGreatError',
5279
- 'MultipleOrderError',
5280
- 'CancelActiveOrderError',
5281
- 'OrderStateTransitionError',
5278
+ "AddManualPaymentToOrderResult": [
5279
+ "Order",
5280
+ "ManualPaymentStateError"
5282
5281
  ],
5283
- CreateAssetResult: ['Asset', 'MimeTypeError'],
5284
- CreateChannelResult: ['Channel', 'LanguageNotAvailableError'],
5285
- CreateCustomerResult: ['Customer', 'EmailAddressConflictError'],
5286
- CreatePromotionResult: ['Promotion', 'MissingConditionsError'],
5287
- CustomField: [
5288
- 'BooleanCustomFieldConfig',
5289
- 'DateTimeCustomFieldConfig',
5290
- 'FloatCustomFieldConfig',
5291
- 'IntCustomFieldConfig',
5292
- 'LocaleStringCustomFieldConfig',
5293
- 'RelationCustomFieldConfig',
5294
- 'StringCustomFieldConfig',
5295
- 'TextCustomFieldConfig',
5282
+ "AuthenticationResult": [
5283
+ "CurrentUser",
5284
+ "InvalidCredentialsError"
5296
5285
  ],
5297
- CustomFieldConfig: [
5298
- 'StringCustomFieldConfig',
5299
- 'LocaleStringCustomFieldConfig',
5300
- 'IntCustomFieldConfig',
5301
- 'FloatCustomFieldConfig',
5302
- 'BooleanCustomFieldConfig',
5303
- 'DateTimeCustomFieldConfig',
5304
- 'RelationCustomFieldConfig',
5305
- 'TextCustomFieldConfig',
5286
+ "CancelOrderResult": [
5287
+ "Order",
5288
+ "EmptyOrderLineSelectionError",
5289
+ "QuantityTooGreatError",
5290
+ "MultipleOrderError",
5291
+ "CancelActiveOrderError",
5292
+ "OrderStateTransitionError"
5306
5293
  ],
5307
- ErrorResult: [
5308
- 'AlreadyRefundedError',
5309
- 'CancelActiveOrderError',
5310
- 'ChannelDefaultLanguageError',
5311
- 'CouponCodeExpiredError',
5312
- 'CouponCodeInvalidError',
5313
- 'CouponCodeLimitError',
5314
- 'CreateFulfillmentError',
5315
- 'EmailAddressConflictError',
5316
- 'EmptyOrderLineSelectionError',
5317
- 'FulfillmentStateTransitionError',
5318
- 'InsufficientStockError',
5319
- 'InsufficientStockOnHandError',
5320
- 'InvalidCredentialsError',
5321
- 'InvalidFulfillmentHandlerError',
5322
- 'ItemsAlreadyFulfilledError',
5323
- 'LanguageNotAvailableError',
5324
- 'ManualPaymentStateError',
5325
- 'MimeTypeError',
5326
- 'MissingConditionsError',
5327
- 'MultipleOrderError',
5328
- 'NativeAuthStrategyError',
5329
- 'NegativeQuantityError',
5330
- 'NoChangesSpecifiedError',
5331
- 'NothingToRefundError',
5332
- 'OrderLimitError',
5333
- 'OrderModificationStateError',
5334
- 'OrderStateTransitionError',
5335
- 'PaymentMethodMissingError',
5336
- 'PaymentOrderMismatchError',
5337
- 'PaymentStateTransitionError',
5338
- 'ProductOptionInUseError',
5339
- 'QuantityTooGreatError',
5340
- 'RefundOrderStateError',
5341
- 'RefundPaymentIdMissingError',
5342
- 'RefundStateTransitionError',
5343
- 'SettlePaymentError',
5294
+ "CreateAssetResult": [
5295
+ "Asset",
5296
+ "MimeTypeError"
5344
5297
  ],
5345
- ModifyOrderResult: [
5346
- 'Order',
5347
- 'NoChangesSpecifiedError',
5348
- 'OrderModificationStateError',
5349
- 'PaymentMethodMissingError',
5350
- 'RefundPaymentIdMissingError',
5351
- 'OrderLimitError',
5352
- 'NegativeQuantityError',
5353
- 'InsufficientStockError',
5354
- 'CouponCodeExpiredError',
5355
- 'CouponCodeInvalidError',
5356
- 'CouponCodeLimitError',
5298
+ "CreateChannelResult": [
5299
+ "Channel",
5300
+ "LanguageNotAvailableError"
5357
5301
  ],
5358
- NativeAuthenticationResult: ['CurrentUser', 'InvalidCredentialsError', 'NativeAuthStrategyError'],
5359
- Node: [
5360
- 'Address',
5361
- 'Administrator',
5362
- 'Allocation',
5363
- 'Asset',
5364
- 'AuthenticationMethod',
5365
- 'Cancellation',
5366
- 'Channel',
5367
- 'Collection',
5368
- 'Country',
5369
- 'Customer',
5370
- 'CustomerGroup',
5371
- 'Facet',
5372
- 'FacetValue',
5373
- 'Fulfillment',
5374
- 'HistoryEntry',
5375
- 'Job',
5376
- 'Order',
5377
- 'OrderItem',
5378
- 'OrderLine',
5379
- 'OrderModification',
5380
- 'Payment',
5381
- 'PaymentMethod',
5382
- 'Product',
5383
- 'ProductOption',
5384
- 'ProductOptionGroup',
5385
- 'ProductVariant',
5386
- 'Promotion',
5387
- 'Refund',
5388
- 'Release',
5389
- 'Return',
5390
- 'Role',
5391
- 'Sale',
5392
- 'ShippingMethod',
5393
- 'StockAdjustment',
5394
- 'Surcharge',
5395
- 'Tag',
5396
- 'TaxCategory',
5397
- 'TaxRate',
5398
- 'User',
5399
- 'Zone',
5302
+ "CreateCustomerResult": [
5303
+ "Customer",
5304
+ "EmailAddressConflictError"
5400
5305
  ],
5401
- PaginatedList: [
5402
- 'AdministratorList',
5403
- 'AssetList',
5404
- 'CollectionList',
5405
- 'CountryList',
5406
- 'CustomerGroupList',
5407
- 'CustomerList',
5408
- 'FacetList',
5409
- 'HistoryEntryList',
5410
- 'JobList',
5411
- 'OrderList',
5412
- 'PaymentMethodList',
5413
- 'ProductList',
5414
- 'ProductVariantList',
5415
- 'PromotionList',
5416
- 'RoleList',
5417
- 'ShippingMethodList',
5418
- 'TagList',
5419
- 'TaxRateList',
5306
+ "CreatePromotionResult": [
5307
+ "Promotion",
5308
+ "MissingConditionsError"
5420
5309
  ],
5421
- RefundOrderResult: [
5422
- 'Refund',
5423
- 'QuantityTooGreatError',
5424
- 'NothingToRefundError',
5425
- 'OrderStateTransitionError',
5426
- 'MultipleOrderError',
5427
- 'PaymentOrderMismatchError',
5428
- 'RefundOrderStateError',
5429
- 'AlreadyRefundedError',
5430
- 'RefundStateTransitionError',
5310
+ "CustomField": [
5311
+ "BooleanCustomFieldConfig",
5312
+ "DateTimeCustomFieldConfig",
5313
+ "FloatCustomFieldConfig",
5314
+ "IntCustomFieldConfig",
5315
+ "LocaleStringCustomFieldConfig",
5316
+ "RelationCustomFieldConfig",
5317
+ "StringCustomFieldConfig",
5318
+ "TextCustomFieldConfig"
5431
5319
  ],
5432
- RemoveOptionGroupFromProductResult: ['Product', 'ProductOptionInUseError'],
5433
- SearchResultPrice: ['PriceRange', 'SinglePrice'],
5434
- SettlePaymentResult: [
5435
- 'Payment',
5436
- 'SettlePaymentError',
5437
- 'PaymentStateTransitionError',
5438
- 'OrderStateTransitionError',
5320
+ "CustomFieldConfig": [
5321
+ "StringCustomFieldConfig",
5322
+ "LocaleStringCustomFieldConfig",
5323
+ "IntCustomFieldConfig",
5324
+ "FloatCustomFieldConfig",
5325
+ "BooleanCustomFieldConfig",
5326
+ "DateTimeCustomFieldConfig",
5327
+ "RelationCustomFieldConfig",
5328
+ "TextCustomFieldConfig"
5439
5329
  ],
5440
- SettleRefundResult: ['Refund', 'RefundStateTransitionError'],
5441
- StockMovement: ['Allocation', 'Cancellation', 'Release', 'Return', 'Sale', 'StockAdjustment'],
5442
- StockMovementItem: ['StockAdjustment', 'Allocation', 'Sale', 'Cancellation', 'Return', 'Release'],
5443
- TransitionFulfillmentToStateResult: ['Fulfillment', 'FulfillmentStateTransitionError'],
5444
- TransitionOrderToStateResult: ['Order', 'OrderStateTransitionError'],
5445
- TransitionPaymentToStateResult: ['Payment', 'PaymentStateTransitionError'],
5446
- UpdateChannelResult: ['Channel', 'LanguageNotAvailableError'],
5447
- UpdateCustomerResult: ['Customer', 'EmailAddressConflictError'],
5448
- UpdateGlobalSettingsResult: ['GlobalSettings', 'ChannelDefaultLanguageError'],
5449
- UpdatePromotionResult: ['Promotion', 'MissingConditionsError'],
5450
- },
5330
+ "ErrorResult": [
5331
+ "AlreadyRefundedError",
5332
+ "CancelActiveOrderError",
5333
+ "ChannelDefaultLanguageError",
5334
+ "CouponCodeExpiredError",
5335
+ "CouponCodeInvalidError",
5336
+ "CouponCodeLimitError",
5337
+ "CreateFulfillmentError",
5338
+ "EmailAddressConflictError",
5339
+ "EmptyOrderLineSelectionError",
5340
+ "FulfillmentStateTransitionError",
5341
+ "InsufficientStockError",
5342
+ "InsufficientStockOnHandError",
5343
+ "InvalidCredentialsError",
5344
+ "InvalidFulfillmentHandlerError",
5345
+ "ItemsAlreadyFulfilledError",
5346
+ "LanguageNotAvailableError",
5347
+ "ManualPaymentStateError",
5348
+ "MimeTypeError",
5349
+ "MissingConditionsError",
5350
+ "MultipleOrderError",
5351
+ "NativeAuthStrategyError",
5352
+ "NegativeQuantityError",
5353
+ "NoChangesSpecifiedError",
5354
+ "NothingToRefundError",
5355
+ "OrderLimitError",
5356
+ "OrderModificationStateError",
5357
+ "OrderStateTransitionError",
5358
+ "PaymentMethodMissingError",
5359
+ "PaymentOrderMismatchError",
5360
+ "PaymentStateTransitionError",
5361
+ "ProductOptionInUseError",
5362
+ "QuantityTooGreatError",
5363
+ "RefundOrderStateError",
5364
+ "RefundPaymentIdMissingError",
5365
+ "RefundStateTransitionError",
5366
+ "SettlePaymentError"
5367
+ ],
5368
+ "ModifyOrderResult": [
5369
+ "Order",
5370
+ "NoChangesSpecifiedError",
5371
+ "OrderModificationStateError",
5372
+ "PaymentMethodMissingError",
5373
+ "RefundPaymentIdMissingError",
5374
+ "OrderLimitError",
5375
+ "NegativeQuantityError",
5376
+ "InsufficientStockError",
5377
+ "CouponCodeExpiredError",
5378
+ "CouponCodeInvalidError",
5379
+ "CouponCodeLimitError"
5380
+ ],
5381
+ "NativeAuthenticationResult": [
5382
+ "CurrentUser",
5383
+ "InvalidCredentialsError",
5384
+ "NativeAuthStrategyError"
5385
+ ],
5386
+ "Node": [
5387
+ "Address",
5388
+ "Administrator",
5389
+ "Allocation",
5390
+ "Asset",
5391
+ "AuthenticationMethod",
5392
+ "Cancellation",
5393
+ "Channel",
5394
+ "Collection",
5395
+ "Country",
5396
+ "Customer",
5397
+ "CustomerGroup",
5398
+ "Facet",
5399
+ "FacetValue",
5400
+ "Fulfillment",
5401
+ "HistoryEntry",
5402
+ "Job",
5403
+ "Order",
5404
+ "OrderItem",
5405
+ "OrderLine",
5406
+ "OrderModification",
5407
+ "Payment",
5408
+ "PaymentMethod",
5409
+ "Product",
5410
+ "ProductOption",
5411
+ "ProductOptionGroup",
5412
+ "ProductVariant",
5413
+ "Promotion",
5414
+ "Refund",
5415
+ "Release",
5416
+ "Return",
5417
+ "Role",
5418
+ "Sale",
5419
+ "ShippingMethod",
5420
+ "StockAdjustment",
5421
+ "Surcharge",
5422
+ "Tag",
5423
+ "TaxCategory",
5424
+ "TaxRate",
5425
+ "User",
5426
+ "Zone"
5427
+ ],
5428
+ "PaginatedList": [
5429
+ "AdministratorList",
5430
+ "AssetList",
5431
+ "CollectionList",
5432
+ "CountryList",
5433
+ "CustomerGroupList",
5434
+ "CustomerList",
5435
+ "FacetList",
5436
+ "HistoryEntryList",
5437
+ "JobList",
5438
+ "OrderList",
5439
+ "PaymentMethodList",
5440
+ "ProductList",
5441
+ "ProductVariantList",
5442
+ "PromotionList",
5443
+ "RoleList",
5444
+ "ShippingMethodList",
5445
+ "TagList",
5446
+ "TaxRateList"
5447
+ ],
5448
+ "RefundOrderResult": [
5449
+ "Refund",
5450
+ "QuantityTooGreatError",
5451
+ "NothingToRefundError",
5452
+ "OrderStateTransitionError",
5453
+ "MultipleOrderError",
5454
+ "PaymentOrderMismatchError",
5455
+ "RefundOrderStateError",
5456
+ "AlreadyRefundedError",
5457
+ "RefundStateTransitionError"
5458
+ ],
5459
+ "RemoveOptionGroupFromProductResult": [
5460
+ "Product",
5461
+ "ProductOptionInUseError"
5462
+ ],
5463
+ "SearchResultPrice": [
5464
+ "PriceRange",
5465
+ "SinglePrice"
5466
+ ],
5467
+ "SettlePaymentResult": [
5468
+ "Payment",
5469
+ "SettlePaymentError",
5470
+ "PaymentStateTransitionError",
5471
+ "OrderStateTransitionError"
5472
+ ],
5473
+ "SettleRefundResult": [
5474
+ "Refund",
5475
+ "RefundStateTransitionError"
5476
+ ],
5477
+ "StockMovement": [
5478
+ "Allocation",
5479
+ "Cancellation",
5480
+ "Release",
5481
+ "Return",
5482
+ "Sale",
5483
+ "StockAdjustment"
5484
+ ],
5485
+ "StockMovementItem": [
5486
+ "StockAdjustment",
5487
+ "Allocation",
5488
+ "Sale",
5489
+ "Cancellation",
5490
+ "Return",
5491
+ "Release"
5492
+ ],
5493
+ "TransitionFulfillmentToStateResult": [
5494
+ "Fulfillment",
5495
+ "FulfillmentStateTransitionError"
5496
+ ],
5497
+ "TransitionOrderToStateResult": [
5498
+ "Order",
5499
+ "OrderStateTransitionError"
5500
+ ],
5501
+ "TransitionPaymentToStateResult": [
5502
+ "Payment",
5503
+ "PaymentStateTransitionError"
5504
+ ],
5505
+ "UpdateChannelResult": [
5506
+ "Channel",
5507
+ "LanguageNotAvailableError"
5508
+ ],
5509
+ "UpdateCustomerResult": [
5510
+ "Customer",
5511
+ "EmailAddressConflictError"
5512
+ ],
5513
+ "UpdateGlobalSettingsResult": [
5514
+ "GlobalSettings",
5515
+ "ChannelDefaultLanguageError"
5516
+ ],
5517
+ "UpdatePromotionResult": [
5518
+ "Promotion",
5519
+ "MissingConditionsError"
5520
+ ]
5521
+ }
5451
5522
  };
5452
5523
 
5453
5524
  // Allows the introspectionResult to be imported as a named symbol
@@ -5519,7 +5590,7 @@
5519
5590
  };
5520
5591
  }
5521
5592
 
5522
- var ɵ0$2 = function (_, args, _b) {
5593
+ var ɵ0$3 = function (_, args, _b) {
5523
5594
  var cache = _b.cache;
5524
5595
  return updateRequestsInFlight(cache, 1);
5525
5596
  }, ɵ1 = function (_, args, _b) {
@@ -5620,7 +5691,7 @@
5620
5691
  };
5621
5692
  var clientResolvers = {
5622
5693
  Mutation: {
5623
- requestStarted: ɵ0$2,
5694
+ requestStarted: ɵ0$3,
5624
5695
  requestCompleted: ɵ1,
5625
5696
  setAsLoggedIn: ɵ2,
5626
5697
  setAsLoggedOut: ɵ3,
@@ -6080,7 +6151,7 @@
6080
6151
  resolvers: clientResolvers,
6081
6152
  };
6082
6153
  }
6083
- var ɵ0$1 = initializeServerConfigService;
6154
+ var ɵ0$2 = initializeServerConfigService;
6084
6155
  /**
6085
6156
  * The DataModule is responsible for all API calls *and* serves as the source of truth for global app
6086
6157
  * state via the apollo-link-state package.
@@ -6109,7 +6180,7 @@
6109
6180
  {
6110
6181
  provide: i0.APP_INITIALIZER,
6111
6182
  multi: true,
6112
- useFactory: ɵ0$1,
6183
+ useFactory: ɵ0$2,
6113
6184
  deps: [ServerConfigService],
6114
6185
  },
6115
6186
  ],
@@ -6410,399 +6481,498 @@
6410
6481
  };
6411
6482
 
6412
6483
  /**
6413
- * @description
6414
- * An input for monetary values. Should be used with `int` type fields.
6415
- *
6416
- * @docsCategory custom-input-components
6417
- * @docsPage default-inputs
6484
+ * ConfigArg values are always stored as strings. If they are not primitives, then
6485
+ * they are JSON-encoded. This function unwraps them back into their original
6486
+ * data type.
6418
6487
  */
6419
- var CurrencyFormInputComponent = /** @class */ (function () {
6420
- function CurrencyFormInputComponent(dataService) {
6421
- this.dataService = dataService;
6422
- this.currencyCode$ = this.dataService.settings
6423
- .getActiveChannel()
6424
- .mapStream(function (data) { return data.activeChannel.currencyCode; });
6488
+ function getConfigArgValue(value) {
6489
+ try {
6490
+ return value ? JSON.parse(value) : undefined;
6425
6491
  }
6426
- return CurrencyFormInputComponent;
6427
- }());
6428
- CurrencyFormInputComponent.id = 'currency-form-input';
6429
- CurrencyFormInputComponent.decorators = [
6430
- { type: i0.Component, args: [{
6431
- selector: 'vdr-currency-form-input',
6432
- template: "<vdr-currency-input\r\n [formControl]=\"formControl\"\r\n [readonly]=\"readonly\"\r\n [currencyCode]=\"currencyCode$ | async\"\r\n></vdr-currency-input>\r\n",
6433
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
6434
- styles: [""]
6435
- },] }
6436
- ];
6437
- CurrencyFormInputComponent.ctorParameters = function () { return [
6438
- { type: DataService }
6439
- ]; };
6440
- CurrencyFormInputComponent.propDecorators = {
6441
- readonly: [{ type: i0.Input }]
6442
- };
6443
-
6492
+ catch (e) {
6493
+ return value;
6494
+ }
6495
+ }
6496
+ function encodeConfigArgValue(value) {
6497
+ return Array.isArray(value) ? JSON.stringify(value) : (value !== null && value !== void 0 ? value : '').toString();
6498
+ }
6444
6499
  /**
6445
- * @description
6446
- * Allows the selection of a Customer via an autocomplete select input.
6447
- * Should be used with `ID` type fields which represent Customer IDs.
6448
- *
6449
- * @docsCategory custom-input-components
6450
- * @docsPage default-inputs
6500
+ * Creates an empty ConfigurableOperation object based on the definition.
6451
6501
  */
6452
- var CustomerGroupFormInputComponent = /** @class */ (function () {
6453
- function CustomerGroupFormInputComponent(dataService) {
6454
- this.dataService = dataService;
6455
- }
6456
- CustomerGroupFormInputComponent.prototype.ngOnInit = function () {
6457
- this.customerGroups$ = this.dataService.customer
6458
- .getCustomerGroupList({
6459
- take: 1000,
6460
- })
6461
- .mapSingle(function (res) { return res.customerGroups.items; })
6462
- .pipe(operators.startWith([]));
6463
- };
6464
- CustomerGroupFormInputComponent.prototype.selectGroup = function (group) {
6465
- this.formControl.setValue(group.id);
6466
- };
6467
- return CustomerGroupFormInputComponent;
6468
- }());
6469
- CustomerGroupFormInputComponent.id = 'customer-group-form-input';
6470
- CustomerGroupFormInputComponent.decorators = [
6471
- { type: i0.Component, args: [{
6472
- selector: 'vdr-customer-group-form-input',
6473
- template: "<ng-select\r\n [items]=\"customerGroups$ | async\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"false\"\r\n bindValue=\"id\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n [ngModel]=\"formControl.value\"\r\n (change)=\"selectGroup($event)\"\r\n>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n</ng-select>\r\n",
6474
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
6475
- styles: [""]
6476
- },] }
6477
- ];
6478
- CustomerGroupFormInputComponent.ctorParameters = function () { return [
6479
- { type: DataService }
6480
- ]; };
6481
- CustomerGroupFormInputComponent.propDecorators = {
6482
- readonly: [{ type: i0.Input }]
6483
- };
6484
-
6502
+ function configurableDefinitionToInstance(def) {
6503
+ return Object.assign(Object.assign({}, def), { args: def.args.map(function (arg) {
6504
+ return Object.assign(Object.assign({}, arg), { value: getDefaultConfigArgValue(arg) });
6505
+ }) });
6506
+ }
6485
6507
  /**
6486
- * @description
6487
- * Allows selection of a datetime. Default input for `datetime` type fields.
6488
- *
6489
- * @docsCategory custom-input-components
6490
- * @docsPage default-inputs
6508
+ * Converts an object of the type:
6509
+ * ```
6510
+ * {
6511
+ * code: 'my-operation',
6512
+ * args: {
6513
+ * someProperty: 'foo'
6514
+ * }
6515
+ * }
6516
+ * ```
6517
+ * to the format defined by the ConfigurableOperationInput GraphQL input type:
6518
+ * ```
6519
+ * {
6520
+ * code: 'my-operation',
6521
+ * args: [
6522
+ * { name: 'someProperty', value: 'foo' }
6523
+ * ]
6524
+ * }
6525
+ * ```
6491
6526
  */
6492
- var DateFormInputComponent = /** @class */ (function () {
6493
- function DateFormInputComponent() {
6527
+ function toConfigurableOperationInput(operation, formValueOperations) {
6528
+ return {
6529
+ code: operation.code,
6530
+ arguments: Object.values(formValueOperations.args || {}).map(function (value, j) { return ({
6531
+ name: operation.args[j].name,
6532
+ value: (value === null || value === void 0 ? void 0 : value.hasOwnProperty('value'))
6533
+ ? encodeConfigArgValue(value.value)
6534
+ : encodeConfigArgValue(value),
6535
+ }); }),
6536
+ };
6537
+ }
6538
+ function configurableOperationValueIsValid(def, value) {
6539
+ var e_1, _a;
6540
+ if (!def || !value) {
6541
+ return false;
6494
6542
  }
6495
- Object.defineProperty(DateFormInputComponent.prototype, "min", {
6496
- get: function () {
6497
- var _a;
6498
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
6499
- },
6500
- enumerable: false,
6501
- configurable: true
6502
- });
6503
- Object.defineProperty(DateFormInputComponent.prototype, "max", {
6504
- get: function () {
6505
- var _a;
6506
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
6507
- },
6508
- enumerable: false,
6509
- configurable: true
6510
- });
6511
- Object.defineProperty(DateFormInputComponent.prototype, "yearRange", {
6512
- get: function () {
6513
- var _a;
6514
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.yearRange) || this.config.yearRange;
6515
- },
6516
- enumerable: false,
6517
- configurable: true
6518
- });
6519
- return DateFormInputComponent;
6520
- }());
6521
- DateFormInputComponent.id = 'date-form-input';
6522
- DateFormInputComponent.decorators = [
6523
- { type: i0.Component, args: [{
6524
- selector: 'vdr-date-form-input',
6525
- 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",
6526
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
6527
- styles: [""]
6528
- },] }
6529
- ];
6530
- DateFormInputComponent.propDecorators = {
6531
- readonly: [{ type: i0.Input }]
6532
- };
6533
-
6543
+ if (def.code !== value.code) {
6544
+ return false;
6545
+ }
6546
+ try {
6547
+ for (var _b = __values(def.args), _c = _b.next(); !_c.done; _c = _b.next()) {
6548
+ var argDef = _c.value;
6549
+ var argVal = value.args[argDef.name];
6550
+ if (argDef.required && (argVal == null || argVal === '' || argVal === '0')) {
6551
+ return false;
6552
+ }
6553
+ }
6554
+ }
6555
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
6556
+ finally {
6557
+ try {
6558
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
6559
+ }
6560
+ finally { if (e_1) throw e_1.error; }
6561
+ }
6562
+ return true;
6563
+ }
6534
6564
  /**
6535
- * @description
6536
- * Allows the selection of multiple FacetValues via an autocomplete select input.
6537
- * Should be used with `ID` type **list** fields which represent FacetValue IDs.
6538
- *
6539
- * @docsCategory custom-input-components
6540
- * @docsPage default-inputs
6565
+ * Returns a default value based on the type of the config arg.
6541
6566
  */
6542
- var FacetValueFormInputComponent = /** @class */ (function () {
6543
- function FacetValueFormInputComponent(dataService) {
6544
- this.dataService = dataService;
6545
- this.isListInput = true;
6567
+ function getDefaultConfigArgValue(arg) {
6568
+ if (arg.list) {
6569
+ return [];
6546
6570
  }
6547
- FacetValueFormInputComponent.prototype.ngOnInit = function () {
6548
- this.facets$ = this.dataService.facet
6549
- .getAllFacets()
6550
- .mapSingle(function (data) { return data.facets.items; })
6551
- .pipe(operators.shareReplay(1));
6552
- };
6553
- return FacetValueFormInputComponent;
6554
- }());
6555
- FacetValueFormInputComponent.id = 'facet-value-form-input';
6556
- FacetValueFormInputComponent.decorators = [
6557
- { type: i0.Component, args: [{
6558
- selector: 'vdr-facet-value-form-input',
6559
- template: "<vdr-facet-value-selector\r\n *ngIf=\"facets$ | async as facets\"\r\n [readonly]=\"readonly\"\r\n [facets]=\"facets\"\r\n [formControl]=\"formControl\"\r\n></vdr-facet-value-selector>\r\n",
6560
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
6561
- styles: [""]
6562
- },] }
6563
- ];
6564
- FacetValueFormInputComponent.ctorParameters = function () { return [
6565
- { type: DataService }
6566
- ]; };
6571
+ if (arg.defaultValue) {
6572
+ return arg.defaultValue;
6573
+ }
6574
+ var type = arg.type;
6575
+ switch (type) {
6576
+ case 'string':
6577
+ case 'datetime':
6578
+ case 'float':
6579
+ case 'ID':
6580
+ case 'int':
6581
+ return null;
6582
+ case 'boolean':
6583
+ return false;
6584
+ default:
6585
+ sharedUtils.assertNever(type);
6586
+ }
6587
+ }
6567
6588
 
6568
6589
  /**
6569
- * @description
6570
- * Displays a number input. Default input for `int` and `float` type fields.
6571
- *
6572
- * @docsCategory custom-input-components
6573
- * @docsPage default-inputs
6590
+ * Interpolates the description of an ConfigurableOperation with the given values.
6574
6591
  */
6575
- var NumberFormInputComponent = /** @class */ (function () {
6576
- function NumberFormInputComponent() {
6592
+ function interpolateDescription(operation, values) {
6593
+ if (!operation) {
6594
+ return '';
6577
6595
  }
6578
- Object.defineProperty(NumberFormInputComponent.prototype, "prefix", {
6579
- get: function () {
6580
- var _a;
6581
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.prefix) || this.config.prefix;
6582
- },
6583
- enumerable: false,
6584
- configurable: true
6585
- });
6586
- Object.defineProperty(NumberFormInputComponent.prototype, "suffix", {
6587
- get: function () {
6588
- var _a;
6589
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.suffix) || this.config.suffix;
6590
- },
6591
- enumerable: false,
6592
- configurable: true
6593
- });
6594
- Object.defineProperty(NumberFormInputComponent.prototype, "min", {
6595
- get: function () {
6596
- var _a;
6597
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
6598
- },
6599
- enumerable: false,
6600
- configurable: true
6601
- });
6602
- Object.defineProperty(NumberFormInputComponent.prototype, "max", {
6603
- get: function () {
6604
- var _a;
6605
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
6606
- },
6607
- enumerable: false,
6608
- configurable: true
6609
- });
6610
- Object.defineProperty(NumberFormInputComponent.prototype, "step", {
6611
- get: function () {
6612
- var _a;
6613
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.step) || this.config.step;
6614
- },
6615
- enumerable: false,
6616
- configurable: true
6596
+ var templateString = operation.description;
6597
+ var interpolated = templateString.replace(/{\s*([a-zA-Z0-9]+)\s*}/gi, function (substring, argName) {
6598
+ var normalizedArgName = argName.toLowerCase();
6599
+ var value = values[normalizedArgName];
6600
+ if (value == null) {
6601
+ return '_';
6602
+ }
6603
+ var formatted = value;
6604
+ var argDef = operation.args.find(function (arg) { return arg.name === normalizedArgName; });
6605
+ if (argDef && argDef.type === 'int' && argDef.ui && argDef.ui.component === 'currency-form-input') {
6606
+ formatted = value / 100;
6607
+ }
6608
+ if (argDef && argDef.type === 'datetime' && value instanceof Date) {
6609
+ formatted = value.toLocaleDateString();
6610
+ }
6611
+ return formatted;
6617
6612
  });
6618
- return NumberFormInputComponent;
6613
+ return interpolated;
6614
+ }
6615
+
6616
+ /**
6617
+ * A form input which renders a card with the internal form fields of the given ConfigurableOperation.
6618
+ */
6619
+ var ConfigurableInputComponent = /** @class */ (function () {
6620
+ function ConfigurableInputComponent() {
6621
+ this.readonly = false;
6622
+ this.removable = true;
6623
+ this.position = 0;
6624
+ this.remove = new i0.EventEmitter();
6625
+ this.argValues = {};
6626
+ this.form = new forms.FormGroup({});
6627
+ this.positionChangeSubject = new rxjs.BehaviorSubject(0);
6628
+ }
6629
+ ConfigurableInputComponent.prototype.interpolateDescription = function () {
6630
+ if (this.operationDefinition) {
6631
+ return interpolateDescription(this.operationDefinition, this.form.value);
6632
+ }
6633
+ else {
6634
+ return '';
6635
+ }
6636
+ };
6637
+ ConfigurableInputComponent.prototype.ngOnInit = function () {
6638
+ this.positionChange$ = this.positionChangeSubject.asObservable();
6639
+ };
6640
+ ConfigurableInputComponent.prototype.ngOnChanges = function (changes) {
6641
+ if ('operation' in changes || 'operationDefinition' in changes) {
6642
+ this.createForm();
6643
+ }
6644
+ if ('position' in changes) {
6645
+ this.positionChangeSubject.next(this.position);
6646
+ }
6647
+ };
6648
+ ConfigurableInputComponent.prototype.ngOnDestroy = function () {
6649
+ if (this.subscription) {
6650
+ this.subscription.unsubscribe();
6651
+ }
6652
+ };
6653
+ ConfigurableInputComponent.prototype.registerOnChange = function (fn) {
6654
+ this.onChange = fn;
6655
+ };
6656
+ ConfigurableInputComponent.prototype.registerOnTouched = function (fn) {
6657
+ this.onTouch = fn;
6658
+ };
6659
+ ConfigurableInputComponent.prototype.setDisabledState = function (isDisabled) {
6660
+ if (isDisabled) {
6661
+ this.form.disable();
6662
+ }
6663
+ else {
6664
+ this.form.enable();
6665
+ }
6666
+ };
6667
+ ConfigurableInputComponent.prototype.writeValue = function (value) {
6668
+ if (value) {
6669
+ this.form.patchValue(value);
6670
+ }
6671
+ };
6672
+ ConfigurableInputComponent.prototype.trackByName = function (index, arg) {
6673
+ return arg.name;
6674
+ };
6675
+ ConfigurableInputComponent.prototype.getArgDef = function (arg) {
6676
+ var _a;
6677
+ return (_a = this.operationDefinition) === null || _a === void 0 ? void 0 : _a.args.find(function (a) { return a.name === arg.name; });
6678
+ };
6679
+ ConfigurableInputComponent.prototype.createForm = function () {
6680
+ var e_1, _c;
6681
+ var _this = this;
6682
+ var _a, _b;
6683
+ if (!this.operation) {
6684
+ return;
6685
+ }
6686
+ if (this.subscription) {
6687
+ this.subscription.unsubscribe();
6688
+ }
6689
+ this.form = new forms.FormGroup({});
6690
+ this.form.__id = Math.random().toString(36).substr(10);
6691
+ if (this.operation.args) {
6692
+ var _loop_1 = function (arg) {
6693
+ var value = (_b = this_1.operation.args.find(function (a) { return a.name === arg.name; })) === null || _b === void 0 ? void 0 : _b.value;
6694
+ if (value === undefined) {
6695
+ value = getDefaultConfigArgValue(arg);
6696
+ }
6697
+ var validators = arg.list ? undefined : arg.required ? forms.Validators.required : undefined;
6698
+ this_1.form.addControl(arg.name, new forms.FormControl(value, validators));
6699
+ };
6700
+ var this_1 = this;
6701
+ try {
6702
+ for (var _d = __values(((_a = this.operationDefinition) === null || _a === void 0 ? void 0 : _a.args) || []), _e = _d.next(); !_e.done; _e = _d.next()) {
6703
+ var arg = _e.value;
6704
+ _loop_1(arg);
6705
+ }
6706
+ }
6707
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
6708
+ finally {
6709
+ try {
6710
+ if (_e && !_e.done && (_c = _d.return)) _c.call(_d);
6711
+ }
6712
+ finally { if (e_1) throw e_1.error; }
6713
+ }
6714
+ }
6715
+ this.subscription = this.form.valueChanges.subscribe(function (value) {
6716
+ if (_this.onChange) {
6717
+ _this.onChange({
6718
+ code: _this.operation && _this.operation.code,
6719
+ args: value,
6720
+ });
6721
+ }
6722
+ if (_this.onTouch) {
6723
+ _this.onTouch();
6724
+ }
6725
+ });
6726
+ };
6727
+ ConfigurableInputComponent.prototype.validate = function (c) {
6728
+ if (this.form.invalid) {
6729
+ return {
6730
+ required: true,
6731
+ };
6732
+ }
6733
+ return null;
6734
+ };
6735
+ return ConfigurableInputComponent;
6619
6736
  }());
6620
- NumberFormInputComponent.id = 'number-form-input';
6621
- NumberFormInputComponent.decorators = [
6737
+ ConfigurableInputComponent.decorators = [
6622
6738
  { type: i0.Component, args: [{
6623
- selector: 'vdr-number-form-input',
6624
- 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",
6739
+ selector: 'vdr-configurable-input',
6740
+ template: "<div class=\"card\" *ngIf=\"operation\">\r\n <div class=\"card-block\">{{ interpolateDescription() }}</div>\r\n <div class=\"card-block\" *ngIf=\"operation.args?.length\">\r\n <form [formGroup]=\"form\" *ngIf=\"operation\" class=\"operation-inputs\">\r\n <div *ngFor=\"let arg of operation.args; trackBy: trackByName\" class=\"arg-row\">\r\n <ng-container *ngIf=\"form.get(arg.name) && getArgDef(arg) as argDef\">\r\n <label class=\"clr-control-label\">{{ argDef.label || (arg.name | sentenceCase) }}</label>\r\n <vdr-help-tooltip\r\n class=\"mr3\"\r\n *ngIf=\"argDef.description\"\r\n [content]=\"argDef.description\"\r\n ></vdr-help-tooltip>\r\n <vdr-dynamic-form-input\r\n [def]=\"getArgDef(arg)\"\r\n [readonly]=\"readonly\"\r\n [control]=\"form.get(arg.name)\"\r\n [formControlName]=\"arg.name\"\r\n ></vdr-dynamic-form-input>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"!readonly && removable\">\r\n <button class=\"btn btn-sm btn-link btn-warning\" (click)=\"remove.emit(operation)\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n {{ 'common.remove' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n",
6625
6741
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6626
- styles: [""]
6742
+ providers: [
6743
+ {
6744
+ provide: forms.NG_VALUE_ACCESSOR,
6745
+ useExisting: ConfigurableInputComponent,
6746
+ multi: true,
6747
+ },
6748
+ {
6749
+ provide: forms.NG_VALIDATORS,
6750
+ useExisting: i0.forwardRef(function () { return ConfigurableInputComponent; }),
6751
+ multi: true,
6752
+ },
6753
+ ],
6754
+ styles: [":host{display:block;margin-bottom:12px}:host>.card{margin-top:6px}.operation-inputs{padding-top:0}.operation-inputs .arg-row:not(:last-child){margin-bottom:12px}.operation-inputs .arg-row{display:flex;flex-wrap:wrap;align-items:center}.operation-inputs .arg-row label{margin-right:6px}.operation-inputs .hidden{display:none}.operation-inputs label{min-width:130px;display:inline-block}\n"]
6627
6755
  },] }
6628
6756
  ];
6629
- NumberFormInputComponent.propDecorators = {
6630
- readonly: [{ type: i0.Input }]
6757
+ ConfigurableInputComponent.propDecorators = {
6758
+ operation: [{ type: i0.Input }],
6759
+ operationDefinition: [{ type: i0.Input }],
6760
+ readonly: [{ type: i0.Input }],
6761
+ removable: [{ type: i0.Input }],
6762
+ position: [{ type: i0.Input }],
6763
+ remove: [{ type: i0.Output }]
6631
6764
  };
6632
6765
 
6633
6766
  /**
6634
6767
  * @description
6635
- * Displays a password text input. Should be used with `string` type fields.
6768
+ * A special input used to display the "Combination mode" AND/OR toggle.
6636
6769
  *
6637
6770
  * @docsCategory custom-input-components
6638
6771
  * @docsPage default-inputs
6639
6772
  */
6640
- var PasswordFormInputComponent = /** @class */ (function () {
6641
- function PasswordFormInputComponent() {
6773
+ var CombinationModeFormInputComponent = /** @class */ (function () {
6774
+ function CombinationModeFormInputComponent(configurableInputComponent) {
6775
+ this.configurableInputComponent = configurableInputComponent;
6642
6776
  }
6643
- return PasswordFormInputComponent;
6777
+ CombinationModeFormInputComponent.prototype.ngOnInit = function () {
6778
+ var _this = this;
6779
+ var selectable$ = this.configurableInputComponent
6780
+ ? this.configurableInputComponent.positionChange$.pipe(operators.map(function (position) { return 0 < position; }))
6781
+ : rxjs.of(true);
6782
+ this.selectable$ = selectable$.pipe(operators.tap(function (selectable) {
6783
+ if (!selectable) {
6784
+ _this.formControl.setValue(true, { emitEvent: false });
6785
+ }
6786
+ }));
6787
+ };
6788
+ CombinationModeFormInputComponent.prototype.setCombinationModeAnd = function () {
6789
+ this.formControl.setValue(true);
6790
+ };
6791
+ CombinationModeFormInputComponent.prototype.setCombinationModeOr = function () {
6792
+ this.formControl.setValue(false);
6793
+ };
6794
+ return CombinationModeFormInputComponent;
6644
6795
  }());
6645
- PasswordFormInputComponent.id = 'password-form-input';
6646
- PasswordFormInputComponent.decorators = [
6796
+ CombinationModeFormInputComponent.id = 'combination-mode-form-input';
6797
+ CombinationModeFormInputComponent.decorators = [
6647
6798
  { type: i0.Component, args: [{
6648
- selector: 'vdr-password-form-input',
6649
- template: "<input\r\n type=\"password\"\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n/>\r\n",
6799
+ selector: 'vdr-combination-mode-form-input',
6800
+ template: "<ng-container *ngIf=\"selectable$ | async; else default\">\r\n <div class=\"btn-group btn-outline-primary btn-sm mode-select\">\r\n <button\r\n class=\"btn\"\r\n (click)=\"setCombinationModeAnd()\"\r\n [class.btn-primary]=\"formControl.value === true\"\r\n >\r\n {{ 'common.boolean-and' | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n (click)=\"setCombinationModeOr()\"\r\n [class.btn-primary]=\"formControl.value === false\"\r\n >\r\n {{ 'common.boolean-or' | translate }}\r\n </button>\r\n </div>\r\n</ng-container>\r\n<ng-template #default>\r\n <small>{{ 'common.not-applicable' | translate }}</small>\r\n</ng-template>\r\n",
6650
6801
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6651
- styles: [""]
6802
+ styles: [".mode-select{text-transform:uppercase}\n"]
6652
6803
  },] }
6653
- ];
6804
+ ];
6805
+ CombinationModeFormInputComponent.ctorParameters = function () { return [
6806
+ { type: ConfigurableInputComponent, decorators: [{ type: i0.Optional }] }
6807
+ ]; };
6654
6808
 
6655
6809
  /**
6656
6810
  * @description
6657
- * Allows the selection of multiple ProductVariants via an autocomplete select input.
6658
- * Should be used with `ID` type **list** fields which represent ProductVariant IDs.
6811
+ * An input for monetary values. Should be used with `int` type fields.
6659
6812
  *
6660
6813
  * @docsCategory custom-input-components
6661
6814
  * @docsPage default-inputs
6662
6815
  */
6663
- var ProductSelectorFormInputComponent = /** @class */ (function () {
6664
- function ProductSelectorFormInputComponent(dataService) {
6816
+ var CurrencyFormInputComponent = /** @class */ (function () {
6817
+ function CurrencyFormInputComponent(dataService) {
6665
6818
  this.dataService = dataService;
6666
- this.isListInput = true;
6819
+ this.currencyCode$ = this.dataService.settings
6820
+ .getActiveChannel()
6821
+ .mapStream(function (data) { return data.activeChannel.currencyCode; });
6667
6822
  }
6668
- ProductSelectorFormInputComponent.prototype.ngOnInit = function () {
6669
- var _this = this;
6670
- this.formControl.setValidators([
6671
- function (control) {
6672
- if (!control.value || !control.value.length) {
6673
- return {
6674
- atLeastOne: { length: control.value.length },
6675
- };
6676
- }
6677
- return null;
6678
- },
6679
- ]);
6680
- this.selection$ = this.formControl.valueChanges.pipe(operators.startWith(this.formControl.value), operators.switchMap(function (value) {
6681
- if (Array.isArray(value) && 0 < value.length) {
6682
- return rxjs.forkJoin(value.map(function (id) { return _this.dataService.product
6683
- .getProductVariant(id)
6684
- .mapSingle(function (data) { return data.productVariant; }); }));
6685
- }
6686
- return rxjs.of([]);
6687
- }), operators.map(function (variants) { return variants.filter(sharedUtils.notNullOrUndefined); }));
6688
- };
6689
- ProductSelectorFormInputComponent.prototype.addProductVariant = function (product) {
6690
- var value = this.formControl.value;
6691
- this.formControl.setValue(__spreadArray([], __read(new Set(__spreadArray(__spreadArray([], __read(value)), [product.productVariantId])))));
6692
- };
6693
- ProductSelectorFormInputComponent.prototype.removeProductVariant = function (id) {
6694
- var value = this.formControl.value;
6695
- this.formControl.setValue(value.filter(function (_id) { return _id !== id; }));
6696
- };
6697
- return ProductSelectorFormInputComponent;
6823
+ return CurrencyFormInputComponent;
6698
6824
  }());
6699
- ProductSelectorFormInputComponent.id = 'product-selector-form-input';
6700
- ProductSelectorFormInputComponent.decorators = [
6825
+ CurrencyFormInputComponent.id = 'currency-form-input';
6826
+ CurrencyFormInputComponent.decorators = [
6701
6827
  { type: i0.Component, args: [{
6702
- selector: 'vdr-product-selector-form-input',
6703
- template: "<ul class=\"list-unstyled\">\r\n <li *ngFor=\"let variant of selection$ | async\" class=\"variant\">\r\n <div class=\"thumb\">\r\n <img [src]=\"variant.product.featuredAsset | assetPreview: 32\" />\r\n </div>\r\n <div class=\"detail\">\r\n <div>{{ variant.name }}</div>\r\n <div class=\"sku\">{{ variant.sku }}</div>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <button\r\n class=\"btn btn-link btn-sm btn-warning\"\r\n (click)=\"removeProductVariant(variant.id)\"\r\n [title]=\"'common.remove-item-from-list' | translate\"\r\n >\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n </li>\r\n</ul>\r\n<vdr-product-selector (productSelected)=\"addProductVariant($event)\"></vdr-product-selector>\r\n",
6828
+ selector: 'vdr-currency-form-input',
6829
+ template: "<vdr-currency-input\r\n [formControl]=\"formControl\"\r\n [readonly]=\"readonly\"\r\n [currencyCode]=\"currencyCode$ | async\"\r\n></vdr-currency-input>\r\n",
6704
6830
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6705
- styles: [".variant{margin-bottom:6px;display:flex;align-items:center;transition:background-color .2s}.variant:hover{background-color:var(--color-component-bg-200)}.thumb{margin-right:6px}.sku{color:var(--color-grey-400);font-size:smaller;line-height:1em}\n"]
6831
+ styles: [""]
6706
6832
  },] }
6707
6833
  ];
6708
- ProductSelectorFormInputComponent.ctorParameters = function () { return [
6834
+ CurrencyFormInputComponent.ctorParameters = function () { return [
6709
6835
  { type: DataService }
6710
- ]; };
6836
+ ]; };
6837
+ CurrencyFormInputComponent.propDecorators = {
6838
+ readonly: [{ type: i0.Input }]
6839
+ };
6711
6840
 
6712
6841
  /**
6713
6842
  * @description
6714
- * The default input component for `relation` type custom fields. Allows the selection
6715
- * of a ProductVariant, Product, Customer or Asset. For other entity types, a custom
6716
- * implementation will need to be defined. See {@link registerFormInputComponent}.
6843
+ * Allows the selection of a Customer via an autocomplete select input.
6844
+ * Should be used with `ID` type fields which represent Customer IDs.
6717
6845
  *
6718
6846
  * @docsCategory custom-input-components
6719
6847
  * @docsPage default-inputs
6720
6848
  */
6721
- var RelationFormInputComponent = /** @class */ (function () {
6722
- function RelationFormInputComponent() {
6849
+ var CustomerGroupFormInputComponent = /** @class */ (function () {
6850
+ function CustomerGroupFormInputComponent(dataService) {
6851
+ this.dataService = dataService;
6723
6852
  }
6724
- return RelationFormInputComponent;
6853
+ CustomerGroupFormInputComponent.prototype.ngOnInit = function () {
6854
+ this.customerGroups$ = this.dataService.customer
6855
+ .getCustomerGroupList({
6856
+ take: 1000,
6857
+ })
6858
+ .mapSingle(function (res) { return res.customerGroups.items; })
6859
+ .pipe(operators.startWith([]));
6860
+ };
6861
+ CustomerGroupFormInputComponent.prototype.selectGroup = function (group) {
6862
+ this.formControl.setValue(group.id);
6863
+ };
6864
+ return CustomerGroupFormInputComponent;
6725
6865
  }());
6726
- RelationFormInputComponent.id = 'relation-form-input';
6727
- RelationFormInputComponent.decorators = [
6866
+ CustomerGroupFormInputComponent.id = 'customer-group-form-input';
6867
+ CustomerGroupFormInputComponent.decorators = [
6728
6868
  { type: i0.Component, args: [{
6729
- selector: 'vdr-relation-form-input',
6730
- template: "<div [ngSwitch]=\"config.entity\">\r\n <vdr-relation-asset-input\r\n *ngSwitchCase=\"'Asset'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-asset-input>\r\n <vdr-relation-product-input\r\n *ngSwitchCase=\"'Product'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-product-input>\r\n <vdr-relation-customer-input\r\n *ngSwitchCase=\"'Customer'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-customer-input>\r\n <vdr-relation-product-variant-input\r\n *ngSwitchCase=\"'ProductVariant'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-product-variant-input>\r\n <ng-template ngSwitchDefault>\r\n <vdr-relation-generic-input\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-generic-input>\r\n </ng-template>\r\n</div>\r\n",
6869
+ selector: 'vdr-customer-group-form-input',
6870
+ template: "<ng-select\r\n [items]=\"customerGroups$ | async\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"false\"\r\n bindValue=\"id\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n [ngModel]=\"formControl.value\"\r\n (change)=\"selectGroup($event)\"\r\n>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n</ng-select>\r\n",
6731
6871
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6732
- styles: [":host{display:block;background-color:var(--color-component-bg-200);padding:3px}\n"]
6872
+ styles: [""]
6733
6873
  },] }
6734
6874
  ];
6735
- RelationFormInputComponent.propDecorators = {
6875
+ CustomerGroupFormInputComponent.ctorParameters = function () { return [
6876
+ { type: DataService }
6877
+ ]; };
6878
+ CustomerGroupFormInputComponent.propDecorators = {
6736
6879
  readonly: [{ type: i0.Input }]
6737
6880
  };
6738
6881
 
6739
6882
  /**
6740
6883
  * @description
6741
- * Uses the {@link RichTextEditorComponent} as in input for `text` type fields.
6884
+ * Allows selection of a datetime. Default input for `datetime` type fields.
6742
6885
  *
6743
6886
  * @docsCategory custom-input-components
6744
6887
  * @docsPage default-inputs
6745
6888
  */
6746
- var RichTextFormInputComponent = /** @class */ (function () {
6747
- function RichTextFormInputComponent() {
6889
+ var DateFormInputComponent = /** @class */ (function () {
6890
+ function DateFormInputComponent() {
6748
6891
  }
6749
- return RichTextFormInputComponent;
6892
+ Object.defineProperty(DateFormInputComponent.prototype, "min", {
6893
+ get: function () {
6894
+ var _a;
6895
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
6896
+ },
6897
+ enumerable: false,
6898
+ configurable: true
6899
+ });
6900
+ Object.defineProperty(DateFormInputComponent.prototype, "max", {
6901
+ get: function () {
6902
+ var _a;
6903
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
6904
+ },
6905
+ enumerable: false,
6906
+ configurable: true
6907
+ });
6908
+ Object.defineProperty(DateFormInputComponent.prototype, "yearRange", {
6909
+ get: function () {
6910
+ var _a;
6911
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.yearRange) || this.config.yearRange;
6912
+ },
6913
+ enumerable: false,
6914
+ configurable: true
6915
+ });
6916
+ return DateFormInputComponent;
6750
6917
  }());
6751
- RichTextFormInputComponent.id = 'rich-text-form-input';
6752
- RichTextFormInputComponent.decorators = [
6918
+ DateFormInputComponent.id = 'date-form-input';
6919
+ DateFormInputComponent.decorators = [
6753
6920
  { type: i0.Component, args: [{
6754
- selector: 'vdr-rich-text-form-input',
6755
- template: "<vdr-rich-text-editor\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n></vdr-rich-text-editor>\r\n",
6921
+ selector: 'vdr-date-form-input',
6922
+ 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",
6756
6923
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6757
- styles: [":host textarea{resize:both;height:6rem;width:100%}\n"]
6924
+ styles: [""]
6758
6925
  },] }
6759
- ];
6926
+ ];
6927
+ DateFormInputComponent.propDecorators = {
6928
+ readonly: [{ type: i0.Input }]
6929
+ };
6760
6930
 
6761
6931
  /**
6762
6932
  * @description
6763
- * Uses a select input to allow the selection of a string value. Should be used with
6764
- * `string` type fields with options.
6933
+ * Allows the selection of multiple FacetValues via an autocomplete select input.
6934
+ * Should be used with `ID` type **list** fields which represent FacetValue IDs.
6765
6935
  *
6766
6936
  * @docsCategory custom-input-components
6767
6937
  * @docsPage default-inputs
6768
6938
  */
6769
- var SelectFormInputComponent = /** @class */ (function () {
6770
- function SelectFormInputComponent() {
6939
+ var FacetValueFormInputComponent = /** @class */ (function () {
6940
+ function FacetValueFormInputComponent(dataService) {
6941
+ this.dataService = dataService;
6942
+ this.isListInput = true;
6771
6943
  }
6772
- Object.defineProperty(SelectFormInputComponent.prototype, "options", {
6773
- get: function () {
6774
- var _a;
6775
- return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.options) || this.config.options;
6776
- },
6777
- enumerable: false,
6778
- configurable: true
6779
- });
6780
- return SelectFormInputComponent;
6944
+ FacetValueFormInputComponent.prototype.ngOnInit = function () {
6945
+ this.facets$ = this.dataService.facet
6946
+ .getAllFacets()
6947
+ .mapSingle(function (data) { return data.facets.items; })
6948
+ .pipe(operators.shareReplay(1));
6949
+ };
6950
+ return FacetValueFormInputComponent;
6781
6951
  }());
6782
- SelectFormInputComponent.id = 'select-form-input';
6783
- SelectFormInputComponent.decorators = [
6952
+ FacetValueFormInputComponent.id = 'facet-value-form-input';
6953
+ FacetValueFormInputComponent.decorators = [
6784
6954
  { type: i0.Component, args: [{
6785
- selector: 'vdr-select-form-input',
6786
- template: "<select clrSelect [formControl]=\"formControl\" [vdrDisabled]=\"readonly\">\r\n <option *ngIf=\"config.nullable\" [ngValue]=\"null\"></option>\r\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\r\n {{ (option | customFieldLabel) || option.label || option.value }}\r\n </option>\r\n</select>\r\n",
6955
+ selector: 'vdr-facet-value-form-input',
6956
+ template: "<vdr-facet-value-selector\r\n *ngIf=\"facets$ | async as facets\"\r\n [readonly]=\"readonly\"\r\n [facets]=\"facets\"\r\n [formControl]=\"formControl\"\r\n></vdr-facet-value-selector>\r\n",
6787
6957
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6788
- styles: ["select{width:100%}\n"]
6958
+ styles: [""]
6789
6959
  },] }
6790
6960
  ];
6791
- SelectFormInputComponent.propDecorators = {
6792
- readonly: [{ type: i0.Input }]
6793
- };
6961
+ FacetValueFormInputComponent.ctorParameters = function () { return [
6962
+ { type: DataService }
6963
+ ]; };
6794
6964
 
6795
6965
  /**
6796
6966
  * @description
6797
- * Uses a regular text form input. This is the default input for `string` and `localeString` type fields.
6967
+ * Displays a number input. Default input for `int` and `float` type fields.
6798
6968
  *
6799
6969
  * @docsCategory custom-input-components
6800
6970
  * @docsPage default-inputs
6801
6971
  */
6802
- var TextFormInputComponent = /** @class */ (function () {
6803
- function TextFormInputComponent() {
6972
+ var NumberFormInputComponent = /** @class */ (function () {
6973
+ function NumberFormInputComponent() {
6804
6974
  }
6805
- Object.defineProperty(TextFormInputComponent.prototype, "prefix", {
6975
+ Object.defineProperty(NumberFormInputComponent.prototype, "prefix", {
6806
6976
  get: function () {
6807
6977
  var _a;
6808
6978
  return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.prefix) || this.config.prefix;
@@ -6810,7 +6980,7 @@
6810
6980
  enumerable: false,
6811
6981
  configurable: true
6812
6982
  });
6813
- Object.defineProperty(TextFormInputComponent.prototype, "suffix", {
6983
+ Object.defineProperty(NumberFormInputComponent.prototype, "suffix", {
6814
6984
  get: function () {
6815
6985
  var _a;
6816
6986
  return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.suffix) || this.config.suffix;
@@ -6818,488 +6988,969 @@
6818
6988
  enumerable: false,
6819
6989
  configurable: true
6820
6990
  });
6821
- return TextFormInputComponent;
6991
+ Object.defineProperty(NumberFormInputComponent.prototype, "min", {
6992
+ get: function () {
6993
+ var _a;
6994
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.min) || this.config.min;
6995
+ },
6996
+ enumerable: false,
6997
+ configurable: true
6998
+ });
6999
+ Object.defineProperty(NumberFormInputComponent.prototype, "max", {
7000
+ get: function () {
7001
+ var _a;
7002
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.max) || this.config.max;
7003
+ },
7004
+ enumerable: false,
7005
+ configurable: true
7006
+ });
7007
+ Object.defineProperty(NumberFormInputComponent.prototype, "step", {
7008
+ get: function () {
7009
+ var _a;
7010
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.step) || this.config.step;
7011
+ },
7012
+ enumerable: false,
7013
+ configurable: true
7014
+ });
7015
+ return NumberFormInputComponent;
6822
7016
  }());
6823
- TextFormInputComponent.id = 'text-form-input';
6824
- TextFormInputComponent.decorators = [
7017
+ NumberFormInputComponent.id = 'number-form-input';
7018
+ NumberFormInputComponent.decorators = [
6825
7019
  { type: i0.Component, args: [{
6826
- selector: 'vdr-text-form-input',
6827
- 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",
7020
+ selector: 'vdr-number-form-input',
7021
+ 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",
6828
7022
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6829
- styles: ["input{width:100%}\n"]
7023
+ styles: [""]
6830
7024
  },] }
6831
- ];
7025
+ ];
7026
+ NumberFormInputComponent.propDecorators = {
7027
+ readonly: [{ type: i0.Input }]
7028
+ };
6832
7029
 
6833
7030
  /**
6834
7031
  * @description
6835
- * Uses textarea form input. This is the default input for `text` type fields.
7032
+ * Displays a password text input. Should be used with `string` type fields.
6836
7033
  *
6837
7034
  * @docsCategory custom-input-components
6838
7035
  * @docsPage default-inputs
6839
7036
  */
6840
- var TextareaFormInputComponent = /** @class */ (function () {
6841
- function TextareaFormInputComponent() {
7037
+ var PasswordFormInputComponent = /** @class */ (function () {
7038
+ function PasswordFormInputComponent() {
6842
7039
  }
6843
- Object.defineProperty(TextareaFormInputComponent.prototype, "spellcheck", {
6844
- get: function () {
6845
- return this.config.spellcheck === true;
6846
- },
6847
- enumerable: false,
6848
- configurable: true
6849
- });
6850
- return TextareaFormInputComponent;
7040
+ return PasswordFormInputComponent;
6851
7041
  }());
6852
- TextareaFormInputComponent.id = 'textarea-form-input';
6853
- TextareaFormInputComponent.decorators = [
7042
+ PasswordFormInputComponent.id = 'password-form-input';
7043
+ PasswordFormInputComponent.decorators = [
6854
7044
  { type: i0.Component, args: [{
6855
- selector: 'vdr-textarea-form-input',
6856
- template: "<textarea [spellcheck]=\"spellcheck\" autocomplete=\"off\" autocorrect=\"off\"\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n></textarea>\r\n",
7045
+ selector: 'vdr-password-form-input',
7046
+ template: "<input\r\n type=\"password\"\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n/>\r\n",
6857
7047
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
6858
- styles: [":host textarea{resize:both;height:6rem;width:100%}\n"]
7048
+ styles: [""]
6859
7049
  },] }
6860
7050
  ];
6861
7051
 
6862
- var defaultFormInputs = [
6863
- BooleanFormInputComponent,
6864
- CurrencyFormInputComponent,
6865
- DateFormInputComponent,
6866
- FacetValueFormInputComponent,
6867
- NumberFormInputComponent,
6868
- SelectFormInputComponent,
6869
- TextFormInputComponent,
6870
- ProductSelectorFormInputComponent,
6871
- CustomerGroupFormInputComponent,
6872
- PasswordFormInputComponent,
6873
- RelationFormInputComponent,
6874
- TextareaFormInputComponent,
6875
- RichTextFormInputComponent,
6876
- JsonEditorFormInputComponent,
6877
- ];
6878
7052
  /**
6879
7053
  * @description
6880
- * Registers a custom FormInputComponent which can be used to control the argument inputs
6881
- * of a {@link ConfigurableOperationDef} (e.g. CollectionFilter, ShippingMethod etc) or for
6882
- * a custom field.
6883
- *
6884
- * @example
6885
- * ```TypeScript
6886
- * \@NgModule({
6887
- * imports: [SharedModule],
6888
- * declarations: [MyCustomFieldControl],
6889
- * providers: [
6890
- * registerFormInputComponent('my-custom-input', MyCustomFieldControl),
6891
- * ],
6892
- * })
6893
- * export class MyUiExtensionModule {}
6894
- * ```
6895
- *
6896
- * This input component can then be used in a custom field:
6897
- *
6898
- * @example
6899
- * ```TypeScript
6900
- * const config = {
6901
- * // ...
6902
- * customFields: {
6903
- * ProductVariant: [
6904
- * {
6905
- * name: 'rrp',
6906
- * type: 'int',
6907
- * ui: { component: 'my-custom-input' },
6908
- * },
6909
- * ]
6910
- * }
6911
- * }
6912
- * ```
6913
- *
6914
- * or with an argument of a {@link ConfigurableOperationDef}:
6915
- *
6916
- * @example
6917
- * ```TypeScript
6918
- * args: {
6919
- * rrp: { type: 'int', ui: { component: 'my-custom-input' } },
6920
- * }
6921
- * ```
6922
- *
6923
- * @docsCategory custom-input-components
7054
+ * A helper class used to manage selection of list items. Supports multiple selection via
7055
+ * cmd/ctrl/shift key.
6924
7056
  */
6925
- function registerFormInputComponent(id, component) {
6926
- return {
6927
- provide: i0.APP_INITIALIZER,
6928
- multi: true,
6929
- useFactory: function (registry) { return function () {
6930
- registry.registerInputComponent(id, component);
6931
- }; },
6932
- deps: [ComponentRegistryService],
7057
+ var SelectionManager = /** @class */ (function () {
7058
+ function SelectionManager(options) {
7059
+ this.options = options;
7060
+ this._selection = [];
7061
+ this.items = [];
7062
+ }
7063
+ Object.defineProperty(SelectionManager.prototype, "selection", {
7064
+ get: function () {
7065
+ return this._selection;
7066
+ },
7067
+ enumerable: false,
7068
+ configurable: true
7069
+ });
7070
+ SelectionManager.prototype.setMultiSelect = function (isMultiSelect) {
7071
+ this.options.multiSelect = isMultiSelect;
6933
7072
  };
6934
- }
6935
- /**
6936
- * @description
6937
- * **Deprecated** use `registerFormInputComponent()` in combination with the customField `ui` config instead.
6938
- *
6939
- * Registers a custom component to act as the form input control for the given custom field.
6940
- * This should be used in the NgModule `providers` array of your ui extension module.
6941
- *
6942
- * @example
6943
- * ```TypeScript
6944
- * \@NgModule({
6945
- * imports: [SharedModule],
6946
- * declarations: [MyCustomFieldControl],
6947
- * providers: [
6948
- * registerCustomFieldComponent('Product', 'someCustomField', MyCustomFieldControl),
6949
- * ],
6950
- * })
6951
- * export class MyUiExtensionModule {}
6952
- * ```
6953
- *
6954
- * @deprecated use `registerFormInputComponent()` in combination with the customField `ui` config instead.
6955
- *
6956
- * @docsCategory custom-input-components
6957
- */
6958
- function registerCustomFieldComponent(entity, fieldName, component) {
6959
- return {
6960
- provide: i0.APP_INITIALIZER,
6961
- multi: true,
6962
- useFactory: function (customFieldComponentService) { return function () {
6963
- customFieldComponentService.registerCustomFieldComponent(entity, fieldName, component);
6964
- }; },
6965
- deps: [CustomFieldComponentService],
7073
+ SelectionManager.prototype.setCurrentItems = function (items) {
7074
+ this.items = items;
6966
7075
  };
6967
- }
6968
- /**
6969
- * Registers the default form input components.
6970
- */
6971
- function registerDefaultFormInputs() {
6972
- return defaultFormInputs.map(function (cmp) { return registerFormInputComponent(cmp.id, cmp); });
6973
- }
7076
+ SelectionManager.prototype.toggleSelection = function (item, event) {
7077
+ var _a;
7078
+ var _this = this;
7079
+ var _b = this.options, multiSelect = _b.multiSelect, itemsAreEqual = _b.itemsAreEqual, additiveMode = _b.additiveMode;
7080
+ var index = this._selection.findIndex(function (a) { return itemsAreEqual(a, item); });
7081
+ if (multiSelect && (event === null || event === void 0 ? void 0 : event.shiftKey) && 1 <= this._selection.length) {
7082
+ var lastSelection_1 = this._selection[this._selection.length - 1];
7083
+ var lastSelectionIndex = this.items.findIndex(function (a) { return itemsAreEqual(a, lastSelection_1); });
7084
+ var currentIndex = this.items.findIndex(function (a) { return itemsAreEqual(a, item); });
7085
+ var start = currentIndex < lastSelectionIndex ? currentIndex : lastSelectionIndex;
7086
+ var end = currentIndex > lastSelectionIndex ? currentIndex + 1 : lastSelectionIndex;
7087
+ (_a = this._selection).push.apply(_a, __spreadArray([], __read(this.items.slice(start, end).filter(function (a) { return !_this._selection.find(function (s) { return itemsAreEqual(a, s); }); }))));
7088
+ }
7089
+ else if (index === -1) {
7090
+ if (multiSelect && ((event === null || event === void 0 ? void 0 : event.ctrlKey) || (event === null || event === void 0 ? void 0 : event.shiftKey) || additiveMode)) {
7091
+ this._selection.push(item);
7092
+ }
7093
+ else {
7094
+ this._selection = [item];
7095
+ }
7096
+ }
7097
+ else {
7098
+ if (multiSelect && (event === null || event === void 0 ? void 0 : event.ctrlKey)) {
7099
+ this._selection.splice(index, 1);
7100
+ }
7101
+ else if (1 < this._selection.length && !additiveMode) {
7102
+ this._selection = [item];
7103
+ }
7104
+ else {
7105
+ this._selection.splice(index, 1);
7106
+ }
7107
+ }
7108
+ // Make the selection mutable
7109
+ this._selection = this._selection.map(function (x) { return (Object.assign({}, x)); });
7110
+ };
7111
+ SelectionManager.prototype.selectMultiple = function (items) {
7112
+ this._selection = items;
7113
+ };
7114
+ SelectionManager.prototype.isSelected = function (item) {
7115
+ var _this = this;
7116
+ return !!this._selection.find(function (a) { return _this.options.itemsAreEqual(a, item); });
7117
+ };
7118
+ SelectionManager.prototype.lastSelected = function () {
7119
+ return this._selection[this._selection.length - 1];
7120
+ };
7121
+ return SelectionManager;
7122
+ }());
6974
7123
 
6975
- var ActionBarItemsComponent = /** @class */ (function () {
6976
- function ActionBarItemsComponent(navBuilderService, route, dataService, notificationService) {
6977
- this.navBuilderService = navBuilderService;
6978
- this.route = route;
7124
+ var ProductMultiSelectorDialogComponent = /** @class */ (function () {
7125
+ function ProductMultiSelectorDialogComponent(dataService, changeDetector) {
6979
7126
  this.dataService = dataService;
6980
- this.notificationService = notificationService;
6981
- this.locationId$ = new rxjs.BehaviorSubject('');
7127
+ this.changeDetector = changeDetector;
7128
+ this.mode = 'product';
7129
+ this.initialSelectionIds = [];
7130
+ this.searchTerm$ = new rxjs.BehaviorSubject('');
7131
+ this.searchFacetValueIds$ = new rxjs.BehaviorSubject([]);
7132
+ this.paginationConfig = {
7133
+ currentPage: 1,
7134
+ itemsPerPage: 25,
7135
+ totalItems: 1,
7136
+ };
7137
+ this.paginationConfig$ = new rxjs.BehaviorSubject(this.paginationConfig);
6982
7138
  }
6983
- ActionBarItemsComponent.prototype.ngOnInit = function () {
6984
- this.items$ = rxjs.combineLatest(this.navBuilderService.actionBarConfig$, this.locationId$).pipe(operators.map(function (_a) {
6985
- var _b = __read(_a, 2), items = _b[0], locationId = _b[1];
6986
- return items.filter(function (config) { return config.locationId === locationId; });
6987
- }));
6988
- };
6989
- ActionBarItemsComponent.prototype.ngOnChanges = function (changes) {
6990
- if ('locationId' in changes) {
6991
- this.locationId$.next(changes['locationId'].currentValue);
6992
- }
6993
- };
6994
- ActionBarItemsComponent.prototype.handleClick = function (event, item) {
6995
- if (typeof item.onClick === 'function') {
6996
- item.onClick(event, {
6997
- route: this.route,
6998
- dataService: this.dataService,
6999
- notificationService: this.notificationService,
7139
+ ProductMultiSelectorDialogComponent.prototype.ngOnInit = function () {
7140
+ var _this = this;
7141
+ var idFn = this.mode === 'product'
7142
+ ? function (a, b) { return a.productId === b.productId; }
7143
+ : function (a, b) { return a.productVariantId === b.productVariantId; };
7144
+ this.selectionManager = new SelectionManager({
7145
+ multiSelect: true,
7146
+ itemsAreEqual: idFn,
7147
+ additiveMode: true,
7148
+ });
7149
+ var searchQueryResult = this.dataService.product.searchProducts('', this.paginationConfig.itemsPerPage, 0);
7150
+ var result$ = rxjs.combineLatest(this.searchTerm$, this.searchFacetValueIds$, this.paginationConfig$).subscribe(function (_a) {
7151
+ var _b = __read(_a, 3), term = _b[0], facetValueIds = _b[1], pagination = _b[2];
7152
+ var take = +pagination.itemsPerPage;
7153
+ var skip = (pagination.currentPage - 1) * take;
7154
+ return searchQueryResult.ref.refetch({
7155
+ input: { skip: skip, take: take, term: term, facetValueIds: facetValueIds, groupByProduct: _this.mode === 'product' },
7000
7156
  });
7157
+ });
7158
+ this.items$ = searchQueryResult.stream$.pipe(operators.tap(function (data) {
7159
+ _this.paginationConfig.totalItems = data.search.totalItems;
7160
+ _this.selectionManager.setCurrentItems(data.search.items);
7161
+ }), operators.map(function (data) { return data.search.items; }));
7162
+ this.facetValues$ = searchQueryResult.stream$.pipe(operators.map(function (data) { return data.search.facetValues; }));
7163
+ if (this.initialSelectionIds.length) {
7164
+ if (this.mode === 'product') {
7165
+ this.dataService.product
7166
+ .getProducts({
7167
+ filter: {
7168
+ id: {
7169
+ in: this.initialSelectionIds,
7170
+ },
7171
+ },
7172
+ })
7173
+ .single$.subscribe(function (_a) {
7174
+ var products = _a.products;
7175
+ _this.selectionManager.selectMultiple(products.items.map(function (product) { return ({
7176
+ productId: product.id,
7177
+ productName: product.name,
7178
+ }); }));
7179
+ _this.changeDetector.markForCheck();
7180
+ });
7181
+ }
7182
+ else {
7183
+ this.dataService.product
7184
+ .getProductVariants({
7185
+ filter: {
7186
+ id: {
7187
+ in: this.initialSelectionIds,
7188
+ },
7189
+ },
7190
+ })
7191
+ .single$.subscribe(function (_a) {
7192
+ var productVariants = _a.productVariants;
7193
+ _this.selectionManager.selectMultiple(productVariants.items.map(function (variant) { return ({
7194
+ productVariantId: variant.id,
7195
+ productVariantName: variant.name,
7196
+ }); }));
7197
+ _this.changeDetector.markForCheck();
7198
+ });
7199
+ }
7001
7200
  }
7002
7201
  };
7003
- ActionBarItemsComponent.prototype.getRouterLink = function (item) {
7004
- return this.navBuilderService.getRouterLink(item, this.route);
7202
+ ProductMultiSelectorDialogComponent.prototype.trackByFn = function (index, item) {
7203
+ return item.productId;
7005
7204
  };
7006
- ActionBarItemsComponent.prototype.getButtonStyles = function (item) {
7007
- var styles = ['btn'];
7008
- if (item.buttonStyle && item.buttonStyle === 'link') {
7009
- styles.push('btn-link');
7010
- return styles;
7011
- }
7012
- styles.push(this.getButtonColorClass(item));
7013
- return styles;
7205
+ ProductMultiSelectorDialogComponent.prototype.setSearchTerm = function (term) {
7206
+ this.searchTerm$.next(term);
7014
7207
  };
7015
- ActionBarItemsComponent.prototype.getButtonColorClass = function (item) {
7016
- switch (item.buttonColor) {
7017
- case undefined:
7018
- case 'primary':
7019
- return item.buttonStyle === 'outline' ? 'btn-outline' : 'btn-primary';
7020
- case 'success':
7021
- return item.buttonStyle === 'outline' ? 'btn-success-outline' : 'btn-success';
7022
- case 'warning':
7023
- return item.buttonStyle === 'outline' ? 'btn-warning-outline' : 'btn-warning';
7024
- default:
7025
- sharedUtils.assertNever(item.buttonColor);
7026
- return '';
7027
- }
7208
+ ProductMultiSelectorDialogComponent.prototype.setFacetValueIds = function (ids) {
7209
+ this.searchFacetValueIds$.next(ids);
7028
7210
  };
7029
- return ActionBarItemsComponent;
7211
+ ProductMultiSelectorDialogComponent.prototype.toggleSelection = function (item, event) {
7212
+ this.selectionManager.toggleSelection(item, event);
7213
+ };
7214
+ ProductMultiSelectorDialogComponent.prototype.clearSelection = function () {
7215
+ this.selectionManager.selectMultiple([]);
7216
+ };
7217
+ ProductMultiSelectorDialogComponent.prototype.isSelected = function (item) {
7218
+ return this.selectionManager.isSelected(item);
7219
+ };
7220
+ ProductMultiSelectorDialogComponent.prototype.entityInfoClick = function (event) {
7221
+ event.preventDefault();
7222
+ event.stopPropagation();
7223
+ };
7224
+ ProductMultiSelectorDialogComponent.prototype.pageChange = function (page) {
7225
+ this.paginationConfig.currentPage = page;
7226
+ this.paginationConfig$.next(this.paginationConfig);
7227
+ };
7228
+ ProductMultiSelectorDialogComponent.prototype.itemsPerPageChange = function (itemsPerPage) {
7229
+ this.paginationConfig.itemsPerPage = itemsPerPage;
7230
+ this.paginationConfig$.next(this.paginationConfig);
7231
+ };
7232
+ ProductMultiSelectorDialogComponent.prototype.select = function () {
7233
+ this.resolveWith(this.selectionManager.selection);
7234
+ };
7235
+ ProductMultiSelectorDialogComponent.prototype.cancel = function () {
7236
+ this.resolveWith();
7237
+ };
7238
+ return ProductMultiSelectorDialogComponent;
7030
7239
  }());
7031
- ActionBarItemsComponent.decorators = [
7240
+ ProductMultiSelectorDialogComponent.decorators = [
7032
7241
  { type: i0.Component, args: [{
7033
- selector: 'vdr-action-bar-items',
7034
- 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",
7242
+ selector: 'vdr-product-multi-selector-dialog',
7243
+ template: "<ng-template vdrDialogTitle>\r\n <div class=\"title-row\">\r\n <span *ngIf=\"mode === 'product'\">{{ 'common.select-products' | translate }}</span>\r\n <span *ngIf=\"mode === 'variant'\">{{ 'common.select-variants' | translate }}</span>\r\n </div>\r\n</ng-template>\r\n<vdr-product-search-input\r\n #productSearchInputComponent\r\n [facetValueResults]=\"facetValues$ | async\"\r\n (searchTermChange)=\"setSearchTerm($event)\"\r\n (facetValueChange)=\"setFacetValueIds($event)\"\r\n></vdr-product-search-input>\r\n<div class=\"flex-wrapper\">\r\n <div class=\"gallery\">\r\n <div\r\n class=\"card\"\r\n *ngFor=\"let item of (items$ | async) || [] | paginate: paginationConfig; trackBy: trackByFn\"\r\n (click)=\"toggleSelection(item, $event)\"\r\n [class.selected]=\"isSelected(item)\"\r\n >\r\n <div class=\"card-img\">\r\n <vdr-select-toggle\r\n [selected]=\"isSelected(item)\"\r\n [disabled]=\"true\"\r\n [hiddenWhenOff]=\"true\"\r\n ></vdr-select-toggle>\r\n <img\r\n [src]=\"\r\n (mode === 'product'\r\n ? item.productAsset\r\n : item.productVariantAsset || item.productAsset\r\n ) | assetPreview: 'thumb'\r\n \"\r\n />\r\n </div>\r\n <div class=\"detail\">\r\n <span [title]=\"mode === 'product' ? item.productName : item.productVariantName\">{{\r\n mode === 'product' ? item.productName : item.productVariantName\r\n }}</span>\r\n <div *ngIf=\"mode === 'variant'\"><small>{{ item.sku }}</small></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"selection\">\r\n <div class=\"m2 flex center\">\r\n <div>\r\n {{ 'common.items-selected-count' | translate: { count: selectionManager.selection.length } }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <button class=\"btn btn-sm btn-link\" (click)=\"clearSelection()\">\r\n <cds-icon shape=\"times\"></cds-icon> {{ 'common.clear-selection' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"selected-items\">\r\n <div *ngFor=\"let item of selectionManager.selection\" class=\"flex item-row\">\r\n <div class=\"\">{{ mode === 'product' ? item.productName : item.productVariantName }}</div>\r\n <div class=\"flex-spacer\"></div>\r\n <div>\r\n <button class=\"icon-button\" (click)=\"toggleSelection(item, $event)\">\r\n <cds-icon shape=\"times\"></cds-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"paging-controls\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"paginationConfig.itemsPerPage\"\r\n (itemsPerPageChange)=\"itemsPerPageChange($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [currentPage]=\"paginationConfig.currentPage\"\r\n [itemsPerPage]=\"paginationConfig.itemsPerPage\"\r\n [totalItems]=\"paginationConfig.totalItems\"\r\n (pageChange)=\"pageChange($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n\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)=\"select()\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"selectionManager.selection.length === 0\"\r\n >\r\n {{ 'common.select-items-with-count' | translate: { count: selectionManager.selection.length } }}\r\n </button>\r\n</ng-template>\r\n",
7035
7244
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7036
- styles: [":host{display:inline-block;min-height:36px}\n"]
7245
+ styles: [":host{display:flex;flex-direction:column;flex-direction:1;height:70vh}.flex-wrapper{display:flex;overflow-y:hidden}.gallery{flex:1;display:grid;grid-template-columns:repeat(auto-fill,125px);grid-template-rows:repeat(auto-fill,200px);grid-gap:10px 20px;padding-left:12px;padding-top:12px;padding-bottom:64px;overflow-y:auto}.gallery .card:hover{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.detail{margin:0 3px;font-size:12px;line-height:.8rem}vdr-select-toggle{position:absolute;top:-12px;left:-12px}vdr-select-toggle ::ng-deep .toggle{box-shadow:0 5px 5px -4px #000000bf}.card.selected{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.card.selected .selected-checkbox{opacity:1}.selection{width:23vw;max-width:400px;padding:6px;display:flex;flex-direction:column}.selection .selected-items{flex:1;overflow-y:auto}.selection .selected-items .item-row{padding-left:3px}.selection .selected-items .item-row:hover{background-color:var(--color-component-bg-200)}.paging-controls{display:flex;align-items:center;justify-content:space-between}\n"]
7037
7246
  },] }
7038
7247
  ];
7039
- ActionBarItemsComponent.ctorParameters = function () { return [
7040
- { type: NavBuilderService },
7041
- { type: i1$3.ActivatedRoute },
7248
+ ProductMultiSelectorDialogComponent.ctorParameters = function () { return [
7042
7249
  { type: DataService },
7043
- { type: NotificationService }
7044
- ]; };
7045
- ActionBarItemsComponent.propDecorators = {
7046
- locationId: [{ type: i0.HostBinding, args: ['attr.data-location-id',] }, { type: i0.Input }]
7047
- };
7250
+ { type: i0.ChangeDetectorRef }
7251
+ ]; };
7048
7252
 
7049
- var ActionBarLeftComponent = /** @class */ (function () {
7050
- function ActionBarLeftComponent() {
7051
- this.grow = false;
7253
+ var ProductMultiSelectorFormInputComponent = /** @class */ (function () {
7254
+ function ProductMultiSelectorFormInputComponent(modalService, dataService, changeDetector) {
7255
+ this.modalService = modalService;
7256
+ this.dataService = dataService;
7257
+ this.changeDetector = changeDetector;
7258
+ this.mode = 'product';
7259
+ this.isListInput = true;
7052
7260
  }
7053
- return ActionBarLeftComponent;
7261
+ ProductMultiSelectorFormInputComponent.prototype.ngOnInit = function () {
7262
+ var _a, _b;
7263
+ this.mode = (_b = (_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.selectionMode) !== null && _b !== void 0 ? _b : 'product';
7264
+ };
7265
+ ProductMultiSelectorFormInputComponent.prototype.select = function () {
7266
+ var _this = this;
7267
+ this.modalService
7268
+ .fromComponent(ProductMultiSelectorDialogComponent, {
7269
+ size: 'xl',
7270
+ locals: {
7271
+ mode: this.mode,
7272
+ initialSelectionIds: this.formControl.value,
7273
+ },
7274
+ })
7275
+ .subscribe(function (selection) {
7276
+ if (selection) {
7277
+ _this.formControl.setValue(selection.map(function (item) { return _this.mode === 'product' ? item.productId : item.productVariantId; }));
7278
+ _this.changeDetector.markForCheck();
7279
+ }
7280
+ });
7281
+ };
7282
+ return ProductMultiSelectorFormInputComponent;
7054
7283
  }());
7055
- ActionBarLeftComponent.decorators = [
7284
+ ProductMultiSelectorFormInputComponent.id = 'product-multi-form-input';
7285
+ ProductMultiSelectorFormInputComponent.decorators = [
7056
7286
  { type: i0.Component, args: [{
7057
- selector: 'vdr-ab-left',
7058
- template: "\n <ng-content></ng-content>\n "
7287
+ selector: 'vdr-product-multi-selector-form-input',
7288
+ template: "<div class=\"flex\">\r\n <button (click)=\"select()\" class=\"btn btn-sm btn-secondary\">\r\n {{ 'common.items-selected-count' | translate: { count: formControl.value?.length ?? 0 } }}...\r\n </button>\r\n</div>\r\n",
7289
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7290
+ styles: [""]
7059
7291
  },] }
7060
7292
  ];
7061
- ActionBarLeftComponent.propDecorators = {
7062
- grow: [{ type: i0.Input }]
7063
- };
7064
- var ActionBarRightComponent = /** @class */ (function () {
7065
- function ActionBarRightComponent() {
7066
- this.grow = false;
7293
+ ProductMultiSelectorFormInputComponent.ctorParameters = function () { return [
7294
+ { type: ModalService },
7295
+ { type: DataService },
7296
+ { type: i0.ChangeDetectorRef }
7297
+ ]; };
7298
+ ProductMultiSelectorFormInputComponent.propDecorators = {
7299
+ config: [{ type: i0.Input }],
7300
+ formControl: [{ type: i0.Input }],
7301
+ readonly: [{ type: i0.Input }]
7302
+ };
7303
+
7304
+ /**
7305
+ * @description
7306
+ * Allows the selection of multiple ProductVariants via an autocomplete select input.
7307
+ * Should be used with `ID` type **list** fields which represent ProductVariant IDs.
7308
+ *
7309
+ * @docsCategory custom-input-components
7310
+ * @docsPage default-inputs
7311
+ */
7312
+ var ProductSelectorFormInputComponent = /** @class */ (function () {
7313
+ function ProductSelectorFormInputComponent(dataService) {
7314
+ this.dataService = dataService;
7315
+ this.isListInput = true;
7067
7316
  }
7068
- return ActionBarRightComponent;
7069
- }());
7070
- ActionBarRightComponent.decorators = [
7071
- { type: i0.Component, args: [{
7072
- selector: 'vdr-ab-right',
7073
- template: "\n <ng-content></ng-content>\n "
7317
+ ProductSelectorFormInputComponent.prototype.ngOnInit = function () {
7318
+ var _this = this;
7319
+ this.formControl.setValidators([
7320
+ function (control) {
7321
+ if (!control.value || !control.value.length) {
7322
+ return {
7323
+ atLeastOne: { length: control.value.length },
7324
+ };
7325
+ }
7326
+ return null;
7327
+ },
7328
+ ]);
7329
+ this.selection$ = this.formControl.valueChanges.pipe(operators.startWith(this.formControl.value), operators.switchMap(function (value) {
7330
+ if (Array.isArray(value) && 0 < value.length) {
7331
+ return rxjs.forkJoin(value.map(function (id) { return _this.dataService.product
7332
+ .getProductVariant(id)
7333
+ .mapSingle(function (data) { return data.productVariant; }); }));
7334
+ }
7335
+ return rxjs.of([]);
7336
+ }), operators.map(function (variants) { return variants.filter(sharedUtils.notNullOrUndefined); }));
7337
+ };
7338
+ ProductSelectorFormInputComponent.prototype.addProductVariant = function (product) {
7339
+ var value = this.formControl.value;
7340
+ this.formControl.setValue(__spreadArray([], __read(new Set(__spreadArray(__spreadArray([], __read(value)), [product.productVariantId])))));
7341
+ };
7342
+ ProductSelectorFormInputComponent.prototype.removeProductVariant = function (id) {
7343
+ var value = this.formControl.value;
7344
+ this.formControl.setValue(value.filter(function (_id) { return _id !== id; }));
7345
+ };
7346
+ return ProductSelectorFormInputComponent;
7347
+ }());
7348
+ ProductSelectorFormInputComponent.id = 'product-selector-form-input';
7349
+ ProductSelectorFormInputComponent.decorators = [
7350
+ { type: i0.Component, args: [{
7351
+ selector: 'vdr-product-selector-form-input',
7352
+ template: "<ul class=\"list-unstyled\">\r\n <li *ngFor=\"let variant of selection$ | async\" class=\"variant\">\r\n <div class=\"thumb\">\r\n <img [src]=\"variant.product.featuredAsset | assetPreview: 32\" />\r\n </div>\r\n <div class=\"detail\">\r\n <div>{{ variant.name }}</div>\r\n <div class=\"sku\">{{ variant.sku }}</div>\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <button\r\n class=\"btn btn-link btn-sm btn-warning\"\r\n (click)=\"removeProductVariant(variant.id)\"\r\n [title]=\"'common.remove-item-from-list' | translate\"\r\n >\r\n <clr-icon shape=\"times\"></clr-icon>\r\n </button>\r\n </li>\r\n</ul>\r\n<vdr-product-selector (productSelected)=\"addProductVariant($event)\"></vdr-product-selector>\r\n",
7353
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7354
+ styles: [".variant{margin-bottom:6px;display:flex;align-items:center;transition:background-color .2s}.variant:hover{background-color:var(--color-component-bg-200)}.thumb{margin-right:6px}.sku{color:var(--color-grey-400);font-size:smaller;line-height:1em}\n"]
7074
7355
  },] }
7075
7356
  ];
7076
- ActionBarRightComponent.propDecorators = {
7077
- grow: [{ type: i0.Input }]
7078
- };
7079
- var ActionBarComponent = /** @class */ (function () {
7080
- function ActionBarComponent() {
7357
+ ProductSelectorFormInputComponent.ctorParameters = function () { return [
7358
+ { type: DataService }
7359
+ ]; };
7360
+
7361
+ /**
7362
+ * @description
7363
+ * The default input component for `relation` type custom fields. Allows the selection
7364
+ * of a ProductVariant, Product, Customer or Asset. For other entity types, a custom
7365
+ * implementation will need to be defined. See {@link registerFormInputComponent}.
7366
+ *
7367
+ * @docsCategory custom-input-components
7368
+ * @docsPage default-inputs
7369
+ */
7370
+ var RelationFormInputComponent = /** @class */ (function () {
7371
+ function RelationFormInputComponent() {
7081
7372
  }
7082
- return ActionBarComponent;
7373
+ return RelationFormInputComponent;
7083
7374
  }());
7084
- ActionBarComponent.decorators = [
7375
+ RelationFormInputComponent.id = 'relation-form-input';
7376
+ RelationFormInputComponent.decorators = [
7085
7377
  { type: i0.Component, args: [{
7086
- selector: 'vdr-action-bar',
7087
- 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",
7088
- 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"]
7378
+ selector: 'vdr-relation-form-input',
7379
+ template: "<div [ngSwitch]=\"config.entity\">\r\n <vdr-relation-asset-input\r\n *ngSwitchCase=\"'Asset'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-asset-input>\r\n <vdr-relation-product-input\r\n *ngSwitchCase=\"'Product'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-product-input>\r\n <vdr-relation-customer-input\r\n *ngSwitchCase=\"'Customer'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-customer-input>\r\n <vdr-relation-product-variant-input\r\n *ngSwitchCase=\"'ProductVariant'\"\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-product-variant-input>\r\n <ng-template ngSwitchDefault>\r\n <vdr-relation-generic-input\r\n [parentFormControl]=\"formControl\"\r\n [config]=\"config\"\r\n [readonly]=\"readonly\"\r\n ></vdr-relation-generic-input>\r\n </ng-template>\r\n</div>\r\n",
7380
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7381
+ styles: [":host{display:block;background-color:var(--color-component-bg-200);padding:3px}\n"]
7089
7382
  },] }
7090
7383
  ];
7091
- ActionBarComponent.propDecorators = {
7092
- left: [{ type: i0.ContentChild, args: [ActionBarLeftComponent,] }],
7093
- right: [{ type: i0.ContentChild, args: [ActionBarRightComponent,] }]
7384
+ RelationFormInputComponent.propDecorators = {
7385
+ readonly: [{ type: i0.Input }]
7094
7386
  };
7095
7387
 
7096
- var AddressFormComponent = /** @class */ (function () {
7097
- function AddressFormComponent() {
7388
+ /**
7389
+ * @description
7390
+ * Uses the {@link RichTextEditorComponent} as in input for `text` type fields.
7391
+ *
7392
+ * @docsCategory custom-input-components
7393
+ * @docsPage default-inputs
7394
+ */
7395
+ var RichTextFormInputComponent = /** @class */ (function () {
7396
+ function RichTextFormInputComponent() {
7098
7397
  }
7099
- return AddressFormComponent;
7398
+ return RichTextFormInputComponent;
7100
7399
  }());
7101
- AddressFormComponent.decorators = [
7400
+ RichTextFormInputComponent.id = 'rich-text-form-input';
7401
+ RichTextFormInputComponent.decorators = [
7102
7402
  { type: i0.Component, args: [{
7103
- selector: 'vdr-address-form',
7104
- 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",
7403
+ selector: 'vdr-rich-text-form-input',
7404
+ template: "<vdr-rich-text-editor\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n></vdr-rich-text-editor>\r\n",
7105
7405
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7106
- styles: [""]
7406
+ styles: [":host textarea{resize:both;height:6rem;width:100%}\n"]
7107
7407
  },] }
7108
- ];
7109
- AddressFormComponent.propDecorators = {
7110
- customFields: [{ type: i0.Input }],
7111
- formGroup: [{ type: i0.Input }],
7112
- availableCountries: [{ type: i0.Input }]
7113
- };
7408
+ ];
7114
7409
 
7115
7410
  /**
7116
- * A wrapper around an <input> element which adds a prefix and/or a suffix element.
7411
+ * @description
7412
+ * Uses a select input to allow the selection of a string value. Should be used with
7413
+ * `string` type fields with options.
7414
+ *
7415
+ * @docsCategory custom-input-components
7416
+ * @docsPage default-inputs
7117
7417
  */
7118
- var AffixedInputComponent = /** @class */ (function () {
7119
- function AffixedInputComponent() {
7418
+ var SelectFormInputComponent = /** @class */ (function () {
7419
+ function SelectFormInputComponent() {
7120
7420
  }
7121
- return AffixedInputComponent;
7421
+ Object.defineProperty(SelectFormInputComponent.prototype, "options", {
7422
+ get: function () {
7423
+ var _a;
7424
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.options) || this.config.options;
7425
+ },
7426
+ enumerable: false,
7427
+ configurable: true
7428
+ });
7429
+ return SelectFormInputComponent;
7122
7430
  }());
7123
- AffixedInputComponent.decorators = [
7431
+ SelectFormInputComponent.id = 'select-form-input';
7432
+ SelectFormInputComponent.decorators = [
7124
7433
  { type: i0.Component, args: [{
7125
- selector: 'vdr-affixed-input',
7126
- template: "<div [class.has-prefix]=\"!!prefix\" [class.has-suffix]=\"!!suffix\">\r\n <ng-content></ng-content>\r\n</div>\r\n<div class=\"affix prefix\" *ngIf=\"prefix\">{{ prefix }}</div>\r\n<div class=\"affix suffix\" *ngIf=\"suffix\">{{ suffix }}</div>\r\n",
7434
+ selector: 'vdr-select-form-input',
7435
+ template: "<select clrSelect [formControl]=\"formControl\" [vdrDisabled]=\"readonly\">\r\n <option *ngIf=\"config.nullable\" [ngValue]=\"null\"></option>\r\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\r\n {{ (option | customFieldLabel) || option.label || option.value }}\r\n </option>\r\n</select>\r\n",
7127
7436
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7128
- styles: [":host{display:inline-flex}.affix{color:var(--color-grey-800);display:flex;align-items:center;background-color:var(--color-grey-200);border:1px solid var(--color-component-border-300);top:1px;padding:3px;line-height:.58333rem;transition:border .2s}::ng-deep .has-prefix input{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.prefix{order:-1;border-radius:3px 0 0 3px;border-right:none}::ng-deep .has-suffix input{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.suffix{border-radius:0 3px 3px 0;border-left:none}\n"]
7437
+ styles: ["select{width:100%}\n"]
7129
7438
  },] }
7130
7439
  ];
7131
- AffixedInputComponent.propDecorators = {
7132
- prefix: [{ type: i0.Input }],
7133
- suffix: [{ type: i0.Input }]
7440
+ SelectFormInputComponent.propDecorators = {
7441
+ readonly: [{ type: i0.Input }]
7134
7442
  };
7135
7443
 
7136
7444
  /**
7137
- * A form input control which displays a number input with a percentage sign suffix.
7445
+ * @description
7446
+ * Uses a regular text form input. This is the default input for `string` and `localeString` type fields.
7447
+ *
7448
+ * @docsCategory custom-input-components
7449
+ * @docsPage default-inputs
7138
7450
  */
7139
- var PercentageSuffixInputComponent = /** @class */ (function () {
7140
- function PercentageSuffixInputComponent() {
7141
- this.disabled = false;
7142
- this.readonly = false;
7451
+ var TextFormInputComponent = /** @class */ (function () {
7452
+ function TextFormInputComponent() {
7143
7453
  }
7144
- PercentageSuffixInputComponent.prototype.ngOnChanges = function (changes) {
7145
- if ('value' in changes) {
7146
- this.writeValue(changes['value'].currentValue);
7147
- }
7148
- };
7149
- PercentageSuffixInputComponent.prototype.registerOnChange = function (fn) {
7150
- this.onChange = fn;
7151
- };
7152
- PercentageSuffixInputComponent.prototype.registerOnTouched = function (fn) {
7153
- this.onTouch = fn;
7154
- };
7155
- PercentageSuffixInputComponent.prototype.setDisabledState = function (isDisabled) {
7156
- this.disabled = isDisabled;
7157
- };
7158
- PercentageSuffixInputComponent.prototype.onInput = function (value) {
7159
- this.onChange(value);
7160
- };
7161
- PercentageSuffixInputComponent.prototype.writeValue = function (value) {
7162
- var numericValue = +value;
7163
- if (!Number.isNaN(numericValue)) {
7164
- this._value = numericValue;
7165
- }
7166
- };
7167
- return PercentageSuffixInputComponent;
7454
+ Object.defineProperty(TextFormInputComponent.prototype, "prefix", {
7455
+ get: function () {
7456
+ var _a;
7457
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.prefix) || this.config.prefix;
7458
+ },
7459
+ enumerable: false,
7460
+ configurable: true
7461
+ });
7462
+ Object.defineProperty(TextFormInputComponent.prototype, "suffix", {
7463
+ get: function () {
7464
+ var _a;
7465
+ return ((_a = this.config.ui) === null || _a === void 0 ? void 0 : _a.suffix) || this.config.suffix;
7466
+ },
7467
+ enumerable: false,
7468
+ configurable: true
7469
+ });
7470
+ return TextFormInputComponent;
7168
7471
  }());
7169
- PercentageSuffixInputComponent.decorators = [
7472
+ TextFormInputComponent.id = 'text-form-input';
7473
+ TextFormInputComponent.decorators = [
7170
7474
  { type: i0.Component, args: [{
7171
- selector: 'vdr-percentage-suffix-input',
7172
- template: "\n <vdr-affixed-input suffix=\"%\">\n <input\n type=\"number\"\n step=\"1\"\n [value]=\"_value\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n (input)=\"onInput($event.target.value)\"\n (focus)=\"onTouch()\"\n />\n </vdr-affixed-input>\n ",
7173
- providers: [
7174
- {
7175
- provide: forms.NG_VALUE_ACCESSOR,
7176
- useExisting: PercentageSuffixInputComponent,
7177
- multi: true,
7178
- },
7179
- ],
7180
- styles: ["\n :host {\n padding: 0;\n }\n "]
7475
+ selector: 'vdr-text-form-input',
7476
+ 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",
7477
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7478
+ styles: ["input{width:100%}\n"]
7181
7479
  },] }
7182
- ];
7183
- PercentageSuffixInputComponent.propDecorators = {
7184
- disabled: [{ type: i0.Input }],
7185
- readonly: [{ type: i0.Input }],
7186
- value: [{ type: i0.Input }]
7187
- };
7480
+ ];
7188
7481
 
7189
7482
  /**
7190
- * A component for selecting files to upload as new Assets.
7483
+ * @description
7484
+ * Uses textarea form input. This is the default input for `text` type fields.
7485
+ *
7486
+ * @docsCategory custom-input-components
7487
+ * @docsPage default-inputs
7191
7488
  */
7192
- var AssetFileInputComponent = /** @class */ (function () {
7193
- function AssetFileInputComponent(serverConfig) {
7194
- this.serverConfig = serverConfig;
7195
- /**
7196
- * CSS selector of the DOM element which will be masked by the file
7197
- * drop zone. Defaults to `body`.
7198
- */
7199
- this.dropZoneTarget = 'body';
7200
- this.uploading = false;
7201
- this.selectFiles = new i0.EventEmitter();
7202
- this.dragging = false;
7203
- this.overDropZone = false;
7204
- this.dropZoneStyle = {
7205
- 'width.px': 0,
7206
- 'height.px': 0,
7207
- 'top.px': 0,
7208
- 'left.px': 0,
7209
- };
7489
+ var TextareaFormInputComponent = /** @class */ (function () {
7490
+ function TextareaFormInputComponent() {
7210
7491
  }
7211
- AssetFileInputComponent.prototype.ngOnInit = function () {
7212
- this.accept = this.serverConfig.serverConfig.permittedAssetTypes.join(',');
7213
- this.fitDropZoneToTarget();
7214
- };
7215
- AssetFileInputComponent.prototype.onDragEnter = function () {
7216
- this.dragging = true;
7217
- this.fitDropZoneToTarget();
7218
- };
7219
- // DragEvent is not supported in Safari, see https://github.com/vendure-ecommerce/vendure/pull/284
7220
- AssetFileInputComponent.prototype.onDragLeave = function (event) {
7221
- if (!event.clientX && !event.clientY) {
7222
- this.dragging = false;
7492
+ Object.defineProperty(TextareaFormInputComponent.prototype, "spellcheck", {
7493
+ get: function () {
7494
+ return this.config.spellcheck === true;
7495
+ },
7496
+ enumerable: false,
7497
+ configurable: true
7498
+ });
7499
+ return TextareaFormInputComponent;
7500
+ }());
7501
+ TextareaFormInputComponent.id = 'textarea-form-input';
7502
+ TextareaFormInputComponent.decorators = [
7503
+ { type: i0.Component, args: [{
7504
+ selector: 'vdr-textarea-form-input',
7505
+ template: "<textarea [spellcheck]=\"spellcheck\" autocomplete=\"off\" autocorrect=\"off\"\r\n [readonly]=\"readonly\"\r\n [formControl]=\"formControl\"\r\n></textarea>\r\n",
7506
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7507
+ styles: [":host textarea{resize:both;height:6rem;width:100%}\n"]
7508
+ },] }
7509
+ ];
7510
+
7511
+ var defaultFormInputs = [
7512
+ BooleanFormInputComponent,
7513
+ CurrencyFormInputComponent,
7514
+ DateFormInputComponent,
7515
+ FacetValueFormInputComponent,
7516
+ NumberFormInputComponent,
7517
+ SelectFormInputComponent,
7518
+ TextFormInputComponent,
7519
+ ProductSelectorFormInputComponent,
7520
+ CustomerGroupFormInputComponent,
7521
+ PasswordFormInputComponent,
7522
+ RelationFormInputComponent,
7523
+ TextareaFormInputComponent,
7524
+ RichTextFormInputComponent,
7525
+ JsonEditorFormInputComponent,
7526
+ ProductMultiSelectorFormInputComponent,
7527
+ CombinationModeFormInputComponent,
7528
+ ];
7529
+ /**
7530
+ * @description
7531
+ * Registers a custom FormInputComponent which can be used to control the argument inputs
7532
+ * of a {@link ConfigurableOperationDef} (e.g. CollectionFilter, ShippingMethod etc) or for
7533
+ * a custom field.
7534
+ *
7535
+ * @example
7536
+ * ```TypeScript
7537
+ * \@NgModule({
7538
+ * imports: [SharedModule],
7539
+ * declarations: [MyCustomFieldControl],
7540
+ * providers: [
7541
+ * registerFormInputComponent('my-custom-input', MyCustomFieldControl),
7542
+ * ],
7543
+ * })
7544
+ * export class MyUiExtensionModule {}
7545
+ * ```
7546
+ *
7547
+ * This input component can then be used in a custom field:
7548
+ *
7549
+ * @example
7550
+ * ```TypeScript
7551
+ * const config = {
7552
+ * // ...
7553
+ * customFields: {
7554
+ * ProductVariant: [
7555
+ * {
7556
+ * name: 'rrp',
7557
+ * type: 'int',
7558
+ * ui: { component: 'my-custom-input' },
7559
+ * },
7560
+ * ]
7561
+ * }
7562
+ * }
7563
+ * ```
7564
+ *
7565
+ * or with an argument of a {@link ConfigurableOperationDef}:
7566
+ *
7567
+ * @example
7568
+ * ```TypeScript
7569
+ * args: {
7570
+ * rrp: { type: 'int', ui: { component: 'my-custom-input' } },
7571
+ * }
7572
+ * ```
7573
+ *
7574
+ * @docsCategory custom-input-components
7575
+ */
7576
+ function registerFormInputComponent(id, component) {
7577
+ return {
7578
+ provide: i0.APP_INITIALIZER,
7579
+ multi: true,
7580
+ useFactory: function (registry) { return function () {
7581
+ registry.registerInputComponent(id, component);
7582
+ }; },
7583
+ deps: [ComponentRegistryService],
7584
+ };
7585
+ }
7586
+ /**
7587
+ * @description
7588
+ * **Deprecated** use `registerFormInputComponent()` in combination with the customField `ui` config instead.
7589
+ *
7590
+ * Registers a custom component to act as the form input control for the given custom field.
7591
+ * This should be used in the NgModule `providers` array of your ui extension module.
7592
+ *
7593
+ * @example
7594
+ * ```TypeScript
7595
+ * \@NgModule({
7596
+ * imports: [SharedModule],
7597
+ * declarations: [MyCustomFieldControl],
7598
+ * providers: [
7599
+ * registerCustomFieldComponent('Product', 'someCustomField', MyCustomFieldControl),
7600
+ * ],
7601
+ * })
7602
+ * export class MyUiExtensionModule {}
7603
+ * ```
7604
+ *
7605
+ * @deprecated use `registerFormInputComponent()` in combination with the customField `ui` config instead.
7606
+ *
7607
+ * @docsCategory custom-input-components
7608
+ */
7609
+ function registerCustomFieldComponent(entity, fieldName, component) {
7610
+ return {
7611
+ provide: i0.APP_INITIALIZER,
7612
+ multi: true,
7613
+ useFactory: function (customFieldComponentService) { return function () {
7614
+ customFieldComponentService.registerCustomFieldComponent(entity, fieldName, component);
7615
+ }; },
7616
+ deps: [CustomFieldComponentService],
7617
+ };
7618
+ }
7619
+ /**
7620
+ * Registers the default form input components.
7621
+ */
7622
+ function registerDefaultFormInputs() {
7623
+ return defaultFormInputs.map(function (cmp) { return registerFormInputComponent(cmp.id, cmp); });
7624
+ }
7625
+
7626
+ var ActionBarItemsComponent = /** @class */ (function () {
7627
+ function ActionBarItemsComponent(navBuilderService, route, dataService, notificationService) {
7628
+ this.navBuilderService = navBuilderService;
7629
+ this.route = route;
7630
+ this.dataService = dataService;
7631
+ this.notificationService = notificationService;
7632
+ this.locationId$ = new rxjs.BehaviorSubject('');
7633
+ }
7634
+ ActionBarItemsComponent.prototype.ngOnInit = function () {
7635
+ this.items$ = rxjs.combineLatest(this.navBuilderService.actionBarConfig$, this.locationId$).pipe(operators.map(function (_a) {
7636
+ var _b = __read(_a, 2), items = _b[0], locationId = _b[1];
7637
+ return items.filter(function (config) { return config.locationId === locationId; });
7638
+ }));
7639
+ };
7640
+ ActionBarItemsComponent.prototype.ngOnChanges = function (changes) {
7641
+ if ('locationId' in changes) {
7642
+ this.locationId$.next(changes['locationId'].currentValue);
7223
7643
  }
7224
7644
  };
7225
- /**
7226
- * Preventing this event is required to make dropping work.
7227
- * See https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API#Define_a_drop_zone
7228
- */
7229
- AssetFileInputComponent.prototype.onDragOver = function (event) {
7230
- event.preventDefault();
7645
+ ActionBarItemsComponent.prototype.handleClick = function (event, item) {
7646
+ if (typeof item.onClick === 'function') {
7647
+ item.onClick(event, {
7648
+ route: this.route,
7649
+ dataService: this.dataService,
7650
+ notificationService: this.notificationService,
7651
+ });
7652
+ }
7231
7653
  };
7232
- // DragEvent is not supported in Safari, see https://github.com/vendure-ecommerce/vendure/pull/284
7233
- AssetFileInputComponent.prototype.onDrop = function (event) {
7234
- event.preventDefault();
7235
- this.dragging = false;
7236
- this.overDropZone = false;
7237
- var files = Array.from(event.dataTransfer ? event.dataTransfer.items : [])
7238
- .map(function (i) { return i.getAsFile(); })
7239
- .filter(sharedUtils.notNullOrUndefined);
7240
- this.selectFiles.emit(files);
7654
+ ActionBarItemsComponent.prototype.getRouterLink = function (item) {
7655
+ return this.navBuilderService.getRouterLink(item, this.route);
7241
7656
  };
7242
- AssetFileInputComponent.prototype.select = function (event) {
7243
- var files = event.target.files;
7244
- if (files) {
7245
- this.selectFiles.emit(Array.from(files));
7657
+ ActionBarItemsComponent.prototype.getButtonStyles = function (item) {
7658
+ var styles = ['btn'];
7659
+ if (item.buttonStyle && item.buttonStyle === 'link') {
7660
+ styles.push('btn-link');
7661
+ return styles;
7246
7662
  }
7663
+ styles.push(this.getButtonColorClass(item));
7664
+ return styles;
7247
7665
  };
7248
- AssetFileInputComponent.prototype.fitDropZoneToTarget = function () {
7249
- var target = document.querySelector(this.dropZoneTarget);
7250
- if (target) {
7251
- var rect = target.getBoundingClientRect();
7252
- this.dropZoneStyle['width.px'] = rect.width;
7253
- this.dropZoneStyle['height.px'] = rect.height;
7254
- this.dropZoneStyle['top.px'] = rect.top;
7255
- this.dropZoneStyle['left.px'] = rect.left;
7666
+ ActionBarItemsComponent.prototype.getButtonColorClass = function (item) {
7667
+ switch (item.buttonColor) {
7668
+ case undefined:
7669
+ case 'primary':
7670
+ return item.buttonStyle === 'outline' ? 'btn-outline' : 'btn-primary';
7671
+ case 'success':
7672
+ return item.buttonStyle === 'outline' ? 'btn-success-outline' : 'btn-success';
7673
+ case 'warning':
7674
+ return item.buttonStyle === 'outline' ? 'btn-warning-outline' : 'btn-warning';
7675
+ default:
7676
+ sharedUtils.assertNever(item.buttonColor);
7677
+ return '';
7256
7678
  }
7257
7679
  };
7258
- return AssetFileInputComponent;
7680
+ return ActionBarItemsComponent;
7259
7681
  }());
7260
- AssetFileInputComponent.decorators = [
7682
+ ActionBarItemsComponent.decorators = [
7261
7683
  { type: i0.Component, args: [{
7262
- selector: 'vdr-asset-file-input',
7263
- template: "<input type=\"file\" class=\"file-input\" #fileInput (change)=\"select($event)\" multiple [accept]=\"accept\" />\r\n<button class=\"btn btn-primary\" (click)=\"fileInput.click()\" [disabled]=\"uploading\">\r\n <ng-container *ngIf=\"uploading; else selectable\">\r\n <clr-spinner clrInline></clr-spinner>\r\n {{ 'asset.uploading' | translate }}\r\n </ng-container>\r\n <ng-template #selectable>\r\n <clr-icon shape=\"upload-cloud\"></clr-icon>\r\n {{ 'asset.upload-assets' | translate }}\r\n </ng-template>\r\n</button>\r\n<div\r\n class=\"drop-zone\"\r\n [ngStyle]=\"dropZoneStyle\"\r\n [class.visible]=\"dragging\"\r\n [class.dragging-over]=\"overDropZone\"\r\n (dragenter)=\"overDropZone = true\"\r\n (dragleave)=\"overDropZone = false\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n #dropZone\r\n>\r\n <div class=\"drop-label\" (dragenter)=\"overDropZone = true\">\r\n <clr-icon shape=\"upload-cloud\" size=\"32\"></clr-icon>\r\n {{ 'catalog.drop-files-to-upload' | translate }}\r\n </div>\r\n</div>\r\n",
7684
+ selector: 'vdr-action-bar-items',
7685
+ 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",
7264
7686
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7265
- styles: [".file-input{display:none}.drop-zone{position:fixed;background-color:var(--color-primary-500);border:3px dashed var(--color-component-border-300);opacity:0;visibility:hidden;z-index:1000;transition:opacity .2s,background-color .2s,visibility 0s .2s;display:flex;align-items:center;justify-content:center}.drop-zone.visible{opacity:.3;visibility:visible;transition:opacity .2s,background-color .2s,border .2s,visibility 0s}.drop-zone .drop-label{background-color:#fffc;border-radius:3px;padding:24px;font-size:32px;pointer-events:none;opacity:.5;transition:opacity .2s}.drop-zone.dragging-over{border-color:#fff;background-color:var(--color-primary-500);opacity:.7;transition:background-color .2s,border .2s}.drop-zone.dragging-over .drop-label{opacity:1}\n"]
7687
+ styles: [":host{display:inline-block;min-height:36px}\n"]
7266
7688
  },] }
7267
7689
  ];
7268
- AssetFileInputComponent.ctorParameters = function () { return [
7269
- { type: ServerConfigService }
7690
+ ActionBarItemsComponent.ctorParameters = function () { return [
7691
+ { type: NavBuilderService },
7692
+ { type: i1$3.ActivatedRoute },
7693
+ { type: DataService },
7694
+ { type: NotificationService }
7270
7695
  ]; };
7271
- AssetFileInputComponent.propDecorators = {
7272
- dropZoneTarget: [{ type: i0.Input }],
7273
- uploading: [{ type: i0.Input }],
7274
- selectFiles: [{ type: i0.Output }],
7275
- onDragEnter: [{ type: i0.HostListener, args: ['document:dragenter',] }],
7276
- onDragLeave: [{ type: i0.HostListener, args: ['document:dragleave', ['$event'],] }]
7696
+ ActionBarItemsComponent.propDecorators = {
7697
+ locationId: [{ type: i0.HostBinding, args: ['attr.data-location-id',] }, { type: i0.Input }]
7277
7698
  };
7278
7699
 
7279
- var AssetPreviewDialogComponent = /** @class */ (function () {
7280
- function AssetPreviewDialogComponent(dataService) {
7281
- this.dataService = dataService;
7700
+ var ActionBarLeftComponent = /** @class */ (function () {
7701
+ function ActionBarLeftComponent() {
7702
+ this.grow = false;
7282
7703
  }
7283
- AssetPreviewDialogComponent.prototype.ngOnInit = function () {
7284
- var _this = this;
7285
- this.assetWithTags$ = rxjs.of(this.asset).pipe(operators.mergeMap(function (asset) {
7286
- if (_this.hasTags(asset)) {
7287
- return rxjs.of(asset);
7288
- }
7289
- else {
7290
- // tslint:disable-next-line:no-non-null-assertion
7291
- return _this.dataService.product.getAsset(asset.id).mapSingle(function (data) { return data.asset; });
7292
- }
7293
- }));
7294
- };
7295
- AssetPreviewDialogComponent.prototype.hasTags = function (asset) {
7296
- return asset.hasOwnProperty('tags');
7297
- };
7298
- return AssetPreviewDialogComponent;
7704
+ return ActionBarLeftComponent;
7299
7705
  }());
7300
- AssetPreviewDialogComponent.decorators = [
7706
+ ActionBarLeftComponent.decorators = [
7301
7707
  { type: i0.Component, args: [{
7302
- selector: 'vdr-asset-preview-dialog',
7708
+ selector: 'vdr-ab-left',
7709
+ template: "\n <ng-content></ng-content>\n "
7710
+ },] }
7711
+ ];
7712
+ ActionBarLeftComponent.propDecorators = {
7713
+ grow: [{ type: i0.Input }]
7714
+ };
7715
+ var ActionBarRightComponent = /** @class */ (function () {
7716
+ function ActionBarRightComponent() {
7717
+ this.grow = false;
7718
+ }
7719
+ return ActionBarRightComponent;
7720
+ }());
7721
+ ActionBarRightComponent.decorators = [
7722
+ { type: i0.Component, args: [{
7723
+ selector: 'vdr-ab-right',
7724
+ template: "\n <ng-content></ng-content>\n "
7725
+ },] }
7726
+ ];
7727
+ ActionBarRightComponent.propDecorators = {
7728
+ grow: [{ type: i0.Input }]
7729
+ };
7730
+ var ActionBarComponent = /** @class */ (function () {
7731
+ function ActionBarComponent() {
7732
+ }
7733
+ return ActionBarComponent;
7734
+ }());
7735
+ ActionBarComponent.decorators = [
7736
+ { type: i0.Component, args: [{
7737
+ selector: 'vdr-action-bar',
7738
+ 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",
7739
+ 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"]
7740
+ },] }
7741
+ ];
7742
+ ActionBarComponent.propDecorators = {
7743
+ left: [{ type: i0.ContentChild, args: [ActionBarLeftComponent,] }],
7744
+ right: [{ type: i0.ContentChild, args: [ActionBarRightComponent,] }]
7745
+ };
7746
+
7747
+ var AddressFormComponent = /** @class */ (function () {
7748
+ function AddressFormComponent() {
7749
+ }
7750
+ return AddressFormComponent;
7751
+ }());
7752
+ AddressFormComponent.decorators = [
7753
+ { type: i0.Component, args: [{
7754
+ selector: 'vdr-address-form',
7755
+ 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",
7756
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7757
+ styles: [""]
7758
+ },] }
7759
+ ];
7760
+ AddressFormComponent.propDecorators = {
7761
+ customFields: [{ type: i0.Input }],
7762
+ formGroup: [{ type: i0.Input }],
7763
+ availableCountries: [{ type: i0.Input }]
7764
+ };
7765
+
7766
+ /**
7767
+ * A wrapper around an <input> element which adds a prefix and/or a suffix element.
7768
+ */
7769
+ var AffixedInputComponent = /** @class */ (function () {
7770
+ function AffixedInputComponent() {
7771
+ }
7772
+ return AffixedInputComponent;
7773
+ }());
7774
+ AffixedInputComponent.decorators = [
7775
+ { type: i0.Component, args: [{
7776
+ selector: 'vdr-affixed-input',
7777
+ template: "<div [class.has-prefix]=\"!!prefix\" [class.has-suffix]=\"!!suffix\">\r\n <ng-content></ng-content>\r\n</div>\r\n<div class=\"affix prefix\" *ngIf=\"prefix\">{{ prefix }}</div>\r\n<div class=\"affix suffix\" *ngIf=\"suffix\">{{ suffix }}</div>\r\n",
7778
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7779
+ styles: [":host{display:inline-flex}.affix{color:var(--color-grey-800);display:flex;align-items:center;background-color:var(--color-grey-200);border:1px solid var(--color-component-border-300);top:1px;padding:3px;line-height:.58333rem;transition:border .2s}::ng-deep .has-prefix input{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.prefix{order:-1;border-radius:3px 0 0 3px;border-right:none}::ng-deep .has-suffix input{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.suffix{border-radius:0 3px 3px 0;border-left:none}\n"]
7780
+ },] }
7781
+ ];
7782
+ AffixedInputComponent.propDecorators = {
7783
+ prefix: [{ type: i0.Input }],
7784
+ suffix: [{ type: i0.Input }]
7785
+ };
7786
+
7787
+ /**
7788
+ * A form input control which displays a number input with a percentage sign suffix.
7789
+ */
7790
+ var PercentageSuffixInputComponent = /** @class */ (function () {
7791
+ function PercentageSuffixInputComponent() {
7792
+ this.disabled = false;
7793
+ this.readonly = false;
7794
+ }
7795
+ PercentageSuffixInputComponent.prototype.ngOnChanges = function (changes) {
7796
+ if ('value' in changes) {
7797
+ this.writeValue(changes['value'].currentValue);
7798
+ }
7799
+ };
7800
+ PercentageSuffixInputComponent.prototype.registerOnChange = function (fn) {
7801
+ this.onChange = fn;
7802
+ };
7803
+ PercentageSuffixInputComponent.prototype.registerOnTouched = function (fn) {
7804
+ this.onTouch = fn;
7805
+ };
7806
+ PercentageSuffixInputComponent.prototype.setDisabledState = function (isDisabled) {
7807
+ this.disabled = isDisabled;
7808
+ };
7809
+ PercentageSuffixInputComponent.prototype.onInput = function (value) {
7810
+ this.onChange(value);
7811
+ };
7812
+ PercentageSuffixInputComponent.prototype.writeValue = function (value) {
7813
+ var numericValue = +value;
7814
+ if (!Number.isNaN(numericValue)) {
7815
+ this._value = numericValue;
7816
+ }
7817
+ };
7818
+ return PercentageSuffixInputComponent;
7819
+ }());
7820
+ PercentageSuffixInputComponent.decorators = [
7821
+ { type: i0.Component, args: [{
7822
+ selector: 'vdr-percentage-suffix-input',
7823
+ template: "\n <vdr-affixed-input suffix=\"%\">\n <input\n type=\"number\"\n step=\"1\"\n [value]=\"_value\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n (input)=\"onInput($event.target.value)\"\n (focus)=\"onTouch()\"\n />\n </vdr-affixed-input>\n ",
7824
+ providers: [
7825
+ {
7826
+ provide: forms.NG_VALUE_ACCESSOR,
7827
+ useExisting: PercentageSuffixInputComponent,
7828
+ multi: true,
7829
+ },
7830
+ ],
7831
+ styles: ["\n :host {\n padding: 0;\n }\n "]
7832
+ },] }
7833
+ ];
7834
+ PercentageSuffixInputComponent.propDecorators = {
7835
+ disabled: [{ type: i0.Input }],
7836
+ readonly: [{ type: i0.Input }],
7837
+ value: [{ type: i0.Input }]
7838
+ };
7839
+
7840
+ /**
7841
+ * A component for selecting files to upload as new Assets.
7842
+ */
7843
+ var AssetFileInputComponent = /** @class */ (function () {
7844
+ function AssetFileInputComponent(serverConfig) {
7845
+ this.serverConfig = serverConfig;
7846
+ /**
7847
+ * CSS selector of the DOM element which will be masked by the file
7848
+ * drop zone. Defaults to `body`.
7849
+ */
7850
+ this.dropZoneTarget = 'body';
7851
+ this.uploading = false;
7852
+ this.selectFiles = new i0.EventEmitter();
7853
+ this.dragging = false;
7854
+ this.overDropZone = false;
7855
+ this.dropZoneStyle = {
7856
+ 'width.px': 0,
7857
+ 'height.px': 0,
7858
+ 'top.px': 0,
7859
+ 'left.px': 0,
7860
+ };
7861
+ }
7862
+ AssetFileInputComponent.prototype.ngOnInit = function () {
7863
+ this.accept = this.serverConfig.serverConfig.permittedAssetTypes.join(',');
7864
+ this.fitDropZoneToTarget();
7865
+ };
7866
+ AssetFileInputComponent.prototype.onDragEnter = function () {
7867
+ this.dragging = true;
7868
+ this.fitDropZoneToTarget();
7869
+ };
7870
+ // DragEvent is not supported in Safari, see https://github.com/vendure-ecommerce/vendure/pull/284
7871
+ AssetFileInputComponent.prototype.onDragLeave = function (event) {
7872
+ if (!event.clientX && !event.clientY) {
7873
+ this.dragging = false;
7874
+ }
7875
+ };
7876
+ /**
7877
+ * Preventing this event is required to make dropping work.
7878
+ * See https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API#Define_a_drop_zone
7879
+ */
7880
+ AssetFileInputComponent.prototype.onDragOver = function (event) {
7881
+ event.preventDefault();
7882
+ };
7883
+ // DragEvent is not supported in Safari, see https://github.com/vendure-ecommerce/vendure/pull/284
7884
+ AssetFileInputComponent.prototype.onDrop = function (event) {
7885
+ event.preventDefault();
7886
+ this.dragging = false;
7887
+ this.overDropZone = false;
7888
+ var files = Array.from(event.dataTransfer ? event.dataTransfer.items : [])
7889
+ .map(function (i) { return i.getAsFile(); })
7890
+ .filter(sharedUtils.notNullOrUndefined);
7891
+ this.selectFiles.emit(files);
7892
+ };
7893
+ AssetFileInputComponent.prototype.select = function (event) {
7894
+ var files = event.target.files;
7895
+ if (files) {
7896
+ this.selectFiles.emit(Array.from(files));
7897
+ }
7898
+ };
7899
+ AssetFileInputComponent.prototype.fitDropZoneToTarget = function () {
7900
+ var target = document.querySelector(this.dropZoneTarget);
7901
+ if (target) {
7902
+ var rect = target.getBoundingClientRect();
7903
+ this.dropZoneStyle['width.px'] = rect.width;
7904
+ this.dropZoneStyle['height.px'] = rect.height;
7905
+ this.dropZoneStyle['top.px'] = rect.top;
7906
+ this.dropZoneStyle['left.px'] = rect.left;
7907
+ }
7908
+ };
7909
+ return AssetFileInputComponent;
7910
+ }());
7911
+ AssetFileInputComponent.decorators = [
7912
+ { type: i0.Component, args: [{
7913
+ selector: 'vdr-asset-file-input',
7914
+ template: "<input type=\"file\" class=\"file-input\" #fileInput (change)=\"select($event)\" multiple [accept]=\"accept\" />\r\n<button class=\"btn btn-primary\" (click)=\"fileInput.click()\" [disabled]=\"uploading\">\r\n <ng-container *ngIf=\"uploading; else selectable\">\r\n <clr-spinner clrInline></clr-spinner>\r\n {{ 'asset.uploading' | translate }}\r\n </ng-container>\r\n <ng-template #selectable>\r\n <clr-icon shape=\"upload-cloud\"></clr-icon>\r\n {{ 'asset.upload-assets' | translate }}\r\n </ng-template>\r\n</button>\r\n<div\r\n class=\"drop-zone\"\r\n [ngStyle]=\"dropZoneStyle\"\r\n [class.visible]=\"dragging\"\r\n [class.dragging-over]=\"overDropZone\"\r\n (dragenter)=\"overDropZone = true\"\r\n (dragleave)=\"overDropZone = false\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n #dropZone\r\n>\r\n <div class=\"drop-label\" (dragenter)=\"overDropZone = true\">\r\n <clr-icon shape=\"upload-cloud\" size=\"32\"></clr-icon>\r\n {{ 'catalog.drop-files-to-upload' | translate }}\r\n </div>\r\n</div>\r\n",
7915
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
7916
+ styles: [".file-input{display:none}.drop-zone{position:fixed;background-color:var(--color-primary-500);border:3px dashed var(--color-component-border-300);opacity:0;visibility:hidden;z-index:1000;transition:opacity .2s,background-color .2s,visibility 0s .2s;display:flex;align-items:center;justify-content:center}.drop-zone.visible{opacity:.3;visibility:visible;transition:opacity .2s,background-color .2s,border .2s,visibility 0s}.drop-zone .drop-label{background-color:#fffc;border-radius:3px;padding:24px;font-size:32px;pointer-events:none;opacity:.5;transition:opacity .2s}.drop-zone.dragging-over{border-color:#fff;background-color:var(--color-primary-500);opacity:.7;transition:background-color .2s,border .2s}.drop-zone.dragging-over .drop-label{opacity:1}\n"]
7917
+ },] }
7918
+ ];
7919
+ AssetFileInputComponent.ctorParameters = function () { return [
7920
+ { type: ServerConfigService }
7921
+ ]; };
7922
+ AssetFileInputComponent.propDecorators = {
7923
+ dropZoneTarget: [{ type: i0.Input }],
7924
+ uploading: [{ type: i0.Input }],
7925
+ selectFiles: [{ type: i0.Output }],
7926
+ onDragEnter: [{ type: i0.HostListener, args: ['document:dragenter',] }],
7927
+ onDragLeave: [{ type: i0.HostListener, args: ['document:dragleave', ['$event'],] }]
7928
+ };
7929
+
7930
+ var AssetPreviewDialogComponent = /** @class */ (function () {
7931
+ function AssetPreviewDialogComponent(dataService) {
7932
+ this.dataService = dataService;
7933
+ }
7934
+ AssetPreviewDialogComponent.prototype.ngOnInit = function () {
7935
+ var _this = this;
7936
+ this.assetWithTags$ = rxjs.of(this.asset).pipe(operators.mergeMap(function (asset) {
7937
+ if (_this.hasTags(asset)) {
7938
+ return rxjs.of(asset);
7939
+ }
7940
+ else {
7941
+ // tslint:disable-next-line:no-non-null-assertion
7942
+ return _this.dataService.product.getAsset(asset.id).mapSingle(function (data) { return data.asset; });
7943
+ }
7944
+ }));
7945
+ };
7946
+ AssetPreviewDialogComponent.prototype.hasTags = function (asset) {
7947
+ return asset.hasOwnProperty('tags');
7948
+ };
7949
+ return AssetPreviewDialogComponent;
7950
+ }());
7951
+ AssetPreviewDialogComponent.decorators = [
7952
+ { type: i0.Component, args: [{
7953
+ selector: 'vdr-asset-preview-dialog',
7303
7954
  template: "<ng-template vdrDialogTitle>\r\n <div class=\"title-row\">\r\n {{ asset.name }}\r\n </div>\r\n</ng-template>\r\n\r\n<vdr-asset-preview\r\n *ngIf=\"assetWithTags$ | async as assetWithTags\"\r\n [asset]=\"assetWithTags\"\r\n (assetChange)=\"assetChanges = $event\"\r\n (editClick)=\"resolveWith()\"\r\n></vdr-asset-preview>\r\n",
7304
7955
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7305
7956
  styles: [":host{height:70vh}.update-button.hidden{visibility:hidden}\n"]
@@ -7319,9 +7970,13 @@
7319
7970
  this.canDelete = false;
7320
7971
  this.selectionChange = new i0.EventEmitter();
7321
7972
  this.deleteAssets = new i0.EventEmitter();
7322
- this.selection = [];
7973
+ this.selectionManager = new SelectionManager({
7974
+ multiSelect: this.multiSelect,
7975
+ itemsAreEqual: function (a, b) { return a.id === b.id; },
7976
+ additiveMode: false,
7977
+ });
7323
7978
  }
7324
- AssetGalleryComponent.prototype.ngOnChanges = function () {
7979
+ AssetGalleryComponent.prototype.ngOnChanges = function (changes) {
7325
7980
  var e_1, _a;
7326
7981
  if (this.assets) {
7327
7982
  var _loop_1 = function (asset) {
@@ -7333,7 +7988,7 @@
7333
7988
  };
7334
7989
  var this_1 = this;
7335
7990
  try {
7336
- for (var _b = __values(this.selection), _c = _b.next(); !_c.done; _c = _b.next()) {
7991
+ for (var _b = __values(this.selectionManager.selection), _c = _b.next(); !_c.done; _c = _b.next()) {
7337
7992
  var asset = _c.value;
7338
7993
  _loop_1(asset);
7339
7994
  }
@@ -7346,51 +8001,26 @@
7346
8001
  finally { if (e_1) throw e_1.error; }
7347
8002
  }
7348
8003
  }
8004
+ if (changes['assets']) {
8005
+ this.selectionManager.setCurrentItems(this.assets);
8006
+ }
8007
+ if (changes['multiSelect']) {
8008
+ this.selectionManager.setMultiSelect(this.multiSelect);
8009
+ }
7349
8010
  };
7350
8011
  AssetGalleryComponent.prototype.toggleSelection = function (asset, event) {
7351
- var _a;
7352
- var _this = this;
7353
- var index = this.selection.findIndex(function (a) { return a.id === asset.id; });
7354
- if (this.multiSelect && (event === null || event === void 0 ? void 0 : event.shiftKey) && 1 <= this.selection.length) {
7355
- var lastSelection_1 = this.selection[this.selection.length - 1];
7356
- var lastSelectionIndex = this.assets.findIndex(function (a) { return a.id === lastSelection_1.id; });
7357
- var currentIndex = this.assets.findIndex(function (a) { return a.id === asset.id; });
7358
- var start = currentIndex < lastSelectionIndex ? currentIndex : lastSelectionIndex;
7359
- var end = currentIndex > lastSelectionIndex ? currentIndex + 1 : lastSelectionIndex;
7360
- (_a = this.selection).push.apply(_a, __spreadArray([], __read(this.assets.slice(start, end).filter(function (a) { return !_this.selection.find(function (s) { return s.id === a.id; }); }))));
7361
- }
7362
- else if (index === -1) {
7363
- if (this.multiSelect && ((event === null || event === void 0 ? void 0 : event.ctrlKey) || (event === null || event === void 0 ? void 0 : event.shiftKey))) {
7364
- this.selection.push(asset);
7365
- }
7366
- else {
7367
- this.selection = [asset];
7368
- }
7369
- }
7370
- else {
7371
- if (this.multiSelect && (event === null || event === void 0 ? void 0 : event.ctrlKey)) {
7372
- this.selection.splice(index, 1);
7373
- }
7374
- else if (1 < this.selection.length) {
7375
- this.selection = [asset];
7376
- }
7377
- else {
7378
- this.selection.splice(index, 1);
7379
- }
7380
- }
7381
- // Make the selection mutable
7382
- this.selection = this.selection.map(function (x) { return (Object.assign({}, x)); });
7383
- this.selectionChange.emit(this.selection);
8012
+ this.selectionManager.toggleSelection(asset, event);
8013
+ this.selectionChange.emit(this.selectionManager.selection);
7384
8014
  };
7385
8015
  AssetGalleryComponent.prototype.selectMultiple = function (assets) {
7386
- this.selection = assets;
7387
- this.selectionChange.emit(this.selection);
8016
+ this.selectionManager.selectMultiple(assets);
8017
+ this.selectionChange.emit(this.selectionManager.selection);
7388
8018
  };
7389
8019
  AssetGalleryComponent.prototype.isSelected = function (asset) {
7390
- return !!this.selection.find(function (a) { return a.id === asset.id; });
8020
+ return this.selectionManager.isSelected(asset);
7391
8021
  };
7392
8022
  AssetGalleryComponent.prototype.lastSelected = function () {
7393
- return this.selection[this.selection.length - 1];
8023
+ return this.selectionManager.lastSelected();
7394
8024
  };
7395
8025
  AssetGalleryComponent.prototype.previewAsset = function (asset) {
7396
8026
  this.modalService
@@ -7410,9 +8040,9 @@
7410
8040
  AssetGalleryComponent.decorators = [
7411
8041
  { type: i0.Component, args: [{
7412
8042
  selector: 'vdr-asset-gallery',
7413
- template: "<div class=\"gallery\">\r\n <div\r\n class=\"card\"\r\n *ngFor=\"let asset of assets\"\r\n (click)=\"toggleSelection(asset, $event)\"\r\n [class.selected]=\"isSelected(asset)\"\r\n >\r\n <div class=\"card-img\">\r\n <div class=\"selected-checkbox\"><clr-icon shape=\"check-circle\" size=\"32\"></clr-icon></div>\r\n <img [src]=\"asset | assetPreview: 'thumb'\" />\r\n </div>\r\n <div class=\"detail\">\r\n <vdr-entity-info\r\n [entity]=\"asset\"\r\n [small]=\"true\"\r\n (click)=\"entityInfoClick($event)\"\r\n ></vdr-entity-info>\r\n <span [title]=\"asset.name\">{{ asset.name }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"info-bar\">\r\n <div class=\"card\">\r\n <div class=\"card-img\">\r\n <div class=\"placeholder\" *ngIf=\"selection.length === 0\">\r\n <clr-icon shape=\"image\" size=\"128\"></clr-icon>\r\n <div>{{ 'catalog.no-selection' | translate }}</div>\r\n </div>\r\n <img\r\n class=\"preview\"\r\n *ngIf=\"selection.length >= 1\"\r\n [src]=\"lastSelected().preview + '?preset=medium'\"\r\n />\r\n </div>\r\n <div class=\"card-block details\" *ngIf=\"selection.length >= 1\">\r\n <div class=\"name\">{{ lastSelected().name }}</div>\r\n <div>{{ 'asset.original-asset-size' | translate }}: {{ lastSelected().fileSize | filesize }}</div>\r\n\r\n <ng-container *ngIf=\"selection.length === 1\">\r\n <vdr-chip *ngFor=\"let tag of lastSelected().tags\" [colorFrom]=\"tag.value\"\r\n ><clr-icon shape=\"tag\" class=\"mr2\"></clr-icon> {{ tag.value }}</vdr-chip\r\n >\r\n <div>\r\n <button (click)=\"previewAsset(lastSelected())\" class=\"btn btn-link\">\r\n <clr-icon shape=\"eye\"></clr-icon> {{ 'asset.preview' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <vdr-asset-preview-links class=\"\" [asset]=\"lastSelected()\"></vdr-asset-preview-links>\r\n </div>\r\n <div>\r\n <a [routerLink]=\"['./', lastSelected().id]\" class=\"btn btn-link\">\r\n <clr-icon shape=\"pencil\"></clr-icon> {{ 'common.edit' | translate }}\r\n </a>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"canDelete\">\r\n <button (click)=\"deleteAssets.emit(selection)\" class=\"btn btn-link\">\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon> {{ 'common.delete' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card stack\" [class.visible]=\"selection.length > 1\"></div>\r\n <div class=\"selection-count\" [class.visible]=\"selection.length > 1\">\r\n {{ 'asset.assets-selected-count' | translate: { count: selection.length } }}\r\n <ul>\r\n <li *ngFor=\"let asset of selection\">{{ asset.name }}</li>\r\n </ul>\r\n </div>\r\n</div>\r\n",
8043
+ template: "<div class=\"gallery\">\r\n <div\r\n class=\"card\"\r\n *ngFor=\"let asset of assets\"\r\n (click)=\"toggleSelection(asset, $event)\"\r\n [class.selected]=\"isSelected(asset)\"\r\n >\r\n <div class=\"card-img\">\r\n <vdr-select-toggle\r\n [selected]=\"isSelected(asset)\"\r\n [disabled]=\"true\"\r\n [hiddenWhenOff]=\"true\"\r\n ></vdr-select-toggle>\r\n <img class=\"asset-thumb\" [src]=\"asset | assetPreview: 'thumb'\" />\r\n </div>\r\n <div class=\"detail\">\r\n <vdr-entity-info\r\n [entity]=\"asset\"\r\n [small]=\"true\"\r\n (click)=\"entityInfoClick($event)\"\r\n ></vdr-entity-info>\r\n <span [title]=\"asset.name\">{{ asset.name }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"info-bar\">\r\n <div class=\"card\">\r\n <div class=\"card-img\">\r\n <div class=\"placeholder\" *ngIf=\"selectionManager.selection.length === 0\">\r\n <clr-icon shape=\"image\" size=\"128\"></clr-icon>\r\n <div>{{ 'catalog.no-selection' | translate }}</div>\r\n </div>\r\n <img\r\n class=\"preview\"\r\n *ngIf=\"selectionManager.selection.length >= 1\"\r\n [src]=\"lastSelected().preview + '?preset=medium'\"\r\n />\r\n </div>\r\n <div class=\"card-block details\" *ngIf=\"selectionManager.selection.length >= 1\">\r\n <div class=\"name\">{{ lastSelected().name }}</div>\r\n <div>{{ 'asset.original-asset-size' | translate }}: {{ lastSelected().fileSize | filesize }}</div>\r\n\r\n <ng-container *ngIf=\"selectionManager.selection.length === 1\">\r\n <vdr-chip *ngFor=\"let tag of lastSelected().tags\" [colorFrom]=\"tag.value\"\r\n ><clr-icon shape=\"tag\" class=\"mr2\"></clr-icon> {{ tag.value }}</vdr-chip\r\n >\r\n <div>\r\n <button (click)=\"previewAsset(lastSelected())\" class=\"btn btn-link\">\r\n <clr-icon shape=\"eye\"></clr-icon> {{ 'asset.preview' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <vdr-asset-preview-links class=\"\" [asset]=\"lastSelected()\"></vdr-asset-preview-links>\r\n </div>\r\n <div>\r\n <a [routerLink]=\"['./', lastSelected().id]\" class=\"btn btn-link\">\r\n <clr-icon shape=\"pencil\"></clr-icon> {{ 'common.edit' | translate }}\r\n </a>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"canDelete\">\r\n <button (click)=\"deleteAssets.emit(selectionManager.selection)\" class=\"btn btn-link\">\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon> {{ 'common.delete' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card stack\" [class.visible]=\"selectionManager.selection.length > 1\"></div>\r\n <div class=\"selection-count\" [class.visible]=\"selectionManager.selection.length > 1\">\r\n {{ 'asset.assets-selected-count' | translate: { count: selectionManager.selection.length } }}\r\n <ul>\r\n <li *ngFor=\"let asset of selectionManager.selection\">{{ asset.name }}</li>\r\n </ul>\r\n </div>\r\n</div>\r\n",
7414
8044
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7415
- styles: [":host{display:flex;overflow:hidden}.gallery{flex:1;display:grid;grid-template-columns:repeat(auto-fill,150px);grid-template-rows:repeat(auto-fill,180px);grid-gap:10px 20px;overflow-y:auto;padding-left:12px;padding-top:12px;padding-bottom:12px}.gallery .card:hover{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.card{margin-top:0;position:relative}.selected-checkbox{opacity:0;position:absolute;color:var(--color-success-500);background-color:#fff;border-radius:50%;top:-12px;left:-12px;box-shadow:0 5px 5px -4px #000000bf;transition:opacity .1s}.card.selected{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.card.selected .selected-checkbox{opacity:1}.detail{font-size:12px;margin:3px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.detail vdr-entity-info{height:16px}.info-bar{width:25%;padding:0 6px;overflow-y:auto}.info-bar .card{z-index:1}.info-bar .stack{z-index:0;opacity:0;transform:perspective(500px) translateZ(0) translateY(-16px);height:16px;transition:transform .3s,opacity 0s .3s;background-color:#fff}.info-bar .stack.visible{opacity:1;transform:perspective(500px) translateZ(-44px) translateY(0);background-color:var(--color-component-bg-100);transition:transform .3s,color .3s}.info-bar .selection-count{opacity:0;position:relative;text-align:center;visibility:hidden;transition:opacity .3s,visibility 0s .3s}.info-bar .selection-count.visible{opacity:1;visibility:visible;transition:opacity .3s,visibility 0s}.info-bar .selection-count ul{text-align:left;list-style-type:none;margin-left:12px}.info-bar .selection-count ul li{font-size:12px}.info-bar .placeholder{text-align:center;color:var(--color-grey-300)}.info-bar .preview img{max-width:100%}.info-bar .details{font-size:12px;word-break:break-all}.info-bar .name{line-height:14px;font-weight:bold}\n"]
8045
+ styles: [":host{display:flex;overflow:hidden}.gallery{flex:1;display:grid;grid-template-columns:repeat(auto-fill,150px);grid-template-rows:repeat(auto-fill,180px);grid-gap:10px 20px;overflow-y:auto;padding-left:12px;padding-top:12px;padding-bottom:12px}.gallery .card:hover{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.card{margin-top:0;position:relative}img.asset-thumb{aspect-ratio:1}vdr-select-toggle{position:absolute;top:-12px;left:-12px}vdr-select-toggle ::ng-deep .toggle{box-shadow:0 5px 5px -4px #000000bf}.card.selected{box-shadow:0 .125rem 0 0 var(--color-primary-500);border:1px solid var(--color-primary-500)}.card.selected .selected-checkbox{opacity:1}.detail{font-size:12px;margin:3px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.detail vdr-entity-info{height:16px}.info-bar{width:25%;padding:0 6px;overflow-y:auto}.info-bar .card{z-index:1}.info-bar .stack{z-index:0;opacity:0;transform:perspective(500px) translateZ(0) translateY(-16px);height:16px;transition:transform .3s,opacity 0s .3s;background-color:#fff}.info-bar .stack.visible{opacity:1;transform:perspective(500px) translateZ(-44px) translateY(0);background-color:var(--color-component-bg-100);transition:transform .3s,color .3s}.info-bar .selection-count{opacity:0;position:relative;text-align:center;visibility:hidden;transition:opacity .3s,visibility 0s .3s}.info-bar .selection-count.visible{opacity:1;visibility:visible;transition:opacity .3s,visibility 0s}.info-bar .selection-count ul{text-align:left;list-style-type:none;margin-left:12px}.info-bar .selection-count ul li{font-size:12px}.info-bar .placeholder{text-align:center;color:var(--color-grey-300)}.info-bar .preview img{max-width:100%}.info-bar .details{font-size:12px;word-break:break-all}.info-bar .name{line-height:14px;font-weight:bold}\n"]
7416
8046
  },] }
7417
8047
  ];
7418
8048
  AssetGalleryComponent.ctorParameters = function () { return [
@@ -7716,7 +8346,7 @@
7716
8346
  }
7717
8347
  };
7718
8348
  AssetPreviewComponent.prototype.getSourceFileName = function () {
7719
- var parts = this.asset.source.split('/');
8349
+ var parts = this.asset.source.split(/[\\\/]/g);
7720
8350
  return parts[parts.length - 1];
7721
8351
  };
7722
8352
  AssetPreviewComponent.prototype.onImageLoad = function () {
@@ -7814,9 +8444,9 @@
7814
8444
  AssetPreviewComponent.decorators = [
7815
8445
  { type: i0.Component, args: [{
7816
8446
  selector: 'vdr-asset-preview',
7817
- 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 <vdr-asset-preview-links class=\"mb4\" [asset]=\"asset\"></vdr-asset-preview-links>\r\n <div *ngIf=\"!editable\" class=\"edit-button-wrapper\">\r\n <a\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</div>\r\n",
8447
+ 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 [ngClass]=\"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 <vdr-asset-preview-links class=\"mb4\" [asset]=\"asset\"></vdr-asset-preview-links>\r\n <div *ngIf=\"!editable\" class=\"edit-button-wrapper\">\r\n <a\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</div>\r\n",
7818
8448
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7819
- 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}.controls .preview-select clr-select-container{margin-right:12px}.edit-button-wrapper{padding-top:6px;border-top:1px solid var(--color-component-border-100);text-align:center}\n"]
8449
+ 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 .asset-image.tiny{max-width:50px;max-height:50px}.preview-image .asset-image.thumb{max-width:150px;max-height:150px}.preview-image .asset-image.small{max-width:300px;max-height:300px}.preview-image .asset-image.medium{max-width:500px;max-height:500px}.preview-image .asset-image.large{max-width:800px;max-height:800px}.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}.controls .preview-select clr-select-container{margin-right:12px}.edit-button-wrapper{padding-top:6px;border-top:1px solid var(--color-component-border-100);text-align:center}\n"]
7820
8450
  },] }
7821
8451
  ];
7822
8452
  AssetPreviewComponent.ctorParameters = function () { return [
@@ -7893,7 +8523,7 @@
7893
8523
  return new SingleSearchSelectionModel();
7894
8524
  }
7895
8525
 
7896
- var ɵ0 = SingleSearchSelectionModelFactory;
8526
+ var ɵ0$1 = SingleSearchSelectionModelFactory;
7897
8527
  var AssetSearchInputComponent = /** @class */ (function () {
7898
8528
  function AssetSearchInputComponent() {
7899
8529
  var _this = this;
@@ -7984,7 +8614,7 @@
7984
8614
  selector: 'vdr-asset-search-input',
7985
8615
  template: "<ng-select\r\n [addTag]=\"addTagFn\"\r\n [placeholder]=\"'catalog.search-asset-name-or-tag' | translate\"\r\n [items]=\"tags\"\r\n [searchFn]=\"filterTagResults\"\r\n [hideSelected]=\"true\"\r\n [multiple]=\"true\"\r\n [markFirst]=\"false\"\r\n (change)=\"onSelectChange($event)\"\r\n #selectComponent\r\n>\r\n <ng-template ng-header-tmp>\r\n <div\r\n class=\"search-header\"\r\n *ngIf=\"selectComponent.searchTerm\"\r\n [class.selected]=\"isSearchHeaderSelected()\"\r\n (click)=\"selectComponent.selectTag()\"\r\n >\r\n {{ 'catalog.search-for-term' | translate }}: {{ selectComponent.searchTerm }}\r\n </div>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <ng-container *ngIf=\"item.value\">\r\n <vdr-chip [colorFrom]=\"item.value\" icon=\"close\" (iconClick)=\"clear(item)\"><clr-icon shape=\"tag\" class=\"mr2\"></clr-icon> {{ item.value }}</vdr-chip>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.value\">\r\n <vdr-chip [icon]=\"'times'\" (iconClick)=\"clear(item)\">\"{{ item.label || item }}\"</vdr-chip>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n <ng-container *ngIf=\"item.value\">\r\n <vdr-chip [colorFrom]=\"item.value\"><clr-icon shape=\"tag\" class=\"mr2\"></clr-icon> {{ item.value }}</vdr-chip>\r\n </ng-container>\r\n </ng-template>\r\n</ng-select>\r\n",
7986
8616
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
7987
- providers: [{ provide: ngSelect.SELECTION_MODEL_FACTORY, useValue: ɵ0 }],
8617
+ providers: [{ provide: ngSelect.SELECTION_MODEL_FACTORY, useValue: ɵ0$1 }],
7988
8618
  styles: [":host{display:block;width:100%}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{background:none;margin:0}:host ::ng-deep .ng-dropdown-panel-items div.ng-option:last-child{display:none}:host ::ng-deep .ng-dropdown-panel .ng-dropdown-header{border:none;padding:0}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{padding:0}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-left:8px}ng-select{width:100%;min-width:300px;margin-right:12px}.search-header{padding:8px 10px;border-bottom:1px solid var(--color-component-border-100);cursor:pointer}.search-header.selected,.search-header:hover{background-color:var(--color-component-bg-200)}\n"]
7989
8619
  },] }
7990
8620
  ];
@@ -8037,394 +8667,137 @@
8037
8667
  this.onTouched();
8038
8668
  }
8039
8669
  };
8040
- ChannelAssignmentControlComponent.prototype.channelIsDisabled = function (id) {
8041
- return this.disableChannelIds.includes(id);
8042
- };
8043
- ChannelAssignmentControlComponent.prototype.valueChanged = function (value) {
8044
- if (Array.isArray(value)) {
8045
- this.onChange(value.map(function (c) { return c.id; }));
8046
- }
8047
- else {
8048
- this.onChange([value ? value.id : undefined]);
8049
- }
8050
- };
8051
- ChannelAssignmentControlComponent.prototype.compareFn = function (c1, c2) {
8052
- var c1id = typeof c1 === 'string' ? c1 : c1.id;
8053
- var c2id = typeof c2 === 'string' ? c2 : c2.id;
8054
- return c1id === c2id;
8055
- };
8056
- ChannelAssignmentControlComponent.prototype.mapIncomingValueToChannels = function (value) {
8057
- var _this = this;
8058
- var _a;
8059
- if (Array.isArray(value)) {
8060
- if (typeof value[0] === 'string') {
8061
- this.value = value
8062
- .map(function (id) { var _a; return (_a = _this.channels) === null || _a === void 0 ? void 0 : _a.find(function (c) { return c.id === id; }); })
8063
- .filter(sharedUtils.notNullOrUndefined);
8064
- }
8065
- else {
8066
- this.value = value;
8067
- }
8068
- }
8069
- else {
8070
- if (typeof value === 'string') {
8071
- var channel = (_a = this.channels) === null || _a === void 0 ? void 0 : _a.find(function (c) { return c.id === value; });
8072
- if (channel) {
8073
- this.value = [channel];
8074
- }
8075
- }
8076
- else if (value && value.id) {
8077
- this.value = [value];
8078
- }
8079
- }
8080
- };
8081
- return ChannelAssignmentControlComponent;
8082
- }());
8083
- ChannelAssignmentControlComponent.decorators = [
8084
- { type: i0.Component, args: [{
8085
- selector: 'vdr-channel-assignment-control',
8086
- template: "<ng-select\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"multiple\"\r\n [ngModel]=\"value\"\r\n [clearable]=\"false\"\r\n [searchable]=\"false\"\r\n [disabled]=\"disabled\"\r\n [compareWith]=\"compareFn\"\r\n (focus)=\"focussed()\"\r\n (change)=\"valueChanged($event)\"\r\n>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span aria-hidden=\"true\" class=\"ng-value-icon left\" (click)=\"clear(item)\"> \u00D7 </span>\r\n <vdr-channel-badge [channelCode]=\"item.code\"></vdr-channel-badge>\r\n <span class=\"channel-label\">{{ item.code | channelCodeToLabel | translate }}</span>\r\n </ng-template>\r\n <ng-option *ngFor=\"let item of channels$ | async\" [value]=\"item\" [disabled]=\"channelIsDisabled(item.id)\">\r\n <vdr-channel-badge [channelCode]=\"item.code\"></vdr-channel-badge>\r\n {{ item.code | channelCodeToLabel | translate }}\r\n </ng-option>\r\n</ng-select>\r\n\r\n",
8087
- changeDetection: i0.ChangeDetectionStrategy.Default,
8088
- providers: [
8089
- {
8090
- provide: forms.NG_VALUE_ACCESSOR,
8091
- useExisting: ChannelAssignmentControlComponent,
8092
- multi: true,
8093
- },
8094
- ],
8095
- styles: [":host{min-width:200px}:host.clr-input{border-bottom:none;padding:0}::ng-deep .ng-value>vdr-channel-badge,::ng-deep .ng-option>vdr-channel-badge{margin-bottom:-1px}::ng-deep .ng-value>vdr-channel-badge{margin-left:6px}.channel-label{margin-right:6px}\n"]
8096
- },] }
8097
- ];
8098
- ChannelAssignmentControlComponent.ctorParameters = function () { return [
8099
- { type: DataService }
8100
- ]; };
8101
- ChannelAssignmentControlComponent.propDecorators = {
8102
- multiple: [{ type: i0.Input }],
8103
- includeDefaultChannel: [{ type: i0.Input }],
8104
- disableChannelIds: [{ type: i0.Input }]
8105
- };
8106
-
8107
- var ChannelBadgeComponent = /** @class */ (function () {
8108
- function ChannelBadgeComponent() {
8109
- }
8110
- Object.defineProperty(ChannelBadgeComponent.prototype, "isDefaultChannel", {
8111
- get: function () {
8112
- return this.channelCode === sharedConstants.DEFAULT_CHANNEL_CODE;
8113
- },
8114
- enumerable: false,
8115
- configurable: true
8116
- });
8117
- return ChannelBadgeComponent;
8118
- }());
8119
- ChannelBadgeComponent.decorators = [
8120
- { type: i0.Component, args: [{
8121
- selector: 'vdr-channel-badge',
8122
- template: "<clr-icon shape=\"layers\" [style.color]=\"isDefaultChannel ? '#aaa' : (channelCode | stringToColor)\"></clr-icon>\r\n",
8123
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
8124
- styles: [":host{display:inline-block}button :host{margin-bottom:-1px}clr-icon{margin-right:6px}\n"]
8125
- },] }
8126
- ];
8127
- ChannelBadgeComponent.propDecorators = {
8128
- channelCode: [{ type: i0.Input }]
8129
- };
8130
-
8131
- /**
8132
- * @description
8133
- * A chip component for displaying a label with an optional action icon.
8134
- *
8135
- * @example
8136
- * ```HTML
8137
- * <vdr-chip [colorFrom]="item.value"
8138
- * icon="close"
8139
- * (iconClick)="clear(item)">
8140
- * {{ item.value }}</vdr-chip>
8141
- * ```
8142
- * @docsCategory components
8143
- */
8144
- var ChipComponent = /** @class */ (function () {
8145
- function ChipComponent() {
8146
- this.invert = false;
8147
- /**
8148
- * @description
8149
- * If set, the chip will have an auto-generated background
8150
- * color based on the string value passed in.
8151
- */
8152
- this.colorFrom = '';
8153
- this.iconClick = new i0.EventEmitter();
8154
- }
8155
- return ChipComponent;
8156
- }());
8157
- ChipComponent.decorators = [
8158
- { type: i0.Component, args: [{
8159
- selector: 'vdr-chip',
8160
- template: "<div\r\n class=\"wrapper\"\r\n [class.with-background]=\"!invert && colorFrom\"\r\n [style.backgroundColor]=\"!invert && (colorFrom | stringToColor)\"\r\n [style.color]=\"invert && (colorFrom | stringToColor)\"\r\n [style.borderColor]=\"invert && (colorFrom | stringToColor)\"\r\n [ngClass]=\"colorType\"\r\n>\r\n <div class=\"chip-label\"><ng-content></ng-content></div>\r\n <div class=\"chip-icon\" *ngIf=\"icon\">\r\n <button (click)=\"iconClick.emit($event)\">\r\n <clr-icon\r\n [attr.shape]=\"icon\"\r\n [style.color]=\"invert && (colorFrom | stringToColor)\"\r\n [class.is-inverse]=\"!invert && colorFrom\"\r\n ></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n",
8161
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
8162
- styles: [":host{display:inline-block}.wrapper{display:flex;border:1px solid var(--color-component-border-300);border-radius:3px;margin:6px}.wrapper.with-background{color:var(--color-grey-100);border-color:transparent}.wrapper.with-background .chip-label{opacity:.9}.wrapper.warning{border-color:var(--color-chip-warning-border)}.wrapper.warning .chip-label{color:var(--color-chip-warning-text);background-color:var(--color-chip-warning-bg)}.wrapper.success{border-color:var(--color-chip-success-border)}.wrapper.success .chip-label{color:var(--color-chip-success-text);background-color:var(--color-chip-success-bg)}.wrapper.error{border-color:var(--color-chip-error-border)}.wrapper.error .chip-label{color:var(--color-chip-error-text);background-color:var(--color-chip-error-bg)}.chip-label{padding:3px 6px;line-height:1em;border-radius:3px;white-space:nowrap;display:flex;align-items:center}.chip-icon{border-left:1px solid var(--color-component-border-200);padding:0 3px;line-height:1em;display:flex}.chip-icon button{cursor:pointer;background:none;margin:0;padding:0;border:none}\n"]
8163
- },] }
8164
- ];
8165
- ChipComponent.propDecorators = {
8166
- icon: [{ type: i0.Input }],
8167
- invert: [{ type: i0.Input }],
8168
- colorFrom: [{ type: i0.Input }],
8169
- colorType: [{ type: i0.Input }],
8170
- iconClick: [{ type: i0.Output }]
8171
- };
8172
-
8173
- /**
8174
- * ConfigArg values are always stored as strings. If they are not primitives, then
8175
- * they are JSON-encoded. This function unwraps them back into their original
8176
- * data type.
8177
- */
8178
- function getConfigArgValue(value) {
8179
- try {
8180
- return value ? JSON.parse(value) : undefined;
8181
- }
8182
- catch (e) {
8183
- return value;
8184
- }
8185
- }
8186
- function encodeConfigArgValue(value) {
8187
- return Array.isArray(value) ? JSON.stringify(value) : (value !== null && value !== void 0 ? value : '').toString();
8188
- }
8189
- /**
8190
- * Creates an empty ConfigurableOperation object based on the definition.
8191
- */
8192
- function configurableDefinitionToInstance(def) {
8193
- return Object.assign(Object.assign({}, def), { args: def.args.map(function (arg) {
8194
- return Object.assign(Object.assign({}, arg), { value: getDefaultConfigArgValue(arg) });
8195
- }) });
8196
- }
8197
- /**
8198
- * Converts an object of the type:
8199
- * ```
8200
- * {
8201
- * code: 'my-operation',
8202
- * args: {
8203
- * someProperty: 'foo'
8204
- * }
8205
- * }
8206
- * ```
8207
- * to the format defined by the ConfigurableOperationInput GraphQL input type:
8208
- * ```
8209
- * {
8210
- * code: 'my-operation',
8211
- * args: [
8212
- * { name: 'someProperty', value: 'foo' }
8213
- * ]
8214
- * }
8215
- * ```
8216
- */
8217
- function toConfigurableOperationInput(operation, formValueOperations) {
8218
- return {
8219
- code: operation.code,
8220
- arguments: Object.values(formValueOperations.args || {}).map(function (value, j) { return ({
8221
- name: operation.args[j].name,
8222
- value: value.hasOwnProperty('value')
8223
- ? encodeConfigArgValue(value.value)
8224
- : encodeConfigArgValue(value),
8225
- }); }),
8226
- };
8227
- }
8228
- function configurableOperationValueIsValid(def, value) {
8229
- var e_1, _b;
8230
- if (!def || !value) {
8231
- return false;
8232
- }
8233
- if (def.code !== value.code) {
8234
- return false;
8235
- }
8236
- try {
8237
- for (var _c = __values(def.args), _d = _c.next(); !_d.done; _d = _c.next()) {
8238
- var argDef = _d.value;
8239
- var argVal = value.args[argDef.name];
8240
- if (argDef.required && (argVal == null || argVal === '' || argVal === '0')) {
8241
- return false;
8242
- }
8243
- }
8244
- }
8245
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
8246
- finally {
8247
- try {
8248
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
8249
- }
8250
- finally { if (e_1) throw e_1.error; }
8251
- }
8252
- return true;
8253
- }
8254
- /**
8255
- * Returns a default value based on the type of the config arg.
8256
- */
8257
- function getDefaultConfigArgValue(arg) {
8258
- var _a;
8259
- return arg.list ? [] : (_a = arg.defaultValue) !== null && _a !== void 0 ? _a : null;
8260
- }
8261
-
8262
- /**
8263
- * Interpolates the description of an ConfigurableOperation with the given values.
8264
- */
8265
- function interpolateDescription(operation, values) {
8266
- if (!operation) {
8267
- return '';
8268
- }
8269
- var templateString = operation.description;
8270
- var interpolated = templateString.replace(/{\s*([a-zA-Z0-9]+)\s*}/gi, function (substring, argName) {
8271
- var normalizedArgName = argName.toLowerCase();
8272
- var value = values[normalizedArgName];
8273
- if (value == null) {
8274
- return '_';
8275
- }
8276
- var formatted = value;
8277
- var argDef = operation.args.find(function (arg) { return arg.name === normalizedArgName; });
8278
- if (argDef && argDef.type === 'int' && argDef.ui && argDef.ui.component === 'currency-form-input') {
8279
- formatted = value / 100;
8280
- }
8281
- if (argDef && argDef.type === 'datetime' && value instanceof Date) {
8282
- formatted = value.toLocaleDateString();
8283
- }
8284
- return formatted;
8285
- });
8286
- return interpolated;
8287
- }
8288
-
8289
- /**
8290
- * A form input which renders a card with the internal form fields of the given ConfigurableOperation.
8291
- */
8292
- var ConfigurableInputComponent = /** @class */ (function () {
8293
- function ConfigurableInputComponent() {
8294
- this.readonly = false;
8295
- this.removable = true;
8296
- this.remove = new i0.EventEmitter();
8297
- this.argValues = {};
8298
- this.form = new forms.FormGroup({});
8299
- }
8300
- ConfigurableInputComponent.prototype.interpolateDescription = function () {
8301
- if (this.operationDefinition) {
8302
- return interpolateDescription(this.operationDefinition, this.form.value);
8303
- }
8304
- else {
8305
- return '';
8306
- }
8307
- };
8308
- ConfigurableInputComponent.prototype.ngOnChanges = function (changes) {
8309
- if ('operation' in changes || 'operationDefinition' in changes) {
8310
- this.createForm();
8311
- }
8312
- };
8313
- ConfigurableInputComponent.prototype.ngOnDestroy = function () {
8314
- if (this.subscription) {
8315
- this.subscription.unsubscribe();
8316
- }
8317
- };
8318
- ConfigurableInputComponent.prototype.registerOnChange = function (fn) {
8319
- this.onChange = fn;
8320
- };
8321
- ConfigurableInputComponent.prototype.registerOnTouched = function (fn) {
8322
- this.onTouch = fn;
8323
- };
8324
- ConfigurableInputComponent.prototype.setDisabledState = function (isDisabled) {
8325
- if (isDisabled) {
8326
- this.form.disable();
8670
+ ChannelAssignmentControlComponent.prototype.channelIsDisabled = function (id) {
8671
+ return this.disableChannelIds.includes(id);
8672
+ };
8673
+ ChannelAssignmentControlComponent.prototype.valueChanged = function (value) {
8674
+ if (Array.isArray(value)) {
8675
+ this.onChange(value.map(function (c) { return c.id; }));
8327
8676
  }
8328
8677
  else {
8329
- this.form.enable();
8330
- }
8331
- };
8332
- ConfigurableInputComponent.prototype.writeValue = function (value) {
8333
- if (value) {
8334
- this.form.patchValue(value);
8678
+ this.onChange([value ? value.id : undefined]);
8335
8679
  }
8336
8680
  };
8337
- ConfigurableInputComponent.prototype.trackByName = function (index, arg) {
8338
- return arg.name;
8339
- };
8340
- ConfigurableInputComponent.prototype.getArgDef = function (arg) {
8341
- var _a;
8342
- return (_a = this.operationDefinition) === null || _a === void 0 ? void 0 : _a.args.find(function (a) { return a.name === arg.name; });
8681
+ ChannelAssignmentControlComponent.prototype.compareFn = function (c1, c2) {
8682
+ var c1id = typeof c1 === 'string' ? c1 : c1.id;
8683
+ var c2id = typeof c2 === 'string' ? c2 : c2.id;
8684
+ return c1id === c2id;
8343
8685
  };
8344
- ConfigurableInputComponent.prototype.createForm = function () {
8345
- var e_1, _c;
8686
+ ChannelAssignmentControlComponent.prototype.mapIncomingValueToChannels = function (value) {
8346
8687
  var _this = this;
8347
- var _a, _b;
8348
- if (!this.operation) {
8349
- return;
8350
- }
8351
- if (this.subscription) {
8352
- this.subscription.unsubscribe();
8353
- }
8354
- this.form = new forms.FormGroup({});
8355
- this.form.__id = Math.random().toString(36).substr(10);
8356
- if (this.operation.args) {
8357
- var _loop_1 = function (arg) {
8358
- var value = (_b = this_1.operation.args.find(function (a) { return a.name === arg.name; })) === null || _b === void 0 ? void 0 : _b.value;
8359
- if (value === undefined) {
8360
- value = getDefaultConfigArgValue(arg);
8361
- }
8362
- var validators = arg.list ? undefined : arg.required ? forms.Validators.required : undefined;
8363
- this_1.form.addControl(arg.name, new forms.FormControl(value, validators));
8364
- };
8365
- var this_1 = this;
8366
- try {
8367
- for (var _d = __values(((_a = this.operationDefinition) === null || _a === void 0 ? void 0 : _a.args) || []), _e = _d.next(); !_e.done; _e = _d.next()) {
8368
- var arg = _e.value;
8369
- _loop_1(arg);
8370
- }
8688
+ var _a;
8689
+ if (Array.isArray(value)) {
8690
+ if (typeof value[0] === 'string') {
8691
+ this.value = value
8692
+ .map(function (id) { var _a; return (_a = _this.channels) === null || _a === void 0 ? void 0 : _a.find(function (c) { return c.id === id; }); })
8693
+ .filter(sharedUtils.notNullOrUndefined);
8371
8694
  }
8372
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
8373
- finally {
8374
- try {
8375
- if (_e && !_e.done && (_c = _d.return)) _c.call(_d);
8376
- }
8377
- finally { if (e_1) throw e_1.error; }
8695
+ else {
8696
+ this.value = value;
8378
8697
  }
8379
8698
  }
8380
- this.subscription = this.form.valueChanges.subscribe(function (value) {
8381
- if (_this.onChange) {
8382
- _this.onChange({
8383
- code: _this.operation && _this.operation.code,
8384
- args: value,
8385
- });
8699
+ else {
8700
+ if (typeof value === 'string') {
8701
+ var channel = (_a = this.channels) === null || _a === void 0 ? void 0 : _a.find(function (c) { return c.id === value; });
8702
+ if (channel) {
8703
+ this.value = [channel];
8704
+ }
8386
8705
  }
8387
- if (_this.onTouch) {
8388
- _this.onTouch();
8706
+ else if (value && value.id) {
8707
+ this.value = [value];
8389
8708
  }
8390
- });
8391
- };
8392
- ConfigurableInputComponent.prototype.validate = function (c) {
8393
- if (this.form.invalid) {
8394
- return {
8395
- required: true,
8396
- };
8397
8709
  }
8398
- return null;
8399
8710
  };
8400
- return ConfigurableInputComponent;
8711
+ return ChannelAssignmentControlComponent;
8401
8712
  }());
8402
- ConfigurableInputComponent.decorators = [
8713
+ ChannelAssignmentControlComponent.decorators = [
8403
8714
  { type: i0.Component, args: [{
8404
- selector: 'vdr-configurable-input',
8405
- template: "<div class=\"card\" *ngIf=\"operation\">\r\n <div class=\"card-block\">{{ interpolateDescription() }}</div>\r\n <div class=\"card-block\" *ngIf=\"operation.args?.length\">\r\n <form [formGroup]=\"form\" *ngIf=\"operation\" class=\"operation-inputs\">\r\n <div *ngFor=\"let arg of operation.args; trackBy: trackByName\" class=\"arg-row\">\r\n <ng-container *ngIf=\"form.get(arg.name)\">\r\n <label>{{ getArgDef(arg)?.label || (arg.name | sentenceCase) }}</label>\r\n <vdr-dynamic-form-input\r\n [def]=\"getArgDef(arg)\"\r\n [readonly]=\"readonly\"\r\n [control]=\"form.get(arg.name)\"\r\n [formControlName]=\"arg.name\"\r\n ></vdr-dynamic-form-input>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"!readonly && removable\">\r\n <button class=\"btn btn-sm btn-link btn-warning\" (click)=\"remove.emit(operation)\">\r\n <clr-icon shape=\"times\"></clr-icon>\r\n {{ 'common.remove' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n",
8406
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
8715
+ selector: 'vdr-channel-assignment-control',
8716
+ template: "<ng-select\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"multiple\"\r\n [ngModel]=\"value\"\r\n [clearable]=\"false\"\r\n [searchable]=\"false\"\r\n [disabled]=\"disabled\"\r\n [compareWith]=\"compareFn\"\r\n (focus)=\"focussed()\"\r\n (change)=\"valueChanged($event)\"\r\n>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span aria-hidden=\"true\" class=\"ng-value-icon left\" (click)=\"clear(item)\"> \u00D7 </span>\r\n <vdr-channel-badge [channelCode]=\"item.code\"></vdr-channel-badge>\r\n <span class=\"channel-label\">{{ item.code | channelCodeToLabel | translate }}</span>\r\n </ng-template>\r\n <ng-option *ngFor=\"let item of channels$ | async\" [value]=\"item\" [disabled]=\"channelIsDisabled(item.id)\">\r\n <vdr-channel-badge [channelCode]=\"item.code\"></vdr-channel-badge>\r\n {{ item.code | channelCodeToLabel | translate }}\r\n </ng-option>\r\n</ng-select>\r\n\r\n",
8717
+ changeDetection: i0.ChangeDetectionStrategy.Default,
8407
8718
  providers: [
8408
8719
  {
8409
8720
  provide: forms.NG_VALUE_ACCESSOR,
8410
- useExisting: ConfigurableInputComponent,
8411
- multi: true,
8412
- },
8413
- {
8414
- provide: forms.NG_VALIDATORS,
8415
- useExisting: i0.forwardRef(function () { return ConfigurableInputComponent; }),
8721
+ useExisting: ChannelAssignmentControlComponent,
8416
8722
  multi: true,
8417
8723
  },
8418
8724
  ],
8419
- styles: [":host{display:block;margin-bottom:12px}:host>.card{margin-top:6px}.operation-inputs{padding-top:0}.operation-inputs .arg-row:not(:last-child){margin-bottom:24px}.operation-inputs .arg-row label{margin-right:6px}.operation-inputs .hidden{display:none}\n"]
8725
+ styles: [":host{min-width:200px}:host.clr-input{border-bottom:none;padding:0}::ng-deep .ng-value>vdr-channel-badge,::ng-deep .ng-option>vdr-channel-badge{margin-bottom:-1px}::ng-deep .ng-value>vdr-channel-badge{margin-left:6px}.channel-label{margin-right:6px}\n"]
8420
8726
  },] }
8421
8727
  ];
8422
- ConfigurableInputComponent.propDecorators = {
8423
- operation: [{ type: i0.Input }],
8424
- operationDefinition: [{ type: i0.Input }],
8425
- readonly: [{ type: i0.Input }],
8426
- removable: [{ type: i0.Input }],
8427
- remove: [{ type: i0.Output }]
8728
+ ChannelAssignmentControlComponent.ctorParameters = function () { return [
8729
+ { type: DataService }
8730
+ ]; };
8731
+ ChannelAssignmentControlComponent.propDecorators = {
8732
+ multiple: [{ type: i0.Input }],
8733
+ includeDefaultChannel: [{ type: i0.Input }],
8734
+ disableChannelIds: [{ type: i0.Input }]
8735
+ };
8736
+
8737
+ var ChannelBadgeComponent = /** @class */ (function () {
8738
+ function ChannelBadgeComponent() {
8739
+ }
8740
+ Object.defineProperty(ChannelBadgeComponent.prototype, "isDefaultChannel", {
8741
+ get: function () {
8742
+ return this.channelCode === sharedConstants.DEFAULT_CHANNEL_CODE;
8743
+ },
8744
+ enumerable: false,
8745
+ configurable: true
8746
+ });
8747
+ return ChannelBadgeComponent;
8748
+ }());
8749
+ ChannelBadgeComponent.decorators = [
8750
+ { type: i0.Component, args: [{
8751
+ selector: 'vdr-channel-badge',
8752
+ template: "<clr-icon shape=\"layers\" [style.color]=\"isDefaultChannel ? '#aaa' : (channelCode | stringToColor)\"></clr-icon>\r\n",
8753
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
8754
+ styles: [":host{display:inline-block}button :host{margin-bottom:-1px}clr-icon{margin-right:6px}\n"]
8755
+ },] }
8756
+ ];
8757
+ ChannelBadgeComponent.propDecorators = {
8758
+ channelCode: [{ type: i0.Input }]
8759
+ };
8760
+
8761
+ /**
8762
+ * @description
8763
+ * A chip component for displaying a label with an optional action icon.
8764
+ *
8765
+ * @example
8766
+ * ```HTML
8767
+ * <vdr-chip [colorFrom]="item.value"
8768
+ * icon="close"
8769
+ * (iconClick)="clear(item)">
8770
+ * {{ item.value }}</vdr-chip>
8771
+ * ```
8772
+ * @docsCategory components
8773
+ */
8774
+ var ChipComponent = /** @class */ (function () {
8775
+ function ChipComponent() {
8776
+ this.invert = false;
8777
+ /**
8778
+ * @description
8779
+ * If set, the chip will have an auto-generated background
8780
+ * color based on the string value passed in.
8781
+ */
8782
+ this.colorFrom = '';
8783
+ this.iconClick = new i0.EventEmitter();
8784
+ }
8785
+ return ChipComponent;
8786
+ }());
8787
+ ChipComponent.decorators = [
8788
+ { type: i0.Component, args: [{
8789
+ selector: 'vdr-chip',
8790
+ template: "<div\r\n class=\"wrapper\"\r\n [class.with-background]=\"!invert && colorFrom\"\r\n [style.backgroundColor]=\"!invert && (colorFrom | stringToColor)\"\r\n [style.color]=\"invert && (colorFrom | stringToColor)\"\r\n [style.borderColor]=\"invert && (colorFrom | stringToColor)\"\r\n [ngClass]=\"colorType\"\r\n>\r\n <div class=\"chip-label\"><ng-content></ng-content></div>\r\n <div class=\"chip-icon\" *ngIf=\"icon\">\r\n <button (click)=\"iconClick.emit($event)\">\r\n <clr-icon\r\n [attr.shape]=\"icon\"\r\n [style.color]=\"invert && (colorFrom | stringToColor)\"\r\n [class.is-inverse]=\"!invert && colorFrom\"\r\n ></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n",
8791
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
8792
+ styles: [":host{display:inline-block}.wrapper{display:flex;border:1px solid var(--color-component-border-300);border-radius:3px;margin:6px}.wrapper.with-background{color:var(--color-grey-100);border-color:transparent}.wrapper.with-background .chip-label{opacity:.9}.wrapper.warning{border-color:var(--color-chip-warning-border)}.wrapper.warning .chip-label{color:var(--color-chip-warning-text);background-color:var(--color-chip-warning-bg)}.wrapper.success{border-color:var(--color-chip-success-border)}.wrapper.success .chip-label{color:var(--color-chip-success-text);background-color:var(--color-chip-success-bg)}.wrapper.error{border-color:var(--color-chip-error-border)}.wrapper.error .chip-label{color:var(--color-chip-error-text);background-color:var(--color-chip-error-bg)}.chip-label{padding:3px 6px;line-height:1em;border-radius:3px;white-space:nowrap;display:flex;align-items:center}.chip-icon{border-left:1px solid var(--color-component-border-200);padding:0 3px;line-height:1em;display:flex}.chip-icon button{cursor:pointer;background:none;margin:0;padding:0;border:none}\n"]
8793
+ },] }
8794
+ ];
8795
+ ChipComponent.propDecorators = {
8796
+ icon: [{ type: i0.Input }],
8797
+ invert: [{ type: i0.Input }],
8798
+ colorFrom: [{ type: i0.Input }],
8799
+ colorType: [{ type: i0.Input }],
8800
+ iconClick: [{ type: i0.Output }]
8428
8801
  };
8429
8802
 
8430
8803
  /**
@@ -10152,7 +10525,7 @@
10152
10525
  selector: 'vdr-help-tooltip',
10153
10526
  template: "<clr-tooltip>\r\n <clr-icon clrTooltipTrigger shape=\"help\" size=\"14\"></clr-icon>\r\n <clr-tooltip-content [clrPosition]=\"position\" clrSize=\"md\" *clrIfOpen>\r\n <span>{{ content }}</span>\r\n </clr-tooltip-content>\r\n</clr-tooltip>\r\n",
10154
10527
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
10155
- styles: [""]
10528
+ styles: ["clr-tooltip{display:inline-flex}\n"]
10156
10529
  },] }
10157
10530
  ];
10158
10531
  HelpTooltipComponent.propDecorators = {
@@ -10439,6 +10812,110 @@
10439
10812
  pageChange: [{ type: i0.Output }]
10440
10813
  };
10441
10814
 
10815
+ var ɵ0 = SingleSearchSelectionModelFactory;
10816
+ var ProductSearchInputComponent = /** @class */ (function () {
10817
+ function ProductSearchInputComponent() {
10818
+ var _this = this;
10819
+ this.searchTermChange = new i0.EventEmitter();
10820
+ this.facetValueChange = new i0.EventEmitter();
10821
+ this.lastTerm = '';
10822
+ this.lastFacetValueIds = [];
10823
+ this.filterFacetResults = function (term, item) {
10824
+ if (!_this.isFacetValueItem(item)) {
10825
+ return false;
10826
+ }
10827
+ var cix = term.indexOf(':');
10828
+ var facetName = cix > -1 ? term.toLowerCase().slice(0, cix) : null;
10829
+ var facetVal = cix > -1 ? term.toLowerCase().slice(cix + 1) : term.toLowerCase();
10830
+ if (facetName) {
10831
+ return (item.facetValue.facet.name.toLowerCase().includes(facetName) &&
10832
+ item.facetValue.name.toLocaleLowerCase().includes(facetVal));
10833
+ }
10834
+ return (item.facetValue.name.toLowerCase().includes(term.toLowerCase()) ||
10835
+ item.facetValue.facet.name.toLowerCase().includes(term.toLowerCase()));
10836
+ };
10837
+ this.isFacetValueItem = function (input) {
10838
+ return typeof input === 'object' && !!input && input.hasOwnProperty('facetValue');
10839
+ };
10840
+ }
10841
+ ProductSearchInputComponent.prototype.setSearchTerm = function (term) {
10842
+ var _this = this;
10843
+ if (term) {
10844
+ this.selectComponent.select({ label: term, value: { label: term } });
10845
+ }
10846
+ else {
10847
+ var currentTerm = this.selectComponent.selectedItems.find(function (i) { return !_this.isFacetValueItem(i.value); });
10848
+ if (currentTerm) {
10849
+ this.selectComponent.unselect(currentTerm);
10850
+ }
10851
+ }
10852
+ };
10853
+ ProductSearchInputComponent.prototype.setFacetValues = function (ids) {
10854
+ var _this = this;
10855
+ var items = this.selectComponent.items;
10856
+ this.selectComponent.selectedItems.forEach(function (item) {
10857
+ if (_this.isFacetValueItem(item.value) && !ids.includes(item.value.facetValue.id)) {
10858
+ _this.selectComponent.unselect(item);
10859
+ }
10860
+ });
10861
+ ids.map(function (id) {
10862
+ return items === null || items === void 0 ? void 0 : items.find(function (item) { return _this.isFacetValueItem(item) && item.facetValue.id === id; });
10863
+ })
10864
+ .filter(sharedUtils.notNullOrUndefined)
10865
+ .forEach(function (item) {
10866
+ var isSelected = _this.selectComponent.selectedItems.find(function (i) {
10867
+ var val = i.value;
10868
+ if (_this.isFacetValueItem(val)) {
10869
+ return val.facetValue.id === item.facetValue.id;
10870
+ }
10871
+ return false;
10872
+ });
10873
+ if (!isSelected) {
10874
+ _this.selectComponent.select({ label: '', value: item });
10875
+ }
10876
+ });
10877
+ };
10878
+ ProductSearchInputComponent.prototype.onSelectChange = function (selectedItems) {
10879
+ var _this = this;
10880
+ if (!Array.isArray(selectedItems)) {
10881
+ selectedItems = [selectedItems];
10882
+ }
10883
+ var searchTermItem = selectedItems.find(function (item) { return !_this.isFacetValueItem(item); });
10884
+ var searchTerm = searchTermItem ? searchTermItem.label : '';
10885
+ var facetValueIds = selectedItems.filter(this.isFacetValueItem).map(function (i) { return i.facetValue.id; });
10886
+ if (searchTerm !== this.lastTerm) {
10887
+ this.searchTermChange.emit(searchTerm);
10888
+ this.lastTerm = searchTerm;
10889
+ }
10890
+ if (this.lastFacetValueIds.join(',') !== facetValueIds.join(',')) {
10891
+ this.facetValueChange.emit(facetValueIds);
10892
+ this.lastFacetValueIds = facetValueIds;
10893
+ }
10894
+ };
10895
+ ProductSearchInputComponent.prototype.addTagFn = function (item) {
10896
+ return { label: item };
10897
+ };
10898
+ ProductSearchInputComponent.prototype.isSearchHeaderSelected = function () {
10899
+ return this.selectComponent.itemsList.markedIndex === -1;
10900
+ };
10901
+ return ProductSearchInputComponent;
10902
+ }());
10903
+ ProductSearchInputComponent.decorators = [
10904
+ { type: i0.Component, args: [{
10905
+ selector: 'vdr-product-search-input',
10906
+ template: "<ng-select\r\n [addTag]=\"addTagFn\"\r\n [placeholder]=\"'catalog.search-product-name-or-code' | translate\"\r\n [items]=\"facetValueResults\"\r\n [searchFn]=\"filterFacetResults\"\r\n [hideSelected]=\"true\"\r\n [multiple]=\"true\"\r\n [markFirst]=\"false\"\r\n (change)=\"onSelectChange($event)\"\r\n #selectComponent\r\n>\r\n <ng-template ng-header-tmp>\r\n <div\r\n class=\"search-header\"\r\n *ngIf=\"selectComponent.searchTerm\"\r\n [class.selected]=\"isSearchHeaderSelected()\"\r\n (click)=\"selectComponent.selectTag()\"\r\n >\r\n {{ 'catalog.search-for-term' | translate }}: {{ selectComponent.searchTerm }}\r\n </div>\r\n </ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <ng-container *ngIf=\"item.facetValue\">\r\n <vdr-facet-value-chip\r\n [facetValue]=\"item.facetValue\"\r\n [removable]=\"true\"\r\n (remove)=\"clear(item)\"\r\n ></vdr-facet-value-chip>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.facetValue\">\r\n <vdr-chip [icon]=\"'times'\" (iconClick)=\"clear(item)\">\"{{ item.label }}\"</vdr-chip>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n <ng-container *ngIf=\"item.facetValue\">\r\n <vdr-facet-value-chip [facetValue]=\"item.facetValue\" [removable]=\"false\"></vdr-facet-value-chip>\r\n </ng-container>\r\n </ng-template>\r\n</ng-select>\r\n",
10907
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
10908
+ providers: [{ provide: ngSelect.SELECTION_MODEL_FACTORY, useValue: ɵ0 }],
10909
+ styles: [":host{margin-top:6px;display:block;width:100%}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-value{background:none;margin:0}:host ::ng-deep .ng-dropdown-panel-items div.ng-option:last-child{display:none}:host ::ng-deep .ng-dropdown-panel .ng-dropdown-header{border:none;padding:0}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{padding:0}:host ::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container .ng-placeholder{padding-left:8px}ng-select{width:100%;min-width:300px;margin-right:12px}.search-header{padding:8px 10px;border-bottom:1px solid var(--color-component-border-100);cursor:pointer}.search-header.selected,.search-header:hover{background-color:var(--color-component-bg-200)}\n"]
10910
+ },] }
10911
+ ];
10912
+ ProductSearchInputComponent.propDecorators = {
10913
+ facetValueResults: [{ type: i0.Input }],
10914
+ searchTermChange: [{ type: i0.Output }],
10915
+ facetValueChange: [{ type: i0.Output }],
10916
+ selectComponent: [{ type: i0.ViewChild, args: ['selectComponent', { static: true },] }]
10917
+ };
10918
+
10442
10919
  /**
10443
10920
  * @description
10444
10921
  * A component for selecting product variants via an autocomplete-style select input.
@@ -11258,7 +11735,7 @@
11258
11735
  },
11259
11736
  ProsemirrorService,
11260
11737
  ],
11261
- 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"]
11738
+ 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);border-radius:var(--border-radius-input) var(--border-radius-input) 0 0;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 var(--border-radius-input) var(--border-radius-input);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"]
11262
11739
  },] }
11263
11740
  ];
11264
11741
  RichTextEditorComponent.ctorParameters = function () { return [
@@ -11279,6 +11756,7 @@
11279
11756
  function SelectToggleComponent() {
11280
11757
  this.size = 'large';
11281
11758
  this.selected = false;
11759
+ this.hiddenWhenOff = false;
11282
11760
  this.disabled = false;
11283
11761
  this.selectedChange = new i0.EventEmitter();
11284
11762
  }
@@ -11287,14 +11765,15 @@
11287
11765
  SelectToggleComponent.decorators = [
11288
11766
  { type: i0.Component, args: [{
11289
11767
  selector: 'vdr-select-toggle',
11290
- template: "<div\r\n class=\"toggle\"\r\n [class.disabled]=\"disabled\"\r\n [class.small]=\"size === 'small'\"\r\n [attr.tabindex]=\"disabled ? null : 0\"\r\n [class.selected]=\"selected\"\r\n (keydown.enter)=\"selectedChange.emit(!selected)\"\r\n (keydown.space)=\"$event.preventDefault(); selectedChange.emit(!selected)\"\r\n (click)=\"selectedChange.emit(!selected)\"\r\n>\r\n <clr-icon shape=\"check\" [attr.size]=\"size === 'small' ? 16 : 32\"></clr-icon>\r\n</div>\r\n<div class=\"toggle-label\" [class.disabled]=\"disabled\" *ngIf=\"label\" (click)=\"selectedChange.emit(!selected)\">\r\n {{ label }}\r\n</div>\r\n",
11768
+ template: "<div\r\n class=\"toggle\"\r\n [class.hide-when-off]=\"hiddenWhenOff\"\r\n [class.disabled]=\"disabled\"\r\n [class.small]=\"size === 'small'\"\r\n [attr.tabindex]=\"disabled ? null : 0\"\r\n [class.selected]=\"selected\"\r\n (keydown.enter)=\"selectedChange.emit(!selected)\"\r\n (keydown.space)=\"$event.preventDefault(); selectedChange.emit(!selected)\"\r\n (click)=\"selectedChange.emit(!selected)\"\r\n>\r\n <clr-icon shape=\"check-circle\" [attr.size]=\"size === 'small' ? 24 : 32\"></clr-icon>\r\n</div>\r\n<div class=\"toggle-label\" [class.disabled]=\"disabled\" *ngIf=\"label\" (click)=\"selectedChange.emit(!selected)\">\r\n {{ label }}\r\n</div>\r\n",
11291
11769
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
11292
- styles: [":host{display:flex;align-items:center;justify-content:center}.toggle{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer;background-color:var(--color-component-bg-100);border:2px solid var(--color-component-border-300);padding:0 6px;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;color:var(--color-grey-300);transition:background-color .2s,border .2s}.toggle.small{width:24px;height:24px}.toggle:not(.disabled):hover{border-color:var(--color-success-500);background-color:var(--color-success-400);opacity:.9}.toggle.selected{background-color:var(--color-success-500);border-color:var(--color-success-600);color:#fff}.toggle.selected:not(.disabled):hover{background-color:var(--color-success-500);border-color:var(--color-success-400);opacity:.9}.toggle:focus{outline:none;box-shadow:0 0 2px 2px var(--color-primary-500)}.toggle.disabled{cursor:default}.toggle-label{flex:1;margin-left:6px;text-align:left;font-size:12px}.toggle-label:not(.disabled){cursor:pointer}\n"]
11770
+ styles: [":host{display:flex;align-items:center;justify-content:center}.toggle{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:pointer;color:var(--color-grey-300);background-color:var(--color-component-bg-100);border-radius:50%;top:-12px;left:-12px;transition:opacity .2s,color .2s}.toggle.hide-when-off{opacity:0}.toggle.small{width:24px;height:24px}.toggle:not(.disabled):hover{color:var(--color-success-400);opacity:.9}.toggle.selected{opacity:1;color:var(--color-success-500)}.toggle.selected:not(.disabled):hover{color:var(--color-success-400);opacity:.9}.toggle:focus{outline:none;box-shadow:0 0 2px 2px var(--color-primary-500)}.toggle.disabled{cursor:default}.toggle-label{flex:1;margin-left:6px;text-align:left;font-size:12px}.toggle-label:not(.disabled){cursor:pointer}\n"]
11293
11771
  },] }
11294
11772
  ];
11295
11773
  SelectToggleComponent.propDecorators = {
11296
11774
  size: [{ type: i0.Input }],
11297
11775
  selected: [{ type: i0.Input }],
11776
+ hiddenWhenOff: [{ type: i0.Input }],
11298
11777
  disabled: [{ type: i0.Input }],
11299
11778
  label: [{ type: i0.Input }],
11300
11779
  selectedChange: [{ type: i0.Output }]
@@ -12142,7 +12621,7 @@
12142
12621
  }
12143
12622
  RelationAssetInputComponent.prototype.ngOnInit = function () {
12144
12623
  var _this = this;
12145
- this.asset$ = this.parentFormControl.valueChanges.pipe(operators.startWith(this.parentFormControl.value), operators.map(function (asset) { return asset === null || asset === void 0 ? void 0 : asset.id; }), operators.distinctUntilChanged(), operators.switchMap(function (id) {
12624
+ this.asset$ = this.formControl.valueChanges.pipe(operators.startWith(this.formControl.value), operators.map(function (asset) { return asset === null || asset === void 0 ? void 0 : asset.id; }), operators.distinctUntilChanged(), operators.switchMap(function (id) {
12146
12625
  if (id) {
12147
12626
  return _this.dataService.product.getAsset(id).mapStream(function (data) { return data.asset || undefined; });
12148
12627
  }
@@ -12162,14 +12641,14 @@
12162
12641
  })
12163
12642
  .subscribe(function (result) {
12164
12643
  if (result && result.length) {
12165
- _this.parentFormControl.setValue(result[0]);
12166
- _this.parentFormControl.markAsDirty();
12644
+ _this.formControl.setValue(result[0]);
12645
+ _this.formControl.markAsDirty();
12167
12646
  }
12168
12647
  });
12169
12648
  };
12170
12649
  RelationAssetInputComponent.prototype.remove = function () {
12171
- this.parentFormControl.setValue(null);
12172
- this.parentFormControl.markAsDirty();
12650
+ this.formControl.setValue(null);
12651
+ this.formControl.markAsDirty();
12173
12652
  };
12174
12653
  RelationAssetInputComponent.prototype.previewAsset = function (asset) {
12175
12654
  this.modalService
@@ -12182,6 +12661,7 @@
12182
12661
  };
12183
12662
  return RelationAssetInputComponent;
12184
12663
  }());
12664
+ RelationAssetInputComponent.id = 'asset-form-input';
12185
12665
  RelationAssetInputComponent.decorators = [
12186
12666
  { type: i0.Component, args: [{
12187
12667
  selector: 'vdr-relation-asset-input',
@@ -12196,7 +12676,7 @@
12196
12676
  ]; };
12197
12677
  RelationAssetInputComponent.propDecorators = {
12198
12678
  readonly: [{ type: i0.Input }],
12199
- parentFormControl: [{ type: i0.Input }],
12679
+ formControl: [{ type: i0.Input, args: ['parentFormControl',] }],
12200
12680
  config: [{ type: i0.Input }]
12201
12681
  };
12202
12682
 
@@ -13488,6 +13968,8 @@
13488
13968
  UiExtensionPointComponent,
13489
13969
  CustomDetailComponentHostComponent,
13490
13970
  AssetPreviewLinksComponent,
13971
+ ProductMultiSelectorDialogComponent,
13972
+ ProductSearchInputComponent,
13491
13973
  ];
13492
13974
  var DYNAMIC_FORM_INPUTS = [
13493
13975
  TextFormInputComponent,
@@ -13511,6 +13993,8 @@
13511
13993
  TextareaFormInputComponent,
13512
13994
  RichTextFormInputComponent,
13513
13995
  JsonEditorFormInputComponent,
13996
+ ProductMultiSelectorFormInputComponent,
13997
+ CombinationModeFormInputComponent,
13514
13998
  ];
13515
13999
  var SharedModule = /** @class */ (function () {
13516
14000
  function SharedModule() {
@@ -14086,7 +14570,7 @@
14086
14570
  }
14087
14571
 
14088
14572
  // Auto-generated by the set-version.js script.
14089
- var ADMIN_UI_VERSION = '1.5.1';
14573
+ var ADMIN_UI_VERSION = '1.6.1';
14090
14574
 
14091
14575
  /**
14092
14576
  * Responsible for registering dashboard widget components and querying for layouts.
@@ -14412,6 +14896,7 @@
14412
14896
  exports.ChipComponent = ChipComponent;
14413
14897
  exports.ClientDataService = ClientDataService;
14414
14898
  exports.CollectionDataService = CollectionDataService;
14899
+ exports.CombinationModeFormInputComponent = CombinationModeFormInputComponent;
14415
14900
  exports.ComponentRegistryService = ComponentRegistryService;
14416
14901
  exports.ConfigurableInputComponent = ConfigurableInputComponent;
14417
14902
  exports.CoreModule = CoreModule;
@@ -14609,6 +15094,7 @@
14609
15094
  exports.OverlayHostComponent = OverlayHostComponent;
14610
15095
  exports.OverlayHostService = OverlayHostService;
14611
15096
  exports.PAYMENT_METHOD_FRAGMENT = PAYMENT_METHOD_FRAGMENT;
15097
+ exports.PREVIEW_COLLECTION_CONTENTS = PREVIEW_COLLECTION_CONTENTS;
14612
15098
  exports.PRODUCT_DETAIL_FRAGMENT = PRODUCT_DETAIL_FRAGMENT;
14613
15099
  exports.PRODUCT_OPTION_FRAGMENT = PRODUCT_OPTION_FRAGMENT;
14614
15100
  exports.PRODUCT_OPTION_GROUP_FRAGMENT = PRODUCT_OPTION_GROUP_FRAGMENT;
@@ -14620,6 +15106,9 @@
14620
15106
  exports.PasswordFormInputComponent = PasswordFormInputComponent;
14621
15107
  exports.PercentageSuffixInputComponent = PercentageSuffixInputComponent;
14622
15108
  exports.ProductDataService = ProductDataService;
15109
+ exports.ProductMultiSelectorDialogComponent = ProductMultiSelectorDialogComponent;
15110
+ exports.ProductMultiSelectorFormInputComponent = ProductMultiSelectorFormInputComponent;
15111
+ exports.ProductSearchInputComponent = ProductSearchInputComponent;
14623
15112
  exports.ProductSelectorComponent = ProductSelectorComponent;
14624
15113
  exports.ProductSelectorFormInputComponent = ProductSelectorFormInputComponent;
14625
15114
  exports.PromotionDataService = PromotionDataService;
@@ -14665,6 +15154,7 @@
14665
15154
  exports.STRING_CUSTOM_FIELD_FRAGMENT = STRING_CUSTOM_FIELD_FRAGMENT;
14666
15155
  exports.SelectFormInputComponent = SelectFormInputComponent;
14667
15156
  exports.SelectToggleComponent = SelectToggleComponent;
15157
+ exports.SelectionManager = SelectionManager;
14668
15158
  exports.SentenceCasePipe = SentenceCasePipe;
14669
15159
  exports.ServerConfigService = ServerConfigService;
14670
15160
  exports.SettingsDataService = SettingsDataService;