@vendure/admin-ui 1.4.7 → 1.5.2

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 (108) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +134 -143
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +329 -269
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-customer.umd.js +51 -20
  6. package/bundles/vendure-admin-ui-customer.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-order.umd.js +109 -19
  8. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  9. package/bundles/vendure-admin-ui-settings.umd.js.map +1 -1
  10. package/bundles/vendure-admin-ui-system.umd.js.map +1 -1
  11. package/catalog/components/{product-assets/product-assets.component.d.ts → assets/assets.component.d.ts} +4 -10
  12. package/catalog/components/product-detail/product-detail.component.d.ts +2 -1
  13. package/catalog/components/product-variants-list/product-variants-list.component.d.ts +2 -1
  14. package/catalog/public_api.d.ts +1 -1
  15. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  16. package/core/common/generated-types.d.ts +109 -6
  17. package/core/common/version.d.ts +1 -1
  18. package/core/data/definitions/customer-definitions.d.ts +1 -0
  19. package/core/data/providers/customer-data.service.d.ts +1 -0
  20. package/core/data/providers/promotion-data.service.d.ts +2 -2
  21. package/core/public_api.d.ts +2 -0
  22. package/core/shared/components/asset-preview-links/asset-preview-links.component.d.ts +5 -0
  23. package/core/shared/components/object-tree/object-tree.component.d.ts +3 -3
  24. package/core/shared/dynamic-form-inputs/relation-form-input/generic/relation-generic-input.component.d.ts +15 -0
  25. package/core/vendure-admin-ui-core.metadata.json +1 -1
  26. package/customer/components/address-card/address-card.component.d.ts +2 -0
  27. package/customer/components/customer-detail/customer-detail.component.d.ts +2 -0
  28. package/customer/components/customer-list/customer-list.component.d.ts +1 -2
  29. package/customer/vendure-admin-ui-customer.metadata.json +1 -1
  30. package/esm2015/catalog/catalog.module.js +3 -3
  31. package/esm2015/catalog/components/assets/assets.component.js +93 -0
  32. package/esm2015/catalog/components/collection-detail/collection-detail.component.js +2 -2
  33. package/esm2015/catalog/components/facet-detail/facet-detail.component.js +3 -3
  34. package/esm2015/catalog/components/product-detail/product-detail.component.js +4 -3
  35. package/esm2015/catalog/components/product-variants-list/product-variants-list.component.js +9 -2
  36. package/esm2015/catalog/public_api.js +2 -2
  37. package/esm2015/core/common/generated-types.js +30 -1
  38. package/esm2015/core/common/introspection-result.js +189 -249
  39. package/esm2015/core/common/utilities/configurable-operation-utils.js +21 -3
  40. package/esm2015/core/common/version.js +2 -2
  41. package/esm2015/core/data/definitions/customer-definitions.js +8 -1
  42. package/esm2015/core/data/definitions/order-definitions.js +2 -1
  43. package/esm2015/core/data/providers/customer-data.service.js +5 -2
  44. package/esm2015/core/data/providers/interceptor.js +1 -1
  45. package/esm2015/core/data/providers/promotion-data.service.js +3 -2
  46. package/esm2015/core/data/providers/shipping-method-data.service.js +1 -1
  47. package/esm2015/core/data/utils/remove-readonly-custom-fields.js +1 -1
  48. package/esm2015/core/public_api.js +3 -1
  49. package/esm2015/core/shared/components/address-form/address-form.component.js +1 -1
  50. package/esm2015/core/shared/components/asset-gallery/asset-gallery.component.js +2 -2
  51. package/esm2015/core/shared/components/asset-preview/asset-preview.component.js +4 -4
  52. package/esm2015/core/shared/components/asset-preview-links/asset-preview-links.component.js +18 -0
  53. package/esm2015/core/shared/components/object-tree/object-tree.component.js +3 -3
  54. package/esm2015/core/shared/dynamic-form-inputs/relation-form-input/generic/relation-generic-input.component.js +48 -0
  55. package/esm2015/core/shared/dynamic-form-inputs/relation-form-input/relation-form-input.component.js +2 -2
  56. package/esm2015/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.js +1 -1
  57. package/esm2015/core/shared/shared.module.js +5 -1
  58. package/esm2015/customer/components/address-card/address-card.component.js +9 -3
  59. package/esm2015/customer/components/customer-detail/customer-detail.component.js +35 -13
  60. package/esm2015/customer/components/customer-list/customer-list.component.js +12 -9
  61. package/esm2015/order/components/add-manual-payment-dialog/add-manual-payment-dialog.component.js +1 -1
  62. package/esm2015/order/components/cancel-order-dialog/cancel-order-dialog.component.js +36 -6
  63. package/esm2015/order/components/fulfill-order-dialog/fulfill-order-dialog.component.js +1 -1
  64. package/esm2015/order/components/line-refunds/line-refunds.component.js +1 -1
  65. package/esm2015/order/components/modification-detail/modification-detail.component.js +1 -1
  66. package/esm2015/order/components/order-detail/order-detail.component.js +2 -2
  67. package/esm2015/order/components/order-editor/order-editor.component.js +23 -8
  68. package/esm2015/order/components/order-edits-preview-dialog/order-edits-preview-dialog.component.js +1 -1
  69. package/esm2015/order/components/order-history/order-history.component.js +2 -2
  70. package/esm2015/order/components/order-list/order-list.component.js +1 -1
  71. package/esm2015/order/components/order-table/order-table.component.js +3 -3
  72. package/esm2015/order/components/refund-order-dialog/refund-order-dialog.component.js +10 -5
  73. package/esm2015/order/order.routes.js +1 -1
  74. package/esm2015/settings/components/role-list/role-list.component.js +1 -1
  75. package/esm2015/settings/components/test-order-builder/test-order-builder.component.js +1 -1
  76. package/esm2015/settings/providers/routing/shipping-method-resolver.js +1 -1
  77. package/esm2015/system/components/job-list/job-list.component.js +1 -1
  78. package/fesm2015/vendure-admin-ui-catalog.js +105 -111
  79. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  80. package/fesm2015/vendure-admin-ui-core.js +310 -249
  81. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  82. package/fesm2015/vendure-admin-ui-customer.js +53 -22
  83. package/fesm2015/vendure-admin-ui-customer.js.map +1 -1
  84. package/fesm2015/vendure-admin-ui-order.js +69 -19
  85. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  86. package/fesm2015/vendure-admin-ui-settings.js.map +1 -1
  87. package/fesm2015/vendure-admin-ui-system.js.map +1 -1
  88. package/order/components/cancel-order-dialog/cancel-order-dialog.component.d.ts +3 -0
  89. package/order/components/order-editor/order-editor.component.d.ts +8 -2
  90. package/order/vendure-admin-ui-order.metadata.json +1 -1
  91. package/package.json +5 -5
  92. package/static/i18n-messages/cs.json +7 -1
  93. package/static/i18n-messages/de.json +7 -1
  94. package/static/i18n-messages/en.json +9 -3
  95. package/static/i18n-messages/es.json +7 -1
  96. package/static/i18n-messages/fr.json +7 -1
  97. package/static/i18n-messages/it.json +7 -1
  98. package/static/i18n-messages/pl.json +7 -1
  99. package/static/i18n-messages/pt_BR.json +7 -1
  100. package/static/i18n-messages/pt_PT.json +7 -1
  101. package/static/i18n-messages/ru.json +7 -1
  102. package/static/i18n-messages/uk.json +7 -1
  103. package/static/i18n-messages/zh_Hans.json +7 -1
  104. package/static/i18n-messages/zh_Hant.json +7 -1
  105. package/static/styles/global/_overrides.scss +6 -0
  106. package/static/theme.min.css +1 -1
  107. package/static/vendure-ui-config.json +25 -10
  108. package/esm2015/catalog/components/product-assets/product-assets.component.js +0 -108
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, ChangeDetectionStrategy, ChangeDetectorRef, EventEmitter, Input, Output, Injectable, NgModule } from '@angular/core';
3
3
  import * as i2 from '@vendure/admin-ui/core';
