@vendure/admin-ui 1.6.4 → 1.7.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 (86) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +196 -20
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +292 -323
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-customer.umd.js +39 -18
  6. package/bundles/vendure-admin-ui-customer.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-order.umd.js +141 -119
  8. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  9. package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
  10. package/catalog/components/option-value-input/option-value-input.component.d.ts +20 -8
  11. package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +10 -3
  12. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  13. package/core/common/generated-types.d.ts +89 -19
  14. package/core/common/utilities/configurable-operation-utils.d.ts +4 -2
  15. package/core/common/version.d.ts +1 -1
  16. package/core/data/definitions/order-definitions.d.ts +2 -0
  17. package/core/data/definitions/product-definitions.d.ts +1 -0
  18. package/core/data/providers/order-data.service.d.ts +1 -0
  19. package/core/data/providers/product-data.service.d.ts +1 -0
  20. package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
  21. package/core/shared/components/data-table/data-table.component.d.ts +5 -2
  22. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +2 -1
  23. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
  24. package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
  25. package/core/vendure-admin-ui-core.metadata.json +1 -1
  26. package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
  27. package/customer/vendure-admin-ui-customer.metadata.json +1 -1
  28. package/esm2015/catalog/components/generate-product-variants/generate-product-variants.component.js +12 -5
  29. package/esm2015/catalog/components/option-value-input/option-value-input.component.js +62 -12
  30. package/esm2015/catalog/components/product-variants-editor/product-variants-editor.component.js +109 -11
  31. package/esm2015/core/common/generated-types.js +2 -1
  32. package/esm2015/core/common/introspection-result.js +191 -255
  33. package/esm2015/core/common/utilities/configurable-operation-utils.js +11 -8
  34. package/esm2015/core/common/version.js +2 -2
  35. package/esm2015/core/components/app-shell/app-shell.component.js +1 -1
  36. package/esm2015/core/components/main-nav/main-nav.component.js +1 -1
  37. package/esm2015/core/data/definitions/order-definitions.js +39 -25
  38. package/esm2015/core/data/definitions/product-definitions.js +743 -735
  39. package/esm2015/core/data/providers/order-data.service.js +7 -2
  40. package/esm2015/core/data/providers/product-data.service.js +5 -2
  41. package/esm2015/core/shared/components/custom-field-control/custom-field-control.component.js +9 -3
  42. package/esm2015/core/shared/components/data-table/data-table.component.js +9 -2
  43. package/esm2015/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.js +15 -2
  44. package/esm2015/core/shared/pipes/custom-field-label.pipe.js +4 -19
  45. package/esm2015/customer/components/customer-group-list/customer-group-list.component.js +25 -12
  46. package/esm2015/order/components/fulfill-order-dialog/fulfill-order-dialog.component.js +3 -2
  47. package/esm2015/order/components/fulfillment-detail/fulfillment-detail.component.js +9 -18
  48. package/esm2015/order/components/line-fulfillment/line-fulfillment.component.js +10 -21
  49. package/esm2015/order/components/order-custom-fields-card/order-custom-fields-card.component.js +30 -4
  50. package/esm2015/order/components/order-detail/order-detail.component.js +49 -20
  51. package/esm2015/order/components/order-list/order-list.component.js +22 -15
  52. package/esm2015/order/components/order-payment-card/order-payment-card.component.js +2 -2
  53. package/esm2015/order/components/order-table/order-table.component.js +1 -1
  54. package/fesm2015/vendure-admin-ui-catalog.js +177 -22
  55. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  56. package/fesm2015/vendure-admin-ui-core.js +975 -995
  57. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  58. package/fesm2015/vendure-admin-ui-customer.js +23 -11
  59. package/fesm2015/vendure-admin-ui-customer.js.map +1 -1
  60. package/fesm2015/vendure-admin-ui-order.js +116 -75
  61. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  62. package/order/components/line-fulfillment/line-fulfillment.component.d.ts +2 -2
  63. package/order/components/modification-detail/modification-detail.component.d.ts +1 -1
  64. package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
  65. package/order/components/order-list/order-list.component.d.ts +1 -0
  66. package/order/vendure-admin-ui-order.metadata.json +1 -1
  67. package/package.json +2 -2
  68. package/static/i18n-messages/cs.json +6 -2
  69. package/static/i18n-messages/de.json +6 -2
  70. package/static/i18n-messages/en.json +8 -3
  71. package/static/i18n-messages/es.json +6 -2
  72. package/static/i18n-messages/fr.json +6 -2
  73. package/static/i18n-messages/it.json +6 -2
  74. package/static/i18n-messages/pl.json +6 -2
  75. package/static/i18n-messages/pt_BR.json +6 -2
  76. package/static/i18n-messages/pt_PT.json +6 -2
  77. package/static/i18n-messages/ru.json +6 -2
  78. package/static/i18n-messages/uk.json +6 -2
  79. package/static/i18n-messages/zh_Hans.json +6 -2
  80. package/static/i18n-messages/zh_Hant.json +6 -2
  81. package/static/styles/_variables.scss +3 -0
  82. package/static/styles/global/_sass-overrides.scss +3 -0
  83. package/static/styles/global/_utilities.scss +1 -0
  84. package/static/styles/styles.scss +1 -0
  85. package/static/styles/ui-extension-theme.scss +1 -0
  86. package/static/theme.min.css +1 -1
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Component, ChangeDetectionStrategy, ChangeDetectorRef, EventEmitter, Input, Output, Injectable, ElementRef, ViewChildren, HostBinding, NgModule } from '@angular/core';
3
3
  import { FormGroup, FormControl, Validators, FormBuilder, FormArray } from '@angular/forms';