4
- import { DataService, ModalService, BaseDetailComponent, SortOrder, EditNoteDialogComponent, ServerConfigService, NotificationService, DeletionResult, HistoryEntryType, BaseListComponent, BaseEntityResolver, createResolveData, CanDeactivateDetailGuard, detailBreadcrumb, SharedModule } from '@vendure/admin-ui/core';
5
- import { BehaviorSubject, Subject, forkJoin, from, EMPTY, combineLatest, of, merge as merge$1 } from 'rxjs';
4
+ import { DataService, ModalService, BaseDetailComponent, SortOrder, EditNoteDialogComponent, ServerConfigService, NotificationService, DeletionResult, HistoryEntryType, BaseListComponent, LogicalOperator, BaseEntityResolver, createResolveData, CanDeactivateDetailGuard, detailBreadcrumb, SharedModule } from '@vendure/admin-ui/core';
5
+ import { BehaviorSubject, Subject, forkJoin, from, EMPTY, combineLatest, of } from 'rxjs';
6
6
  import { switchMap, map, filter, take, shareReplay, merge, startWith, mergeMap, concatMap, distinctUntilChanged, tap, mapTo, debounceTime, takeUntil } from 'rxjs/operators';
7
7
  import { __rest } from 'tslib';
8
8
  import { Validators, FormArray, FormControl, FormBuilder } from '@angular/forms';