4
4
  import * as i1 from '@vendure/admin-ui/core';
5
- import { DataService, getAppConfig, I18nService, configurableDefinitionToInstance, GlobalFlag, configurableOperationValueIsValid, toConfigurableOperationInput, ServerConfigService, HistoryEntryType, SortOrder, ModalService, NotificationService, BaseDetailComponent, EditNoteDialogComponent, BaseListComponent, LocalStorageService, AdjustmentType, BaseEntityResolver, createResolveData, CanDeactivateDetailGuard, detailBreadcrumb, SharedModule } from '@vendure/admin-ui/core';
5
+ import { DataService, getAppConfig, I18nService, configurableDefinitionToInstance, GlobalFlag, configurableOperationValueIsValid, toConfigurableOperationInput, ServerConfigService, ModalService, HistoryEntryType, SortOrder, NotificationService, BaseDetailComponent, EditNoteDialogComponent, BaseListComponent, LogicalOperator, LocalStorageService, AdjustmentType, BaseEntityResolver, createResolveData, CanDeactivateDetailGuard, detailBreadcrumb, SharedModule } from '@vendure/admin-ui/core';
6
6
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
7
7
  import { isObject, summate, assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
8
8
  import * as i1$1 from '@angular/router';
@@ -158,7 +158,8 @@ class FulfillOrderDialogComponent {
158
158
  return effectiveTracInventory ? Math.min(unfulfilledCount, stockOnHand) : unfulfilledCount;
159
159
  }
160
160
  getUnfulfilledCount(line) {
161
- const fulfilled = line.items.reduce((sum, item) => sum + (item.fulfillment ? 1 : 0), 0);
161
+ var _a, _b;
162
+ const fulfilled = (_b = (_a = line.fulfillments) === null || _a === void 0 ? void 0 : _a.map(f => f.summary).flat().filter(row => row.orderLine.id === line.id).reduce((sum, row) => sum + row.quantity, 0)) !== null && _b !== void 0 ? _b : 0;
162
163
  return line.quantity - fulfilled;
163
164
  }
164
165
  canSubmit() {
@@ -251,23 +252,14 @@ class FulfillmentDetailComponent {
251
252
  return this.order.fulfillments && this.order.fulfillments.find(f => f.id === this.fulfillmentId);
252
253
  }
253
254
  get items() {
254
- var _a;
255
- const itemMap = new Map();
256
- const fulfillmentItemIds = (_a = this.fulfillment) === null || _a === void 0 ? void 0 : _a.orderItems.map(i => i.id);
257
- for (const line of this.order.lines) {
258
- for (const item of line.items) {
259
- if (fulfillmentItemIds === null || fulfillmentItemIds === void 0 ? void 0 : fulfillmentItemIds.includes(item.id)) {
260
- const count = itemMap.get(line.productVariant.name);
261
- if (count != null) {
262
- itemMap.set(line.productVariant.name, count + 1);
263
- }
264
- else {
265
- itemMap.set(line.productVariant.name, 1);
266
- }
267
- }
268
- }
269
- }
270
- return Array.from(itemMap.entries()).map(([name, quantity]) => ({ name, quantity }));
255
+ var _a, _b;
256
+ return ((_b = (_a = this.fulfillment) === null || _a === void 0 ? void 0 : _a.summary.map(row => {
257
+ var _a, _b;
258
+ return {
259
+ name: (_b = (_a = this.order.lines.find(line => line.id === row.orderLine.id)) === null || _a === void 0 ? void 0 : _a.productVariant.name) !== null && _b !== void 0 ? _b : '',
260
+ quantity: row.quantity,
261
+ };
262
+ })) !== null && _b !== void 0 ? _b : []);
271
263
  }
272
264
  buildCustomFieldsFormGroup() {
273
265
  const customFields = this.fulfillment.customFields;
@@ -336,7 +328,8 @@ class LineFulfillmentComponent {
336
328
  * Returns the number of items in an OrderLine which are fulfilled.
337
329
  */
338
330
  getDeliveredCount(line) {
339
- return line.items.reduce((sum, item) => sum + (item.fulfillment ? 1 : 0), 0);
331
+ var _a, _b;
332
+ return ((_b = (_a = line.fulfillments) === null || _a === void 0 ? void 0 : _a.reduce((sum, fulfillment) => { var _a, _b; return sum + ((_b = (_a = fulfillment.summary.find(s => s.orderLine.id === line.id)) === null || _a === void 0 ? void 0 : _a.quantity) !== null && _b !== void 0 ? _b : 0); }, 0)) !== null && _b !== void 0 ? _b : 0);
340
333
  }
341
334
  getFulfillmentStatus(fulfilledCount, lineQuantity) {
342
335
  if (fulfilledCount === lineQuantity) {
@@ -348,27 +341,15 @@ class LineFulfillmentComponent {
348
341
  return 'none';
349
342
  }
350
343
  getFulfillments(line) {
351
- const counts = {};
352
- for (const item of line.items) {
353
- if (item.fulfillment) {
354
- if (counts[item.fulfillment.id] === undefined) {
355
- counts[item.fulfillment.id] = 1;
356
- }
357
- else {
358
- counts[item.fulfillment.id]++;
359
- }
360
- }
361
- }
362
- const all = line.items.reduce((fulfillments, item) => {
363
- return item.fulfillment ? [...fulfillments, item.fulfillment] : fulfillments;
364
- }, []);
365
- return Object.entries(counts).map(([id, count]) => {
344
+ var _a, _b;
345
+ return ((_b = (_a = line.fulfillments) === null || _a === void 0 ? void 0 : _a.map(fulfillment => {
346
+ var _a;
347
+ const summaryLine = fulfillment.summary.find(s => s.orderLine.id === line.id);
366
348
  return {
367
- count,
368
- // tslint:disable-next-line:no-non-null-assertion
369
- fulfillment: all.find(f => f.id === id),
349
+ count: (_a = summaryLine === null || summaryLine === void 0 ? void 0 : summaryLine.quantity) !== null && _a !== void 0 ? _a : 0,
350
+ fulfillment,
370
351
  };
371
- });
352
+ })) !== null && _b !== void 0 ? _b : []);
372
353
  }
373
354
  }
374
355
  LineFulfillmentComponent.decorators = [
@@ -484,8 +465,9 @@ ModificationDetailComponent.propDecorators = {
484
465
  };
485
466
 
486
467
  class OrderCustomFieldsCardComponent {
487
- constructor(formBuilder) {
468
+ constructor(formBuilder, modalService) {
488
469
  this.formBuilder = formBuilder;
470
+ this.modalService = modalService;
489
471
  this.customFieldsConfig = [];
490
472
  this.customFieldValues = {};
491
473
  this.updateClick = new EventEmitter();
@@ -502,17 +484,40 @@ class OrderCustomFieldsCardComponent {
502
484
  this.customFieldForm.markAsPristine();
503
485
  this.editable = false;
504
486
  }
487
+ onCancelClick() {
488
+ if (this.customFieldForm.dirty) {
489
+ this.modalService
490
+ .dialog({
491
+ title: marker('catalog.confirm-cancel'),
492
+ buttons: [
493
+ { type: 'secondary', label: marker('common.keep-editing') },
494
+ { type: 'danger', label: marker('common.discard-changes'), returnValue: true },
495
+ ],
496
+ })
497
+ .subscribe(result => {
498
+ if (result) {
499
+ this.customFieldForm.reset();
500
+ this.customFieldForm.markAsPristine();
501
+ this.editable = false;
502
+ }
503
+ });
504
+ }
505
+ else {
506
+ this.editable = false;
507
+ }
508
+ }
505
509
  }
506
510
  OrderCustomFieldsCardComponent.decorators = [
507
511
  { type: Component, args: [{
508
512
  selector: 'vdr-order-custom-fields-card',
509
- template: "<div class=\"card\" *ngIf=\"customFieldsConfig.length\">\r\n <div class=\"card-header\">\r\n {{ 'common.custom-fields' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text custom-field-form\" [class.editable]=\"editable\">\r\n <ng-container *ngFor=\"let customField of customFieldsConfig\">\r\n <vdr-custom-field-control\r\n entityName=\"Order\"\r\n [customFieldsFormGroup]=\"customFieldForm\"\r\n [compact]=\"true\"\r\n [readonly]=\"customField.readonly || !editable\"\r\n [customField]=\"customField\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-sm btn-secondary\" (click)=\"editable = true\" *ngIf=\"!editable\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"onUpdateClick()\"\r\n *ngIf=\"editable\"\r\n [disabled]=\"customFieldForm.pristine || customFieldForm.invalid\"\r\n >\r\n <clr-icon shape=\"check\"></clr-icon>\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n",
513
+ template: "<div class=\"card\" *ngIf=\"customFieldsConfig.length\">\r\n <div class=\"card-header\">\r\n {{ 'common.custom-fields' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text custom-field-form\" [class.editable]=\"editable\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Order\"\r\n [customFields]=\"customFieldsConfig\"\r\n [customFieldsFormGroup]=\"customFieldForm\"\r\n [readonly]=\"!editable\"\r\n [compact]=\"true\"\r\n ></vdr-tabbed-custom-fields>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-sm btn-secondary\" (click)=\"editable = true\" *ngIf=\"!editable\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"onUpdateClick()\"\r\n *ngIf=\"editable\"\r\n [disabled]=\"customFieldForm.pristine || customFieldForm.invalid\"\r\n >\r\n <clr-icon shape=\"check\"></clr-icon>\r\n {{ 'common.update' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"onCancelClick()\"\r\n *ngIf=\"editable\"\r\n >\r\n <clr-icon shape=\"times\"></clr-icon>\r\n {{ 'common.cancel' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n",
510
514
  changeDetection: ChangeDetectionStrategy.OnPush,
511
515
  styles: ["vdr-custom-field-control{margin-bottom:6px;display:block}.custom-field-form ::ng-deep .clr-control-label{color:var(--color-grey-400)}.custom-field-form.editable ::ng-deep .clr-control-label{color:inherit}\n"]
512
516
  },] }
513
517
  ];
514
518
  OrderCustomFieldsCardComponent.ctorParameters = () => [
515
- { type: FormBuilder }
519
+ { type: FormBuilder },
520
+ { type: ModalService }
516
521
  ];
517
522
  OrderCustomFieldsCardComponent.propDecorators = {
518
523
  customFieldsConfig: [{ type: Input }],
@@ -964,27 +969,56 @@ class OrderDetailComponent extends BaseDetailComponent {
964
969
  });
965
970
  }
966
971
  transitionPaymentState({ payment, state }) {
967
- this.dataService.order
968
- .transitionPaymentToState(payment.id, state)
969
- .subscribe(({ transitionPaymentToState }) => {
970
- switch (transitionPaymentToState.__typename) {
971
- case 'Payment':
972
- this.notificationService.success(marker('order.transitioned-payment-to-state-success'), {
973
- state,
974
- });
975
- this.dataService.order.getOrder(this.id).single$.subscribe();
976
- this.fetchHistory.next();
977
- break;
978
- case 'PaymentStateTransitionError':
979
- this.notificationService.error(transitionPaymentToState.message);
980
- break;
981
- }
982
- });
972
+ if (state === 'Cancelled') {
973
+ this.dataService.order.cancelPayment(payment.id).subscribe(({ cancelPayment }) => {
974
+ switch (cancelPayment.__typename) {
975
+ case 'Payment':
976
+ this.notificationService.success(marker('order.transitioned-payment-to-state-success'), {
977
+ state,
978
+ });
979
+ this.dataService.order.getOrder(this.id).single$.subscribe();
980
+ this.fetchHistory.next();
981
+ break;
982
+ case 'PaymentStateTransitionError':
983
+ this.notificationService.error(cancelPayment.transitionError);
984
+ break;
985
+ case 'CancelPaymentError':
986
+ this.notificationService.error(cancelPayment.paymentErrorMessage);
987
+ break;
988
+ }
989
+ });
990
+ }
991
+ else {
992
+ this.dataService.order
993
+ .transitionPaymentToState(payment.id, state)
994
+ .subscribe(({ transitionPaymentToState }) => {
995
+ switch (transitionPaymentToState.__typename) {
996
+ case 'Payment':
997
+ this.notificationService.success(marker('order.transitioned-payment-to-state-success'), {
998
+ state,
999
+ });
1000
+ this.dataService.order.getOrder(this.id).single$.subscribe();
1001
+ this.fetchHistory.next();
1002
+ break;
1003
+ case 'PaymentStateTransitionError':
1004
+ this.notificationService.error(transitionPaymentToState.message);
1005
+ break;
1006
+ }
1007
+ });
1008
+ }
983
1009
  }
984
1010
  canAddFulfillment(order) {
985
- const allItemsFulfilled = order.lines
986
- .reduce((items, line) => [...items, ...line.items], [])
987
- .every(item => !!item.fulfillment || item.cancelled);
1011
+ var _a;
1012
+ const allFulfillmentSummaryRows = ((_a = order.fulfillments) !== null && _a !== void 0 ? _a : []).reduce((all, fulfillment) => [...all, ...fulfillment.summary], []);
1013
+ let allItemsFulfilled = true;
1014
+ for (const line of order.lines) {
1015
+ const totalFulfilledCount = allFulfillmentSummaryRows
1016
+ .filter(row => row.orderLine.id === line.id)
1017
+ .reduce((sum, row) => sum + row.quantity, 0);
1018
+ if (totalFulfilledCount < line.quantity) {
1019
+ allItemsFulfilled = false;
1020
+ }
1021
+ }
988
1022
  return (!allItemsFulfilled &&
989
1023
  !this.hasUnsettledModifications(order) &&
990
1024
  this.outstandingPaymentAmount(order) === 0 &&
@@ -1908,6 +1942,7 @@ class OrderListComponent extends BaseListComponent {
1908
1942
  this.serverConfigService = serverConfigService;
1909
1943
  this.dataService = dataService;
1910
1944
  this.localStorageService = localStorageService;
1945
+ this.searchControl = new FormControl('');
1911
1946
  this.searchOrderCodeControl = new FormControl('');
1912
1947
  this.searchLastNameControl = new FormControl('');
1913
1948
  this.orderStates = this.serverConfigService.getOrderProcessStates().map(item => item.name);
@@ -1948,7 +1983,7 @@ class OrderListComponent extends BaseListComponent {
1948
1983
  // tslint:disable-next-line:no-shadowed-variable
1949
1984
  (take, skip) => this.dataService.order.getOrders({ take, skip }).refetchOnChannelChange(), data => data.orders,
1950
1985
  // tslint:disable-next-line:no-shadowed-variable
1951
- (skip, take) => this.createQueryOptions(skip, take, this.searchOrderCodeControl.value, this.searchLastNameControl.value, this.route.snapshot.queryParamMap.get('filter') || 'open'));
1986
+ (skip, take) => this.createQueryOptions(skip, take, this.searchControl.value, this.route.snapshot.queryParamMap.get('filter') || 'open'));
1952
1987
  const lastFilters = this.localStorageService.get('orderListLastCustomFilters');
1953
1988
  if (lastFilters) {
1954
1989
  this.setQueryParam(lastFilters, { replaceUrl: true });
@@ -1958,7 +1993,7 @@ class OrderListComponent extends BaseListComponent {
1958
1993
  var _a;
1959
1994
  super.ngOnInit();
1960
1995
  this.activePreset$ = this.route.queryParamMap.pipe(map(qpm => qpm.get('filter') || 'open'), distinctUntilChanged());
1961
- const searchTerms$ = merge(this.searchOrderCodeControl.valueChanges, this.searchLastNameControl.valueChanges).pipe(filter(value => 2 < value.length || value.length === 0), debounceTime(250));
1996
+ const searchTerms$ = merge(this.searchControl.valueChanges).pipe(filter(value => 2 < value.length || value.length === 0), debounceTime(250));
1962
1997
  merge(searchTerms$, this.route.queryParamMap)
1963
1998
  .pipe(takeUntil(this.destroy$))
1964
1999
  .subscribe(val => {
@@ -1991,11 +2026,12 @@ class OrderListComponent extends BaseListComponent {
1991
2026
  }
1992
2027
  createQueryOptions(
1993
2028
  // tslint:disable-next-line:no-shadowed-variable
1994
- skip, take, orderCodeSearchTerm, customerNameSearchTerm, activeFilterPreset) {
2029
+ skip, take, searchTerm, activeFilterPreset) {
1995
2030
  var _a;
1996
2031
  const filterConfig = this.filterPresets.find(p => p.name === activeFilterPreset);
1997
2032
  // tslint:disable-next-line:no-shadowed-variable
1998
- const filter = {};
2033
+ let filter = {};
2034
+ let filterOperator = LogicalOperator.AND;
1999
2035
  if (filterConfig) {
2000
2036
  if (filterConfig.config.active != null) {
2001
2037
  filter.active = {
@@ -2037,15 +2073,19 @@ class OrderListComponent extends BaseListComponent {
2037
2073
  };
2038
2074
  }
2039
2075
  }
2040
- if (customerNameSearchTerm) {
2041
- filter.customerLastName = {
2042
- contains: customerNameSearchTerm,
2043
- };
2044
- }
2045
- if (orderCodeSearchTerm) {
2046
- filter.code = {
2047
- contains: orderCodeSearchTerm,
2076
+ if (searchTerm) {
2077
+ filter = {
2078
+ customerLastName: {
2079
+ contains: searchTerm,
2080
+ },
2081
+ transactionId: {
2082
+ contains: searchTerm,
2083
+ },
2084
+ code: {
2085
+ contains: searchTerm,
2086
+ },
2048
2087
  };
2088
+ filterOperator = LogicalOperator.OR;
2049
2089
  }
2050
2090
  return {
2051
2091
  options: {
@@ -2055,6 +2095,7 @@ class OrderListComponent extends BaseListComponent {
2055
2095
  sort: {
2056
2096
  updatedAt: SortOrder.DESC,
2057
2097
  },
2098
+ filterOperator,
2058
2099
  },
2059
2100
  };
2060
2101
  }
@@ -2070,7 +2111,7 @@ class OrderListComponent extends BaseListComponent {
2070
2111
  OrderListComponent.decorators = [
2071
2112
  { type: Component, args: [{
2072
2113
  selector: 'vdr-order-list',
2073
- template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchOrderCodeControl\"\r\n [placeholder]=\"'order.search-by-order-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchLastNameControl\"\r\n [placeholder]=\"'order.search-by-customer-last-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | 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>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
2114
+ template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchControl\"\r\n [placeholder]=\"'order.search-by-order-filters' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | 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>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n",
2074
2115
  changeDetection: ChangeDetectionStrategy.OnPush,
2075
2116
  styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"]
2076
2117
  },] }
@@ -2096,7 +2137,7 @@ class OrderPaymentCardComponent {
2096
2137
  if (!this.payment) {
2097
2138
  return [];
2098
2139
  }
2099
- return this.payment.nextStates.filter(s => s !== 'Settled');
2140
+ return this.payment.nextStates.filter(s => s !== 'Settled' && s !== 'Error');
2100
2141
  }
2101
2142
  }
2102
2143
  OrderPaymentCardComponent.decorators = [