@@ -85,6 +85,7 @@ class AddressCardComponent {
85
85
  this.editable = true;
86
86
  this.setAsDefaultShipping = new EventEmitter();
87
87
  this.setAsDefaultBilling = new EventEmitter();
88
+ this.deleteAddress = new EventEmitter();
88
89
  this.dataDependenciesPopulated = new BehaviorSubject(false);
89
90
  }
90
91
  ngOnInit() {
@@ -119,6 +120,10 @@ class AddressCardComponent {
119
120
  this.setAsDefaultShipping.emit(this.addressForm.value.id);
120
121
  this.addressForm.markAsDirty();
121
122
  }
123
+ delete() {
124
+ this.deleteAddress.emit(this.addressForm.value.id);
125
+ this.addressForm.markAsDirty();
126
+ }
122
127
  editAddress() {
123
128
  this.modalService
124
129
  .fromComponent(AddressDetailDialogComponent, {
@@ -138,7 +143,7 @@ class AddressCardComponent {
138
143
  AddressCardComponent.decorators = [
139
144
  { type: Component, args: [{
140
145
  selector: 'vdr-address-card',
141
- template: "<div class=\"card\" *ngIf=\"addressForm.value as address\">\r\n <div class=\"card-header\">\r\n <div class=\"address-title\">\r\n <span class=\"street-line\" *ngIf=\"address.streetLine1\">{{ address.streetLine1 }},</span>\r\n {{ address.countryCode }}\r\n </div>\r\n <div class=\"default-controls\">\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultShipping\">\r\n <clr-icon shape=\"truck\"></clr-icon>\r\n {{ 'customer.default-shipping-address' | translate }}\r\n </vdr-chip>\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultBilling\">\r\n <clr-icon shape=\"credit-card\"></clr-icon>\r\n {{ 'customer.default-billing-address' | translate }}\r\n </vdr-chip>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text\">\r\n <vdr-formatted-address [address]=\"address\"></vdr-formatted-address>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <vdr-entity-info [entity]=\"address\"></vdr-entity-info>\r\n <ng-container *ngIf=\"editable\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"editAddress()\">\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-sm btn-link\" vdrDropdownTrigger>\r\n {{ 'common.more' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultShipping\"\r\n (click)=\"setAsDefaultShippingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-shipping-address' | translate }}\r\n </button>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultBilling\"\r\n (click)=\"setAsDefaultBillingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-billing-address' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </div>\r\n</div>\r\n",
146
+ template: "<div class=\"card\" *ngIf=\"addressForm.value as address\">\r\n <div class=\"card-header\">\r\n <div class=\"address-title\">\r\n <span class=\"street-line\" *ngIf=\"address.streetLine1\">{{ address.streetLine1 }},</span>\r\n {{ address.countryCode }}\r\n </div>\r\n <div class=\"default-controls\">\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultShipping\">\r\n <clr-icon shape=\"truck\"></clr-icon>\r\n {{ 'customer.default-shipping-address' | translate }}\r\n </vdr-chip>\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultBilling\">\r\n <clr-icon shape=\"credit-card\"></clr-icon>\r\n {{ 'customer.default-billing-address' | translate }}\r\n </vdr-chip>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text\">\r\n <vdr-formatted-address [address]=\"address\"></vdr-formatted-address>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <vdr-entity-info [entity]=\"address\"></vdr-entity-info>\r\n <ng-container *ngIf=\"editable\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"editAddress()\">\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-sm btn-link\" vdrDropdownTrigger>\r\n {{ 'common.more' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultShipping\"\r\n (click)=\"setAsDefaultShippingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-shipping-address' | translate }}\r\n </button>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultBilling\"\r\n (click)=\"setAsDefaultBillingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-billing-address' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"delete()\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </div>\r\n</div>\r\n",
142
147
  changeDetection: ChangeDetectionStrategy.OnPush,
143
148
  styles: [":host{display:block;max-width:360px}clr-input-container{margin-bottom:12px}.defaul-controls{display:flex}.is-default{margin:0;color:var(--color-success-500)}\n"]
144
149
  },] }
@@ -155,7 +160,8 @@ AddressCardComponent.propDecorators = {
155
160
  isDefaultShipping: [{ type: Input }],
156
161
  editable: [{ type: Input }],
157
162
  setAsDefaultShipping: [{ type: Output }],
158
- setAsDefaultBilling: [{ type: Output }]
163
+ setAsDefaultBilling: [{ type: Output }],
164
+ deleteAddress: [{ type: Output }]
159
165
  };
160
166
 
161
167
  class SelectCustomerGroupDialogComponent {
@@ -196,6 +202,7 @@ class CustomerDetailComponent extends BaseDetailComponent {
196
202
  this.modalService = modalService;
197
203
  this.notificationService = notificationService;
198
204
  this.fetchHistory = new Subject();
205
+ this.addressesToDeleteIds = new Set();
199
206
  this.addressDefaultsUpdated = false;
200
207
  this.ordersPerPage = 10;
201
208
  this.currentOrdersPage = 1;
@@ -250,6 +257,14 @@ class CustomerDetailComponent extends BaseDetailComponent {
250
257
  this.defaultShippingAddressId = id;
251
258
  this.addressDefaultsUpdated = true;
252
259
  }
260
+ toggleDeleteAddress(id) {
261
+ if (this.addressesToDeleteIds.has(id)) {
262
+ this.addressesToDeleteIds.delete(id);
263
+ }
264
+ else {
265
+ this.addressesToDeleteIds.add(id);
266
+ }
267
+ }
253
268
  addAddress() {
254
269
  const addressFormArray = this.detailForm.get('addresses');
255
270
  const newAddress = this.formBuilder.group({
@@ -371,9 +386,16 @@ class CustomerDetailComponent extends BaseDetailComponent {
371
386
  .pipe(map(res => res.createCustomerAddress)));
372
387
  }
373
388
  else {
374
- saveOperations.push(this.dataService.customer
375
- .updateCustomerAddress(Object.assign(Object.assign({}, input), { id: address.id }))
376
- .pipe(map(res => res.updateCustomerAddress)));
389
+ if (this.addressesToDeleteIds.has(address.id)) {
390
+ saveOperations.push(this.dataService.customer
391
+ .deleteCustomerAddress(address.id)
392
+ .pipe(map(res => res.deleteCustomerAddress)));
393
+ }
394
+ else {
395
+ saveOperations.push(this.dataService.customer
396
+ .updateCustomerAddress(Object.assign(Object.assign({}, input), { id: address.id }))
397
+ .pipe(map(res => res.updateCustomerAddress)));
398
+ }
377
399
  }
378
400
  }
379
401
  }
@@ -381,17 +403,23 @@ class CustomerDetailComponent extends BaseDetailComponent {
381
403
  return forkJoin(saveOperations);
382
404
  }))
383
405
  .subscribe(data => {
406
+ let notified = false;
384
407
  for (const result of data) {
385
408
  switch (result.__typename) {
386
409
  case 'Customer':
387
410
  case 'Address':
388
- this.notificationService.success(marker('common.notify-update-success'), {
389
- entity: 'Customer',
390
- });
391
- this.detailForm.markAsPristine();
392
- this.addressDefaultsUpdated = false;
393
- this.changeDetector.markForCheck();
394
- this.fetchHistory.next();
411
+ case 'Success':
412
+ if (!notified) {
413
+ this.notificationService.success(marker('common.notify-update-success'), {
414
+ entity: 'Customer',
415
+ });
416
+ notified = true;
417
+ this.detailForm.markAsPristine();
418
+ this.addressDefaultsUpdated = false;
419
+ this.changeDetector.markForCheck();
420
+ this.fetchHistory.next();
421
+ this.dataService.customer.getCustomer(this.id).single$.subscribe();
422
+ }
395
423
  break;
396
424
  case 'EmailAddressConflictError':
397
425
  this.notificationService.error(result.message);
@@ -554,9 +582,9 @@ class CustomerDetailComponent extends BaseDetailComponent {
554
582
  CustomerDetailComponent.decorators = [
555
583
  { type: Component, args: [{
556
584
  selector: 'vdr-customer-detail',
557
- template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-align-items-center\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-customer-status-label [customer]=\"entity$ | async\"></vdr-customer-status-label>\r\n <div\r\n class=\"last-login\"\r\n *ngIf=\"(entity$ | async)?.user?.lastLogin as lastLogin\"\r\n [title]=\"lastLogin | localeDate: 'medium'\"\r\n >\r\n {{ 'customer.last-login' | translate }}: {{ lastLogin | timeAgo }}\r\n </div>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"'UpdateCustomer'\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm.get('customer')\">\r\n <vdr-form-field [label]=\"'customer.title' | translate\" for=\"title\" [readOnlyToggle]=\"!(isNew$ | async)\">\r\n <input id=\"title\" type=\"text\" formControlName=\"title\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.first-name' | translate\"\r\n for=\"firstName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"firstName\" type=\"text\" formControlName=\"firstName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.last-name' | translate\"\r\n for=\"lastName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"lastName\" type=\"text\" formControlName=\"lastName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.email-address' | translate\"\r\n for=\"emailAddress\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"emailAddress\" type=\"text\" formControlName=\"emailAddress\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.phone-number' | translate\"\r\n for=\"phoneNumber\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"phoneNumber\" type=\"text\" formControlName=\"phoneNumber\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'customer.password' | translate\" for=\"password\" *ngIf=\"isNew$ | async\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\" />\r\n </vdr-form-field>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Customer\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['customer', 'customFields'])\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"customer-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n\r\n<div class=\"groups\" *ngIf=\"(entity$ | async)?.groups as groups\">\r\n <label class=\"clr-control-label\">{{ 'customer.customer-groups' | translate }}</label>\r\n <ng-container *ngIf=\"groups.length; else noGroups\">\r\n <vdr-chip\r\n *ngFor=\"let group of groups\"\r\n [colorFrom]=\"group.id\"\r\n icon=\"times\"\r\n (iconClick)=\"removeFromGroup(group)\"\r\n >{{ group.name }}</vdr-chip\r\n >\r\n </ng-container>\r\n <ng-template #noGroups>\r\n {{ 'customer.not-a-member-of-any-groups' | translate }}\r\n </ng-template>\r\n <div>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"addToGroup()\"\r\n *vdrIfPermissions=\"'UpdateCustomerGroup'\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.add-customer-to-group' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-4\">\r\n <h3>{{ 'customer.addresses' | translate }}</h3>\r\n <vdr-address-card\r\n *ngFor=\"let addressForm of getAddressFormControls()\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [isDefaultBilling]=\"defaultBillingAddressId === addressForm.value.id\"\r\n [isDefaultShipping]=\"defaultShippingAddressId === addressForm.value.id\"\r\n [addressForm]=\"addressForm\"\r\n [customFields]=\"addressCustomFields\"\r\n [editable]=\"['UpdateCustomer'] | hasPermission\"\r\n (setAsDefaultBilling)=\"setDefaultBillingAddressId($event)\"\r\n (setAsDefaultShipping)=\"setDefaultShippingAddressId($event)\"\r\n ></vdr-address-card>\r\n <button class=\"btn btn-secondary\" (click)=\"addAddress()\" *vdrIfPermissions=\"'UpdateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-address' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"clr-col-md-8\">\r\n <h3>{{ 'customer.orders' | translate }}</h3>\r\n <vdr-data-table\r\n [items]=\"orders$ | async\"\r\n [itemsPerPage]=\"ordersPerPage\"\r\n [totalItems]=\"ordersCount$ | async\"\r\n [currentPage]=\"currentOrdersPage\"\r\n [emptyStateLabel]=\"'customer.no-orders-placed' | translate\"\r\n (itemsPerPageChange)=\"setOrderItemsPerPage($event)\"\r\n (pageChange)=\"setOrderCurrentPage($event)\"\r\n >\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left\">{{ order.code }}</td>\r\n <td class=\"left\">{{ order.state }}</td>\r\n <td class=\"left\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left\">{{ order.updatedAt | localeDate: 'medium' }}</td>\r\n <td class=\"right\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"['/orders/', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n </vdr-data-table>\r\n </div>\r\n</div>\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-6\">\r\n <vdr-customer-history\r\n [customer]=\"entity$ | async\"\r\n [history]=\"history$ | async\"\r\n (addNote)=\"addNoteToCustomer($event)\"\r\n (updateNote)=\"updateNote($event)\"\r\n (deleteNote)=\"deleteNote($event)\"\r\n ></vdr-customer-history>\r\n </div>\r\n</div>\r\n",
585
+ template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-align-items-center\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-customer-status-label [customer]=\"entity$ | async\"></vdr-customer-status-label>\r\n <div\r\n class=\"last-login\"\r\n *ngIf=\"(entity$ | async)?.user?.lastLogin as lastLogin\"\r\n [title]=\"lastLogin | localeDate: 'medium'\"\r\n >\r\n {{ 'customer.last-login' | translate }}: {{ lastLogin | timeAgo }}\r\n </div>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"'UpdateCustomer'\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm.get('customer')\">\r\n <vdr-form-field [label]=\"'customer.title' | translate\" for=\"title\" [readOnlyToggle]=\"!(isNew$ | async)\">\r\n <input id=\"title\" type=\"text\" formControlName=\"title\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.first-name' | translate\"\r\n for=\"firstName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"firstName\" type=\"text\" formControlName=\"firstName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.last-name' | translate\"\r\n for=\"lastName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"lastName\" type=\"text\" formControlName=\"lastName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.email-address' | translate\"\r\n for=\"emailAddress\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"emailAddress\" type=\"text\" formControlName=\"emailAddress\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.phone-number' | translate\"\r\n for=\"phoneNumber\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"phoneNumber\" type=\"text\" formControlName=\"phoneNumber\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'customer.password' | translate\" for=\"password\" *ngIf=\"isNew$ | async\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\" />\r\n </vdr-form-field>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Customer\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['customer', 'customFields'])\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"customer-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n\r\n<div class=\"groups\" *ngIf=\"(entity$ | async)?.groups as groups\">\r\n <label class=\"clr-control-label\">{{ 'customer.customer-groups' | translate }}</label>\r\n <ng-container *ngIf=\"groups.length; else noGroups\">\r\n <vdr-chip\r\n *ngFor=\"let group of groups\"\r\n [colorFrom]=\"group.id\"\r\n icon=\"times\"\r\n (iconClick)=\"removeFromGroup(group)\"\r\n >{{ group.name }}</vdr-chip\r\n >\r\n </ng-container>\r\n <ng-template #noGroups>\r\n {{ 'customer.not-a-member-of-any-groups' | translate }}\r\n </ng-template>\r\n <div>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"addToGroup()\"\r\n *vdrIfPermissions=\"'UpdateCustomerGroup'\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.add-customer-to-group' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-4\">\r\n <h3>{{ 'customer.addresses' | translate }}</h3>\r\n <vdr-address-card\r\n *ngFor=\"let addressForm of getAddressFormControls()\"\r\n [class.to-delete]=\"addressesToDeleteIds.has(addressForm.value.id)\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [isDefaultBilling]=\"defaultBillingAddressId === addressForm.value.id\"\r\n [isDefaultShipping]=\"defaultShippingAddressId === addressForm.value.id\"\r\n [addressForm]=\"addressForm\"\r\n [customFields]=\"addressCustomFields\"\r\n [editable]=\"(['UpdateCustomer'] | hasPermission) && !addressesToDeleteIds.has(addressForm.value.id)\"\r\n (setAsDefaultBilling)=\"setDefaultBillingAddressId($event)\"\r\n (setAsDefaultShipping)=\"setDefaultShippingAddressId($event)\"\r\n (deleteAddress)=\"toggleDeleteAddress($event)\"\r\n ></vdr-address-card>\r\n <button class=\"btn btn-secondary\" (click)=\"addAddress()\" *vdrIfPermissions=\"'UpdateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-address' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"clr-col-md-8\">\r\n <h3>{{ 'customer.orders' | translate }}</h3>\r\n <vdr-data-table\r\n [items]=\"orders$ | async\"\r\n [itemsPerPage]=\"ordersPerPage\"\r\n [totalItems]=\"ordersCount$ | async\"\r\n [currentPage]=\"currentOrdersPage\"\r\n [emptyStateLabel]=\"'customer.no-orders-placed' | translate\"\r\n (itemsPerPageChange)=\"setOrderItemsPerPage($event)\"\r\n (pageChange)=\"setOrderCurrentPage($event)\"\r\n >\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left\">{{ order.code }}</td>\r\n <td class=\"left\">{{ order.state }}</td>\r\n <td class=\"left\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left\">{{ order.updatedAt | localeDate: 'medium' }}</td>\r\n <td class=\"right\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"['/orders/', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n </vdr-data-table>\r\n </div>\r\n</div>\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-6\">\r\n <vdr-customer-history\r\n [customer]=\"entity$ | async\"\r\n [history]=\"history$ | async\"\r\n (addNote)=\"addNoteToCustomer($event)\"\r\n (updateNote)=\"updateNote($event)\"\r\n (deleteNote)=\"deleteNote($event)\"\r\n ></vdr-customer-history>\r\n </div>\r\n</div>\r\n",
558
586
  changeDetection: ChangeDetectionStrategy.OnPush,
559
- styles: [".last-login{margin-left:6px;color:var(--color-grey-500)}\n"]
587
+ styles: [".last-login{margin-left:6px;color:var(--color-grey-500)}.to-delete{opacity:.5}\n"]
560
588
  },] }
561
589
  ];
562
590
  CustomerDetailComponent.ctorParameters = () => [
@@ -965,20 +993,23 @@ class CustomerListComponent extends BaseListComponent {
965
993
  this.dataService = dataService;
966
994
  this.modalService = modalService;
967
995
  this.notificationService = notificationService;
968
- this.emailSearchTerm = new FormControl('');
969
- this.lastNameSearchTerm = new FormControl('');
996
+ this.searchTerm = new FormControl('');
970
997
  super.setQueryFn((...args) => this.dataService.customer.getCustomerList(...args).refetchOnChannelChange(), data => data.customers, (skip, take) => ({
971
998
  options: {
972
999
  skip,
973
1000
  take,
974
1001
  filter: {
975
1002
  emailAddress: {
976
- contains: this.emailSearchTerm.value,
1003
+ contains: this.searchTerm.value,
977
1004
  },
978
1005
  lastName: {
979
- contains: this.lastNameSearchTerm.value,
1006
+ contains: this.searchTerm.value,
1007
+ },
1008
+ postalCode: {
1009
+ contains: this.searchTerm.value,
980
1010
  },
981
1011
  },
1012
+ filterOperator: LogicalOperator.OR,
982
1013
  sort: {
983
1014
  createdAt: SortOrder$1.DESC,
984
1015
  },
@@ -987,7 +1018,7 @@ class CustomerListComponent extends BaseListComponent {
987
1018
  }
988
1019
  ngOnInit() {
989
1020
  super.ngOnInit();
990
- merge$1(this.emailSearchTerm.valueChanges, this.lastNameSearchTerm.valueChanges)
1021
+ this.searchTerm.valueChanges
991
1022
  .pipe(filter(value => 2 < value.length || value.length === 0), debounceTime(250), takeUntil(this.destroy$))
992
1023
  .subscribe(() => this.refresh());
993
1024
  }
@@ -1017,7 +1048,7 @@ class CustomerListComponent extends BaseListComponent {
1017
1048
  CustomerListComponent.decorators = [
1018
1049
  { type: Component, args: [{
1019
1050
  selector: 'vdr-customer-list',
1020
- template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <input\r\n type=\"text\"\r\n name=\"emailSearchTerm\"\r\n [formControl]=\"emailSearchTerm\"\r\n [placeholder]=\"'customer.search-customers-by-email' | translate\"\r\n class=\"search-input ml3\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"lastNameSearchTerm\"\r\n [formControl]=\"lastNameSearchTerm\"\r\n [placeholder]=\"'customer.search-customers-by-last-name' | translate\"\r\n class=\"search-input ml3\"\r\n />\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-customer' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.email-address' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'customer.customer-type' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-customer=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ customer.title }} {{ customer.firstName }} {{ customer.lastName }}\r\n </td>\r\n <td class=\"left align-middle\">{{ customer.emailAddress }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-status-label [customer]=\"customer\"></vdr-customer-status-label>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', customer.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteCustomer(customer)\"\r\n [disabled]=\"!('DeleteCustomer' | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
1051
+ template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <input\r\n type=\"text\"\r\n name=\"emailSearchTerm\"\r\n [formControl]=\"searchTerm\"\r\n [placeholder]=\"'customer.search-customers-by-email-last-name-postal-code' | translate\"\r\n class=\"search-input ml3\"\r\n />\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-customer' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.email-address' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'customer.customer-type' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-customer=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ customer.title }} {{ customer.firstName }} {{ customer.lastName }}\r\n </td>\r\n <td class=\"left align-middle\">{{ customer.emailAddress }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-status-label [customer]=\"customer\"></vdr-customer-status-label>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', customer.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteCustomer(customer)\"\r\n [disabled]=\"!('DeleteCustomer' | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
1021
1052
  styles: [".search-input{margin-top:6px;min-width:300px}\n"]
1022
1053
  },] }
1023
1054
  ];