@vendure/admin-ui-plugin 2.0.0-next.2 → 2.0.0-next.21
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.
- package/lib/admin-ui/165.6aeb6ecf722558ee.js.map +1 -1
- package/lib/admin-ui/239.e2e63f2ccd517604.js +2 -0
- package/lib/admin-ui/239.e2e63f2ccd517604.js.map +1 -0
- package/lib/admin-ui/26.5cc3bfffe8943e16.js +2 -0
- package/lib/admin-ui/26.5cc3bfffe8943e16.js.map +1 -0
- package/lib/admin-ui/316.265d65a6a9d1b4c0.js +2 -0
- package/lib/admin-ui/{316.07f9c805e4c95dc8.js.map → 316.265d65a6a9d1b4c0.js.map} +1 -1
- package/lib/admin-ui/356.975f7f2d201afda5.js +2 -0
- package/lib/admin-ui/356.975f7f2d201afda5.js.map +1 -0
- package/lib/admin-ui/3rdpartylicenses.txt +23 -0
- package/lib/admin-ui/407.a3fde1da25c0935c.js +12 -0
- package/lib/admin-ui/407.a3fde1da25c0935c.js.map +1 -0
- package/lib/admin-ui/451.a7fd4069c4f4c687.js +65 -0
- package/lib/admin-ui/451.a7fd4069c4f4c687.js.map +1 -0
- package/lib/admin-ui/600.17470a2c90aa79d8.js +2 -0
- package/lib/admin-ui/600.17470a2c90aa79d8.js.map +1 -0
- package/lib/admin-ui/625.3c0c5821b952b58e.js +2 -0
- package/lib/admin-ui/{625.adebc6a7222bde82.js.map → 625.3c0c5821b952b58e.js.map} +1 -1
- package/lib/admin-ui/i18n-messages/cs.json +50 -3
- package/lib/admin-ui/i18n-messages/de.json +53 -3
- package/lib/admin-ui/i18n-messages/en.json +55 -8
- package/lib/admin-ui/i18n-messages/es.json +50 -3
- package/lib/admin-ui/i18n-messages/fr.json +50 -3
- package/lib/admin-ui/i18n-messages/it.json +50 -3
- package/lib/admin-ui/i18n-messages/pl.json +50 -3
- package/lib/admin-ui/i18n-messages/pt_BR.json +50 -3
- package/lib/admin-ui/i18n-messages/pt_PT.json +50 -3
- package/lib/admin-ui/i18n-messages/ru.json +50 -3
- package/lib/admin-ui/i18n-messages/uk.json +50 -3
- package/lib/admin-ui/i18n-messages/zh_Hans.json +50 -3
- package/lib/admin-ui/i18n-messages/zh_Hant.json +50 -3
- package/lib/admin-ui/index.html +2 -2
- package/lib/admin-ui/main.65109179713dd228.js +2944 -0
- package/lib/admin-ui/main.65109179713dd228.js.map +1 -0
- package/lib/admin-ui/runtime.28bd5da02a9b1f7b.js +2 -0
- package/lib/admin-ui/{runtime.1dd1cbaf09547dd2.js.map → runtime.28bd5da02a9b1f7b.js.map} +1 -1
- package/lib/admin-ui/styles/_variables.scss +4 -0
- package/lib/admin-ui/styles/global/_forms.scss +8 -7
- package/lib/admin-ui/styles/global/_overrides.scss +11 -1
- package/lib/admin-ui/styles/global/_sass-overrides.scss +3 -0
- package/lib/admin-ui/styles/global/_utilities.scss +14 -0
- package/lib/admin-ui/styles/styles.scss +1 -0
- package/lib/admin-ui/styles/theme/default.scss +13 -1
- package/lib/admin-ui/styles/ui-extension-theme.scss +1 -0
- package/lib/admin-ui/{styles.fb1aaa9a9baed129.css → styles.88d3f0120bfc894a.css} +2 -2
- package/lib/admin-ui/styles.88d3f0120bfc894a.css.map +1 -0
- package/package.json +4 -4
- package/lib/admin-ui/239.a68e402e10b798f1.js +0 -2
- package/lib/admin-ui/239.a68e402e10b798f1.js.map +0 -1
- package/lib/admin-ui/26.477d6446134d960e.js +0 -2
- package/lib/admin-ui/26.477d6446134d960e.js.map +0 -1
- package/lib/admin-ui/316.07f9c805e4c95dc8.js +0 -2
- package/lib/admin-ui/349.abe4847f7fe9b3da.js +0 -2
- package/lib/admin-ui/349.abe4847f7fe9b3da.js.map +0 -1
- package/lib/admin-ui/356.3a6951fe80b5a001.js +0 -2
- package/lib/admin-ui/356.3a6951fe80b5a001.js.map +0 -1
- package/lib/admin-ui/600.8f0165a8d1255cd0.js +0 -2
- package/lib/admin-ui/600.8f0165a8d1255cd0.js.map +0 -1
- package/lib/admin-ui/625.adebc6a7222bde82.js +0 -2
- package/lib/admin-ui/849.cc032ddf77c67cc3.js +0 -2
- package/lib/admin-ui/849.cc032ddf77c67cc3.js.map +0 -1
- package/lib/admin-ui/main.0b0d9a8ae6759254.js +0 -2740
- package/lib/admin-ui/main.0b0d9a8ae6759254.js.map +0 -1
- package/lib/admin-ui/runtime.1dd1cbaf09547dd2.js +0 -2
- package/lib/admin-ui/styles.fb1aaa9a9baed129.css.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["e","constructor","o","t","this","c","P","V","r","selectedMemberIds","indexOf","id","ngOnInit","membersCurrentPage$","route","paramMap","pipe","p","get","membersItemsPerPage$","W","filterTermControl","valueChanges","ae","setContentsPageNumber","q","X","refresh$","ce","destroy$","subscribe","n","a","l","fetchParamsChange","emit","filterTerm","skip","take","ngOnDestroy","next","complete","setParam","setContentsItemsPerPage","refresh","router","navigate","Object","snapshot","params","relativeTo","queryParamsHandling","areAllSelected","members","length","toggleSelectAll","selectionChange","map","toggleSelectMember","includes","filter","A","selectors","cancel","add","fetchGroupMembers$","dataService","customer","getCustomerList","mapStream","customers","customers$","items","customersTotal$","totalItems","resolveWith","selectedCustomerIds","N","save","addressForm","changeDetector","markForCheck","L","editAddress","setAsDefaultShippingAddress","setAsDefaultBillingAddress","delete","value","dataDependenciesPopulated","ngOnChanges","customFields","availableCountries","getCountryName","find","code","name","setAsDefaultBilling","markAsDirty","setAsDefaultShipping","deleteAddress","modalService","fromComponent","locals","size","closable","S","isArray","Array","me","s","ke","de","groups$","getCustomerGroupList","customerGroups","selectedGroupIds","F","Z","addNoteToCustomer","oxw","updateNote","deleteNote","d","getDisplayType","type","getTimelineIcon","isFeatured","getName","administrator","firstName","lastName","addNote","note","O","create","removeFromGroup","addToGroup","setDefaultBillingAddressId","setDefaultShippingAddressId","toggleDeleteAddress","addAddress","setOrderItemsPerPage","setOrderCurrentPage","u","h","super","Set","getCustomFieldConfig","addressCustomFields","detailForm","formBuilder","group","title","phoneNumber","emailAddress","password","reduce","f","B","addresses","init","availableCountries$","settings","getAvailableCountries","mapSingle","countries","Qe","entity$","je","orderListUpdates$","orders$","orders","ordersCount$","history$","fetchHistory","g","getCustomerHistory","sort","createdAt","history","destroy","getAddressFormControls","controls","defaultBillingAddressId","addressDefaultsUpdated","defaultShippingAddressId","addressesToDeleteIds","has","fullName","company","streetLine1","streetLine2","city","province","postalCode","countryCode","defaultShippingAddress","defaultBillingAddress","addControl","push","ordersPerPage","fetchOrdersList","currentOrdersPage","createCustomer","__typename","notificationService","success","entity","notify","message","m","translationVars","duration","markAsPristine","error","le","dirty","updateCustomer","deleteCustomerAddress","updateCustomerAddress","createCustomerAddress","Ee","getCustomer","single$","x","addCustomersToGroup","customerCount","groupName","dialog","buttons","label","returnValue","removeCustomersFromGroup","displayPrivacyControls","data","updateCustomerNote","noteId","body","deleteCustomerNote","setFormValues","patchValue","Pe","country","xo","ve","bo","yo","setControl","setCustomFieldFormValues","te","Ge","J","serverConfigService","getCustomFieldsFor","form","T","update","closeMembers","listIsEmpty$","activeGroup$","refreshActiveGroupMembers$","getCustomerGroupWithCustomers","contains","customerGroup","he","members$","membersTotal$","createCustomerGroup","customerIds","deleteCustomerGroup","result","errorMessage","updateCustomerGroup","contents","verticalAlign","I","deleteCustomer","setQueryFn","refetchOnChannelChange","options","searchTerm","filterOperator","go","ie","w","updatedAt","user","D","factory","fe","path","component","pathMatch","breadcrumb","resolve","canDeactivate","Ce","breadcrumbKey","M","C"],"sources":["./src/lib/customer/src/components/customer-group-member-list/customer-group-member-list.component.html","./src/lib/customer/src/components/customer-group-member-list/customer-group-member-list.component.ts","./src/lib/customer/src/components/add-customer-to-group-dialog/add-customer-to-group-dialog.component.html","./src/lib/customer/src/components/add-customer-to-group-dialog/add-customer-to-group-dialog.component.ts","./src/lib/customer/src/components/address-detail-dialog/address-detail-dialog.component.html","./src/lib/customer/src/components/address-detail-dialog/address-detail-dialog.component.ts","./src/lib/customer/src/components/address-card/address-card.component.html","./src/lib/customer/src/components/address-card/address-card.component.ts","./node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js","./src/lib/customer/src/components/select-customer-group-dialog/select-customer-group-dialog.component.html","./src/lib/customer/src/components/select-customer-group-dialog/select-customer-group-dialog.component.ts","./src/lib/customer/src/components/customer-status-label/customer-status-label.component.html","./src/lib/customer/src/components/customer-status-label/customer-status-label.component.ts","./src/lib/customer/src/components/customer-history/customer-history.component.html","./src/lib/customer/src/components/customer-history/customer-history.component.ts","./src/lib/customer/src/components/customer-detail/customer-detail.component.html","./src/lib/customer/src/components/customer-detail/customer-detail.component.ts","./src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.html","./src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.ts","./src/lib/customer/src/components/customer-group-list/customer-group-list.component.html","./src/lib/customer/src/components/customer-group-list/customer-group-list.component.ts","./src/lib/customer/src/components/customer-list/customer-list.component.html","./src/lib/customer/src/components/customer-list/customer-list.component.ts","./src/lib/customer/src/providers/routing/customer-resolver.ts","./src/lib/customer/src/customer.routes.ts","./src/lib/customer/src/customer.module.ts"],"sourcesContent":["<input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"filterTermControl\"\r\n [placeholder]=\"'customer.search-customers-by-email' | translate\"\r\n class=\"search-input\"\r\n/>\r\n\r\n<vdr-data-table\r\n [items]=\"members\"\r\n [itemsPerPage]=\"membersItemsPerPage$ | async\"\r\n [totalItems]=\"totalItems\"\r\n [currentPage]=\"membersCurrentPage$ | async\"\r\n (pageChange)=\"setContentsPageNumber($event)\"\r\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\r\n [allSelected]=\"areAllSelected()\"\r\n [isRowSelectedFn]=\"('UpdateCustomerGroup' | hasPermission) && isMemberSelected\"\r\n (rowSelectChange)=\"toggleSelectMember($event)\"\r\n (allSelectChange)=\"toggleSelectAll()\"\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></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=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['/customer', 'customers', customer.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Customer, DataService } from '@vendure/admin-ui/core';\r\nimport { ZoneMember } from '@vendure/admin-ui/settings';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map, startWith, takeUntil, tap } from 'rxjs/operators';\r\n\r\nexport interface CustomerGroupMemberFetchParams {\r\n skip: number;\r\n take: number;\r\n filterTerm: string;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-member-list',\r\n templateUrl: './customer-group-member-list.component.html',\r\n styleUrls: ['./customer-group-member-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupMemberListComponent implements OnInit, OnDestroy {\r\n @Input() members: Array<\r\n Pick<Customer, 'id' | 'createdAt' | 'updatedAt' | 'title' | 'firstName' | 'lastName' | 'emailAddress'>\r\n >;\r\n @Input() totalItems: number;\r\n @Input() route: ActivatedRoute;\r\n @Input() selectedMemberIds: string[] = [];\r\n @Output() selectionChange = new EventEmitter<string[]>();\r\n @Output() fetchParamsChange = new EventEmitter<CustomerGroupMemberFetchParams>();\r\n\r\n membersItemsPerPage$: Observable<number>;\r\n membersCurrentPage$: Observable<number>;\r\n filterTermControl = new FormControl('');\r\n private refresh$ = new BehaviorSubject<boolean>(true);\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(private router: Router, private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.membersCurrentPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('membersPage')),\r\n map(page => (!page ? 1 : +page)),\r\n startWith(1),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.membersItemsPerPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('membersPerPage')),\r\n map(perPage => (!perPage ? 10 : +perPage)),\r\n startWith(10),\r\n distinctUntilChanged(),\r\n );\r\n\r\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(''),\r\n );\r\n\r\n combineLatest(this.membersCurrentPage$, this.membersItemsPerPage$, filterTerm$, this.refresh$)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(([currentPage, itemsPerPage, filterTerm]) => {\r\n const take = itemsPerPage;\r\n const skip = (currentPage - 1) * itemsPerPage;\r\n this.fetchParamsChange.emit({\r\n filterTerm,\r\n skip,\r\n take,\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n setContentsPageNumber(page: number) {\r\n this.setParam('membersPage', page);\r\n }\r\n\r\n setContentsItemsPerPage(perPage: number) {\r\n this.setParam('membersPerPage', perPage);\r\n }\r\n\r\n refresh() {\r\n this.refresh$.next(true);\r\n }\r\n\r\n private setParam(key: string, value: any) {\r\n this.router.navigate(['./', { ...this.route.snapshot.params, [key]: value }], {\r\n relativeTo: this.route,\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n areAllSelected(): boolean {\r\n if (this.members) {\r\n return this.selectedMemberIds.length === this.members.length;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n toggleSelectAll() {\r\n if (this.areAllSelected()) {\r\n this.selectionChange.emit([]);\r\n } else {\r\n this.selectionChange.emit(this.members.map(v => v.id));\r\n }\r\n }\r\n\r\n toggleSelectMember(member: ZoneMember) {\r\n if (this.selectedMemberIds.includes(member.id)) {\r\n this.selectionChange.emit(this.selectedMemberIds.filter(id => id !== member.id));\r\n } else {\r\n this.selectionChange.emit([...this.selectedMemberIds, member.id]);\r\n }\r\n }\r\n\r\n isMemberSelected = (member: ZoneMember): boolean => {\r\n return -1 < this.selectedMemberIds.indexOf(member.id);\r\n };\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'customer.add-customers-to-group-with-name' | translate: {groupName: group.name} }}\r\n</ng-template>\r\n\r\n<vdr-customer-group-member-list\r\n [members]=\"customers$ | async\"\r\n [totalItems]=\"customersTotal$ | async\"\r\n [route]=\"route\"\r\n [selectedMemberIds]=\"selectedCustomerIds\"\r\n (fetchParamsChange)=\"fetchGroupMembers$.next($event)\"\r\n (selectionChange)=\"selectedCustomerIds = $event\"\r\n>\r\n\r\n</vdr-customer-group-member-list>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"add()\" [disabled]=\"!selectedCustomerIds.length\" class=\"btn btn-primary\">\r\n {{ 'customer.add-customers-to-group-with-count' | translate: {count: selectedCustomerIds.length} }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport {\r\n DataService,\r\n Dialog,\r\n GetCustomerGroupsQuery,\r\n GetCustomerListQuery,\r\n ItemOf,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { CustomerGroupMemberFetchParams } from '../customer-group-member-list/customer-group-member-list.component';\r\n\r\n@Component({\r\n selector: 'vdr-add-customer-to-group-dialog',\r\n templateUrl: './add-customer-to-group-dialog.component.html',\r\n styleUrls: ['./add-customer-to-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddCustomerToGroupDialogComponent implements Dialog<string[]>, OnInit {\r\n resolveWith: (result?: string[]) => void;\r\n group: ItemOf<GetCustomerGroupsQuery, 'customerGroups'>;\r\n route: ActivatedRoute;\r\n selectedCustomerIds: string[] = [];\r\n customers$: Observable<GetCustomerListQuery['customers']['items']>;\r\n customersTotal$: Observable<number>;\r\n fetchGroupMembers$ = new BehaviorSubject<CustomerGroupMemberFetchParams>({\r\n skip: 0,\r\n take: 10,\r\n filterTerm: '',\r\n });\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n const customerResult$ = this.fetchGroupMembers$.pipe(\r\n switchMap(({ skip, take, filterTerm }) => {\r\n return this.dataService.customer\r\n .getCustomerList(take, skip, filterTerm)\r\n .mapStream(res => res.customers);\r\n }),\r\n );\r\n\r\n this.customers$ = customerResult$.pipe(map(res => res.items));\r\n this.customersTotal$ = customerResult$.pipe(map(res => res.totalItems));\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n add() {\r\n this.resolveWith(this.selectedCustomerIds);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <span *ngIf=\"addressForm.get('streetLine1')?.value as streetLine1\">{{ streetLine1 }},</span>\r\n <span *ngIf=\"addressForm.get('countryCode')?.value as countryCode\"> {{ countryCode }}</span>\r\n</ng-template>\r\n\r\n<vdr-address-form\r\n [formGroup]=\"addressForm\"\r\n [availableCountries]=\"availableCountries\"\r\n [customFields]=\"customFields\"\r\n></vdr-address-form>\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)=\"save()\"\r\n [disabled]=\"!addressForm.valid || !addressForm.touched\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, Dialog, GetAvailableCountriesQuery } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-address-detail-dialog',\r\n templateUrl: './address-detail-dialog.component.html',\r\n styleUrls: ['./address-detail-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddressDetailDialogComponent implements Dialog<FormGroup>, OnInit {\r\n addressForm: FormGroup;\r\n customFields: CustomFieldConfig;\r\n availableCountries: GetAvailableCountriesQuery['countries']['items'] = [];\r\n resolveWith: (result?: FormGroup) => void;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.addressForm.valueChanges.subscribe(() => this.changeDetector.markForCheck());\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n save() {\r\n this.resolveWith(this.addressForm);\r\n }\r\n}\r\n","<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","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, GetAvailableCountriesQuery, ModalService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { filter, take } from 'rxjs/operators';\r\n\r\nimport { AddressDetailDialogComponent } from '../address-detail-dialog/address-detail-dialog.component';\r\n\r\n@Component({\r\n selector: 'vdr-address-card',\r\n templateUrl: './address-card.component.html',\r\n styleUrls: ['./address-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddressCardComponent implements OnInit, OnChanges {\r\n @Input() addressForm: FormGroup;\r\n @Input() customFields: CustomFieldConfig;\r\n @Input() availableCountries: GetAvailableCountriesQuery['countries']['items'] = [];\r\n @Input() isDefaultBilling: string;\r\n @Input() isDefaultShipping: string;\r\n @Input() editable = true;\r\n @Output() setAsDefaultShipping = new EventEmitter<string>();\r\n @Output() setAsDefaultBilling = new EventEmitter<string>();\r\n @Output() deleteAddress = new EventEmitter<string>();\r\n private dataDependenciesPopulated = new BehaviorSubject<boolean>(false);\r\n\r\n constructor(private modalService: ModalService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n const streetLine1 = this.addressForm.get('streetLine1') as FormControl;\r\n // Make the address dialog display automatically if there is no address line\r\n // as is the case when adding a new address.\r\n if (!streetLine1.value) {\r\n this.dataDependenciesPopulated\r\n .pipe(\r\n filter(value => value),\r\n take(1),\r\n )\r\n .subscribe(() => {\r\n this.editAddress();\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.customFields != null && this.availableCountries != null) {\r\n this.dataDependenciesPopulated.next(true);\r\n }\r\n }\r\n\r\n getCountryName(countryCode: string) {\r\n if (!this.availableCountries) {\r\n return '';\r\n }\r\n const match = this.availableCountries.find(c => c.code === countryCode);\r\n return match ? match.name : '';\r\n }\r\n\r\n setAsDefaultBillingAddress() {\r\n this.setAsDefaultBilling.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n setAsDefaultShippingAddress() {\r\n this.setAsDefaultShipping.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n delete() {\r\n this.deleteAddress.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n editAddress() {\r\n this.modalService\r\n .fromComponent(AddressDetailDialogComponent, {\r\n locals: {\r\n addressForm: this.addressForm,\r\n customFields: this.customFields,\r\n availableCountries: this.availableCountries,\r\n },\r\n size: 'md',\r\n closable: true,\r\n })\r\n .subscribe(() => {\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n}\r\n","import { operate } from '../util/lift';\nimport { argsOrArgArray } from '../util/argsOrArgArray';\nimport { mergeAll } from './mergeAll';\nimport { popNumber, popScheduler } from '../util/args';\nimport { from } from '../observable/from';\nexport function merge(...args) {\n const scheduler = popScheduler(args);\n const concurrent = popNumber(args, Infinity);\n args = argsOrArgArray(args);\n return operate((source, subscriber) => {\n mergeAll(concurrent)(from([source, ...args], scheduler)).subscribe(subscriber);\n });\n}\n","<ng-template vdrDialogTitle>\r\n {{ 'customer.add-customer-to-group' | translate }}\r\n</ng-template>\r\n\r\n<ng-select\r\n [items]=\"groups$ | async\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n bindValue=\"id\"\r\n [(ngModel)]=\"selectedGroupIds\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\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)\"> × </span>\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\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"add()\" [disabled]=\"!selectedGroupIds.length\" class=\"btn btn-primary\">\r\n {{ 'customer.add-customer-to-groups-with-count' | translate: {count: selectedGroupIds.length} }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { DataService, Dialog, GetCustomerGroupsQuery, ItemOf } from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-select-customer-group-dialog',\r\n templateUrl: './select-customer-group-dialog.component.html',\r\n styleUrls: ['./select-customer-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectCustomerGroupDialogComponent implements Dialog<string[]>, OnInit {\r\n resolveWith: (result?: string[]) => void;\r\n groups$: Observable<Array<ItemOf<GetCustomerGroupsQuery, 'customerGroups'>>>;\r\n selectedGroupIds: string[] = [];\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.groups$ = this.dataService.customer\r\n .getCustomerGroupList()\r\n .mapStream(res => res.customerGroups.items);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n add() {\r\n this.resolveWith(this.selectedGroupIds);\r\n }\r\n}\r\n","<vdr-chip *ngIf=\"customer.user?.id\">\r\n <ng-container *ngIf=\"customer.user?.verified\">\r\n <clr-icon shape=\"check-circle\" class=\"verified-user-icon\"></clr-icon>\r\n {{ 'customer.verified' | translate }}\r\n </ng-container>\r\n <ng-container *ngIf=\"!customer.user?.verified\">\r\n <clr-icon shape=\"check-circle\" class=\"registered-user-icon\"></clr-icon>\r\n {{ 'customer.registered' | translate }}\r\n </ng-container>\r\n</vdr-chip>\r\n<vdr-chip *ngIf=\"!customer.user?.id\">{{ 'customer.guest' | translate }}</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CustomerFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-status-label',\r\n templateUrl: './customer-status-label.component.html',\r\n styleUrls: ['./customer-status-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerStatusLabelComponent {\r\n @Input() customer: CustomerFragment;\r\n}\r\n","<h4>{{ 'customer.customer-history' | translate }}</h4>\r\n<div class=\"entry-list\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" *vdrIfPermissions=\"'UpdateCustomer'\">\r\n <div class=\"note-entry\">\r\n <textarea [(ngModel)]=\"note\" name=\"note\" class=\"note\"></textarea>\r\n <button class=\"btn btn-secondary\" [disabled]=\"!note\" (click)=\"addNoteToCustomer()\">\r\n {{ 'order.add-note' | translate }}\r\n </button>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\r\n [displayType]=\"getDisplayType(entry)\"\r\n [iconShape]=\"getTimelineIcon(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"getName(entry)\"\r\n [featured]=\"isFeatured(entry)\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_REGISTERED\">\r\n <div class=\"title\">\r\n {{ 'customer.history-customer-registered' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"entry.data.strategy === 'native'; else namedStrategy\">\r\n {{ 'customer.history-using-native-auth-strategy' | translate }}\r\n </ng-container>\r\n <ng-template #namedStrategy>\r\n {{\r\n 'customer.history-using-external-auth-strategy'\r\n | translate: { strategy: entry.data.strategy }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_VERIFIED\">\r\n <div class=\"title\">\r\n {{ 'customer.history-customer-verified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"entry.data.strategy === 'native'; else namedStrategy\">\r\n {{ 'customer.history-using-native-auth-strategy' | translate }}\r\n </ng-container>\r\n <ng-template #namedStrategy>\r\n {{\r\n 'customer.history-using-external-auth-strategy'\r\n | translate: { strategy: entry.data.strategy }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_DETAIL_UPDATED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-detail-updated' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-object-tree [value]=\"entry.data.input\"></vdr-object-tree>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDED_TO_GROUP\">\r\n {{\r\n 'customer.history-customer-added-to-group'\r\n | translate: { groupName: entry.data.groupName }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_REMOVED_FROM_GROUP\">\r\n {{\r\n 'customer.history-customer-removed-from-group'\r\n | translate: { groupName: entry.data.groupName }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_CREATED\">\r\n {{ 'customer.history-customer-address-created' | translate }}\r\n <div class=\"flex\">\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_UPDATED\">\r\n {{ 'customer.history-customer-address-updated' | translate }}\r\n <div class=\"flex\">\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n <vdr-history-entry-detail>\r\n <vdr-object-tree [value]=\"entry.data.input\"></vdr-object-tree>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_DELETED\">\r\n {{ 'customer.history-customer-address-deleted' | translate }}\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_UPDATED\">\r\n {{ 'customer.history-customer-password-updated' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_RESET_REQUESTED\">\r\n {{ 'customer.history-customer-password-reset-requested' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_RESET_VERIFIED\">\r\n {{ 'customer.history-customer-password-reset-verified' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_EMAIL_UPDATE_REQUESTED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-email-update-requested' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-labeled-data [label]=\"'customer.old-email-address' | translate\">{{\r\n entry.data.oldEmailAddress\r\n }}</vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'customer.new-email-address' | translate\">{{\r\n entry.data.newEmailAddress\r\n }}</vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_EMAIL_UPDATE_VERIFIED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-email-update-verified' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-labeled-data [label]=\"'customer.old-email-address' | translate\">{{\r\n entry.data.oldEmailAddress\r\n }}</vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'customer.new-email-address' | translate\">{{\r\n entry.data.newEmailAddress\r\n }}</vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n {{ entry.data.note }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"updateNote.emit(entry)\"\r\n [disabled]=\"!('UpdateCustomer' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"deleteNote.emit(entry)\"\r\n [disabled]=\"!('UpdateCustomer' | hasPermission)\"\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 </div>\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\"></vdr-timeline-entry>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n CustomerFragment,\r\n GetCustomerHistoryQuery,\r\n HistoryEntry,\r\n HistoryEntryType,\r\n TimelineDisplayType,\r\n} from '@vendure/admin-ui/core';\r\n\r\ntype HistoryItem = NonNullable<GetCustomerHistoryQuery['customer']>['history']['items'][number];\r\n\r\n@Component({\r\n selector: 'vdr-customer-history',\r\n templateUrl: './customer-history.component.html',\r\n styleUrls: ['./customer-history.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerHistoryComponent {\r\n @Input() customer: CustomerFragment;\r\n @Input() history: HistoryItem[];\r\n @Output() addNote = new EventEmitter<{ note: string }>();\r\n @Output() updateNote = new EventEmitter<HistoryEntry>();\r\n @Output() deleteNote = new EventEmitter<HistoryEntry>();\r\n note = '';\r\n readonly type = HistoryEntryType;\r\n\r\n getDisplayType(entry: HistoryItem): TimelineDisplayType {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n case HistoryEntryType.CUSTOMER_EMAIL_UPDATE_VERIFIED:\r\n case HistoryEntryType.CUSTOMER_PASSWORD_RESET_VERIFIED:\r\n return 'success';\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n return 'muted';\r\n case HistoryEntryType.CUSTOMER_REMOVED_FROM_GROUP:\r\n return 'error';\r\n default:\r\n return 'default';\r\n }\r\n }\r\n\r\n getTimelineIcon(entry: HistoryItem): string | [string, string] | undefined {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n return 'user';\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n return ['assign-user', 'is-solid'];\r\n case HistoryEntryType.CUSTOMER_NOTE:\r\n return 'note';\r\n case HistoryEntryType.CUSTOMER_ADDED_TO_GROUP:\r\n case HistoryEntryType.CUSTOMER_REMOVED_FROM_GROUP:\r\n return 'users';\r\n }\r\n }\r\n\r\n isFeatured(entry: HistoryItem): boolean {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n getName(entry: HistoryItem): string {\r\n const { administrator } = entry;\r\n if (administrator) {\r\n return `${administrator.firstName} ${administrator.lastName}`;\r\n } else {\r\n return `${this.customer.firstName} ${this.customer.lastName}`;\r\n }\r\n }\r\n\r\n addNoteToCustomer() {\r\n this.addNote.emit({ note: this.note });\r\n this.note = '';\r\n }\r\n}\r\n","<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","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateAddressInput,\r\n CreateCustomerAddressMutation,\r\n CreateCustomerInput,\r\n Customer,\r\n CustomFieldConfig,\r\n DataService,\r\n DeleteCustomerAddressMutation,\r\n EditNoteDialogComponent,\r\n GetAvailableCountriesQuery,\r\n GetCustomerHistoryQuery,\r\n GetCustomerQuery,\r\n HistoryEntry,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n SortOrder,\r\n UpdateCustomerAddressMutation,\r\n UpdateCustomerInput,\r\n UpdateCustomerMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { EMPTY, forkJoin, from, Observable, Subject } from 'rxjs';\r\nimport {\r\n concatMap,\r\n filter,\r\n map,\r\n merge,\r\n mergeMap,\r\n shareReplay,\r\n startWith,\r\n switchMap,\r\n take,\r\n} from 'rxjs/operators';\r\n\r\nimport { SelectCustomerGroupDialogComponent } from '../select-customer-group-dialog/select-customer-group-dialog.component';\r\n\r\ntype CustomerWithOrders = NonNullable<GetCustomerQuery['customer']>;\r\n\r\n@Component({\r\n selector: 'vdr-customer-detail',\r\n templateUrl: './customer-detail.component.html',\r\n styleUrls: ['./customer-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerDetailComponent\r\n extends BaseDetailComponent<CustomerWithOrders>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n addressCustomFields: CustomFieldConfig[];\r\n availableCountries$: Observable<GetAvailableCountriesQuery['countries']['items']>;\r\n orders$: Observable<NonNullable<GetCustomerQuery['customer']>['orders']['items']>;\r\n ordersCount$: Observable<number>;\r\n history$: Observable<NonNullable<GetCustomerHistoryQuery['customer']>['history']['items'] | undefined>;\r\n fetchHistory = new Subject<void>();\r\n defaultShippingAddressId: string;\r\n defaultBillingAddressId: string;\r\n addressesToDeleteIds = new Set<string>();\r\n addressDefaultsUpdated = false;\r\n ordersPerPage = 10;\r\n currentOrdersPage = 1;\r\n private orderListUpdates$ = new Subject<CustomerWithOrders>();\r\n\r\n constructor(\r\n route: ActivatedRoute,\r\n router: Router,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n private formBuilder: FormBuilder,\r\n protected dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n\r\n this.customFields = this.getCustomFieldConfig('Customer');\r\n this.addressCustomFields = this.getCustomFieldConfig('Address');\r\n this.detailForm = this.formBuilder.group({\r\n customer: this.formBuilder.group({\r\n title: '',\r\n firstName: ['', Validators.required],\r\n lastName: ['', Validators.required],\r\n phoneNumber: '',\r\n emailAddress: ['', [Validators.required, Validators.email]],\r\n password: '',\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n addresses: new FormArray([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.availableCountries$ = this.dataService.settings\r\n .getAvailableCountries()\r\n .mapSingle(result => result.countries.items)\r\n .pipe(shareReplay(1));\r\n\r\n const customerWithUpdates$ = this.entity$.pipe(merge(this.orderListUpdates$));\r\n this.orders$ = customerWithUpdates$.pipe(map(customer => customer.orders.items));\r\n this.ordersCount$ = this.entity$.pipe(map(customer => customer.orders.totalItems));\r\n this.history$ = this.fetchHistory.pipe(\r\n startWith(null),\r\n switchMap(() => {\r\n return this.dataService.customer\r\n .getCustomerHistory(this.id, {\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n })\r\n .mapStream(data => data.customer?.history.items);\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n this.orderListUpdates$.complete();\r\n }\r\n\r\n getAddressFormControls(): FormControl[] {\r\n const formArray = this.detailForm.get(['addresses']) as FormArray;\r\n return formArray.controls as FormControl[];\r\n }\r\n\r\n setDefaultBillingAddressId(id: string) {\r\n this.defaultBillingAddressId = id;\r\n this.addressDefaultsUpdated = true;\r\n }\r\n\r\n setDefaultShippingAddressId(id: string) {\r\n this.defaultShippingAddressId = id;\r\n this.addressDefaultsUpdated = true;\r\n }\r\n\r\n toggleDeleteAddress(id: string) {\r\n if (this.addressesToDeleteIds.has(id)) {\r\n this.addressesToDeleteIds.delete(id);\r\n } else {\r\n this.addressesToDeleteIds.add(id);\r\n }\r\n }\r\n\r\n addAddress() {\r\n const addressFormArray = this.detailForm.get('addresses') as FormArray;\r\n const newAddress = this.formBuilder.group({\r\n fullName: '',\r\n company: '',\r\n streetLine1: ['', Validators.required],\r\n streetLine2: '',\r\n city: '',\r\n province: '',\r\n postalCode: '',\r\n countryCode: ['', Validators.required],\r\n phoneNumber: '',\r\n defaultShippingAddress: false,\r\n defaultBillingAddress: false,\r\n });\r\n if (this.addressCustomFields.length) {\r\n const customFieldsGroup = this.formBuilder.group({});\r\n for (const fieldDef of this.addressCustomFields) {\r\n customFieldsGroup.addControl(fieldDef.name, new FormControl(''));\r\n }\r\n newAddress.addControl('customFields', customFieldsGroup);\r\n }\r\n addressFormArray.push(newAddress);\r\n }\r\n\r\n setOrderItemsPerPage(itemsPerPage: number) {\r\n this.ordersPerPage = +itemsPerPage;\r\n this.fetchOrdersList();\r\n }\r\n\r\n setOrderCurrentPage(page: number) {\r\n this.currentOrdersPage = +page;\r\n this.fetchOrdersList();\r\n }\r\n\r\n create() {\r\n const customerForm = this.detailForm.get('customer');\r\n if (!customerForm) {\r\n return;\r\n }\r\n const formValue = customerForm.value;\r\n const customFields = customerForm.get('customFields')?.value;\r\n const customer: CreateCustomerInput = {\r\n title: formValue.title,\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n phoneNumber: formValue.phoneNumber,\r\n customFields,\r\n };\r\n this.dataService.customer\r\n .createCustomer(customer, formValue.password)\r\n .subscribe(({ createCustomer }) => {\r\n switch (createCustomer.__typename) {\r\n case 'Customer':\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Customer',\r\n });\r\n if (createCustomer.emailAddress && !formValue.password) {\r\n this.notificationService.notify({\r\n message: _('customer.email-verification-sent'),\r\n translationVars: { emailAddress: formValue.emailAddress },\r\n type: 'info',\r\n duration: 10000,\r\n });\r\n }\r\n this.detailForm.markAsPristine();\r\n this.addressDefaultsUpdated = false;\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', createCustomer.id], { relativeTo: this.route });\r\n break;\r\n case 'EmailAddressConflictError':\r\n this.notificationService.error(createCustomer.message);\r\n }\r\n });\r\n }\r\n\r\n save() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(({ id }) => {\r\n const saveOperations: Array<\r\n Observable<\r\n | UpdateCustomerMutation['updateCustomer']\r\n | CreateCustomerAddressMutation['createCustomerAddress']\r\n | UpdateCustomerAddressMutation['updateCustomerAddress']\r\n | DeleteCustomerAddressMutation['deleteCustomerAddress']\r\n >\r\n > = [];\r\n const customerForm = this.detailForm.get('customer');\r\n if (customerForm && customerForm.dirty) {\r\n const formValue = customerForm.value;\r\n const customFields = customerForm.get('customFields')?.value;\r\n const customer: UpdateCustomerInput = {\r\n id,\r\n title: formValue.title,\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n phoneNumber: formValue.phoneNumber,\r\n customFields,\r\n };\r\n saveOperations.push(\r\n this.dataService.customer\r\n .updateCustomer(customer)\r\n .pipe(map(res => res.updateCustomer)),\r\n );\r\n }\r\n const addressFormArray = this.detailForm.get('addresses') as FormArray;\r\n if ((addressFormArray && addressFormArray.dirty) || this.addressDefaultsUpdated) {\r\n for (const addressControl of addressFormArray.controls) {\r\n if (addressControl.dirty || this.addressDefaultsUpdated) {\r\n const address = addressControl.value;\r\n const input: CreateAddressInput = {\r\n fullName: address.fullName,\r\n company: address.company,\r\n streetLine1: address.streetLine1,\r\n streetLine2: address.streetLine2,\r\n city: address.city,\r\n province: address.province,\r\n postalCode: address.postalCode,\r\n countryCode: address.countryCode,\r\n phoneNumber: address.phoneNumber,\r\n defaultShippingAddress: this.defaultShippingAddressId === address.id,\r\n defaultBillingAddress: this.defaultBillingAddressId === address.id,\r\n customFields: address.customFields,\r\n };\r\n if (!address.id) {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .createCustomerAddress(id, input)\r\n .pipe(map(res => res.createCustomerAddress)),\r\n );\r\n } else {\r\n if (this.addressesToDeleteIds.has(address.id)) {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .deleteCustomerAddress(address.id)\r\n .pipe(map(res => res.deleteCustomerAddress)),\r\n );\r\n } else {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .updateCustomerAddress({\r\n ...input,\r\n id: address.id,\r\n })\r\n .pipe(map(res => res.updateCustomerAddress)),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return forkJoin(saveOperations);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n let notified = false;\r\n for (const result of data) {\r\n switch (result.__typename) {\r\n case 'Customer':\r\n case 'Address':\r\n case 'Success':\r\n if (!notified) {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Customer',\r\n });\r\n notified = true;\r\n this.detailForm.markAsPristine();\r\n this.addressDefaultsUpdated = false;\r\n this.changeDetector.markForCheck();\r\n this.fetchHistory.next();\r\n this.dataService.customer.getCustomer(this.id).single$.subscribe();\r\n }\r\n break;\r\n case 'EmailAddressConflictError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Customer',\r\n });\r\n },\r\n );\r\n }\r\n\r\n addToGroup() {\r\n this.modalService\r\n .fromComponent(SelectCustomerGroupDialogComponent, {\r\n size: 'md',\r\n })\r\n .pipe(\r\n switchMap(groupIds => (groupIds ? from(groupIds) : EMPTY)),\r\n concatMap(groupId => this.dataService.customer.addCustomersToGroup(groupId, [this.id])),\r\n )\r\n .subscribe({\r\n next: res => {\r\n this.notificationService.success(_(`customer.add-customers-to-group-success`), {\r\n customerCount: 1,\r\n groupName: res.addCustomersToGroup.name,\r\n });\r\n },\r\n complete: () => {\r\n this.dataService.customer.getCustomer(this.id, { take: 0 }).single$.subscribe();\r\n this.fetchHistory.next();\r\n },\r\n });\r\n }\r\n\r\n removeFromGroup(group: NonNullable<GetCustomerQuery['customer']>['groups'][number]) {\r\n this.modalService\r\n .dialog({\r\n title: _('customer.confirm-remove-customer-from-group'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? this.dataService.customer.removeCustomersFromGroup(group.id, [this.id])\r\n : EMPTY,\r\n ),\r\n switchMap(() => this.dataService.customer.getCustomer(this.id, { take: 0 }).single$),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_(`customer.remove-customers-from-group-success`), {\r\n customerCount: 1,\r\n groupName: group.name,\r\n });\r\n this.fetchHistory.next();\r\n });\r\n }\r\n\r\n addNoteToCustomer({ note }: { note: string }) {\r\n this.dataService.customer.addNoteToCustomer(this.id, note).subscribe(() => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n updateNote(entry: HistoryEntry) {\r\n this.modalService\r\n .fromComponent(EditNoteDialogComponent, {\r\n closable: true,\r\n locals: {\r\n displayPrivacyControls: false,\r\n note: entry.data.note,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.customer.updateCustomerNote({\r\n noteId: entry.id,\r\n note: result.note,\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n deleteNote(entry: HistoryEntry) {\r\n return this.modalService\r\n .dialog({\r\n title: _('common.confirm-delete-note'),\r\n body: entry.data.note,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(switchMap(res => (res ? this.dataService.customer.deleteCustomerNote(entry.id) : EMPTY)))\r\n .subscribe(() => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n protected setFormValues(entity: CustomerWithOrders): void {\r\n const customerGroup = this.detailForm.get('customer');\r\n if (customerGroup) {\r\n customerGroup.patchValue({\r\n title: entity.title,\r\n firstName: entity.firstName,\r\n lastName: entity.lastName,\r\n phoneNumber: entity.phoneNumber,\r\n emailAddress: entity.emailAddress,\r\n });\r\n }\r\n\r\n if (entity.addresses) {\r\n const addressesArray = new FormArray([]);\r\n for (const address of entity.addresses) {\r\n const { customFields, ...rest } = address as any;\r\n const addressGroup = this.formBuilder.group({\r\n ...rest,\r\n countryCode: address.country.code,\r\n });\r\n addressesArray.push(addressGroup);\r\n if (address.defaultShippingAddress) {\r\n this.defaultShippingAddressId = address.id;\r\n }\r\n if (address.defaultBillingAddress) {\r\n this.defaultBillingAddressId = address.id;\r\n }\r\n\r\n if (this.addressCustomFields.length) {\r\n const customFieldsGroup = this.formBuilder.group({});\r\n for (const fieldDef of this.addressCustomFields) {\r\n const key = fieldDef.name;\r\n const value = (address as any).customFields?.[key];\r\n const control = new FormControl(value);\r\n customFieldsGroup.addControl(key, control);\r\n }\r\n addressGroup.addControl('customFields', customFieldsGroup);\r\n }\r\n }\r\n this.detailForm.setControl('addresses', addressesArray);\r\n }\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customer', 'customFields']),\r\n entity,\r\n );\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n /**\r\n * Refetch the customer with the current order list settings.\r\n */\r\n private fetchOrdersList() {\r\n this.dataService.customer\r\n .getCustomer(this.id, {\r\n take: this.ordersPerPage,\r\n skip: (this.currentOrdersPage - 1) * this.ordersPerPage,\r\n })\r\n .single$.pipe(\r\n map(data => data.customer),\r\n filter(notNullOrUndefined),\r\n )\r\n .subscribe(result => this.orderListUpdates$.next(result));\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <span *ngIf=\"group.id\">{{ 'customer.update-customer-group' | translate }}</span>\r\n <span *ngIf=\"!group.id\">{{ 'customer.create-customer-group' | translate }}</span>\r\n</ng-template>\r\n<form [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['CreateCustomerGroup', 'UpdateCustomerGroup'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\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=\"CustomerGroup\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"form.get('customFields')\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n</form>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"save()\" [disabled]=\"!form.valid\" class=\"btn btn-primary\">\r\n <span *ngIf=\"group.id\">{{ 'customer.update-customer-group' | translate }}</span>\r\n <span *ngIf=\"!group.id\">{{ 'customer.create-customer-group' | translate }}</span>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n CreateCustomerGroupInput,\r\n CustomFieldConfig,\r\n Dialog,\r\n ServerConfigService,\r\n UpdateCustomerGroupInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-detail-dialog',\r\n templateUrl: './customer-group-detail-dialog.component.html',\r\n styleUrls: ['./customer-group-detail-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupDetailDialogComponent implements Dialog<CreateCustomerGroupInput>, OnInit {\r\n group: { id?: string; name: string; customFields?: { [name: string]: any } };\r\n resolveWith: (result?: CreateCustomerGroupInput) => void;\r\n customFields: CustomFieldConfig[];\r\n form: FormGroup;\r\n\r\n constructor(private serverConfigService: ServerConfigService, private formBuilder: FormBuilder) {\r\n this.customFields = this.serverConfigService.getCustomFieldsFor('CustomerGroup');\r\n }\r\n\r\n ngOnInit() {\r\n this.form = this.formBuilder.group({\r\n name: [this.group.name, Validators.required],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n if (this.customFields.length) {\r\n const customFieldsGroup = this.form.get('customFields') as FormGroup;\r\n\r\n for (const fieldDef of this.customFields) {\r\n const key = fieldDef.name;\r\n const value = this.group.customFields?.[key];\r\n const control = customFieldsGroup.get(key);\r\n if (control) {\r\n control.patchValue(value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n save() {\r\n this.resolveWith(this.form.value);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left> </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-group-list\"></vdr-action-bar-items>\r\n <button class=\"btn btn-primary\" *vdrIfPermissions=\"'CreateCustomerGroup'\" (click)=\"create()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-customer-group' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<div class=\"group-wrapper\">\r\n <div class=\"group-list\">\r\n <table\r\n class=\"table mt0\"\r\n [class.expanded]=\"activeGroup$ | async\"\r\n *ngIf=\"!(listIsEmpty$ | async); else emptyPlaceholder\"\r\n >\r\n <tbody>\r\n <tr\r\n *ngFor=\"let group of groups$ | async\"\r\n [class.active]=\"group.id === (activeGroup$ | async)?.id\"\r\n >\r\n <td class=\"left align-middle\"><vdr-entity-info [entity]=\"group\"></vdr-entity-info></td>\r\n <td class=\"left align-middle\">\r\n <vdr-chip [colorFrom]=\"group.id\">{{ group.name }}</vdr-chip>\r\n </td>\r\n <td class=\"text-right align-middle\">\r\n <a\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['./', { contents: group.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'customer.view-group-members' | translate }}\r\n </a>\r\n </td>\r\n <td class=\"align-middle\">\r\n <button class=\"btn btn-link btn-sm\" (click)=\"update(group)\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n </td>\r\n <td class=\"align-middle\">\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 class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"delete(group.id)\"\r\n [disabled]=\"!('DeleteCustomerGroup' | hasPermission)\"\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 </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <ng-template #emptyPlaceholder>\r\n <vdr-empty-placeholder></vdr-empty-placeholder>\r\n </ng-template>\r\n <div class=\"group-members\" [class.expanded]=\"activeGroup$ | async\">\r\n <ng-container *ngIf=\"activeGroup$ | async as activeGroup\">\r\n <div class=\"flex\">\r\n <div class=\"header-title-row\">{{ activeGroup.name }} ({{ membersTotal$ | async }})</div>\r\n <div class=\"flex-spacer\"></div>\r\n <button type=\"button\" class=\"close-button\" (click)=\"closeMembers()\">\r\n <clr-icon shape=\"close\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"controls\">\r\n <vdr-dropdown>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary btn-sm\"\r\n vdrDropdownTrigger\r\n [disabled]=\"selectedCustomerIds.length === 0\"\r\n >\r\n {{ 'common.with-selected' | 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)=\"removeFromGroup(activeGroup, selectedCustomerIds)\"\r\n vdrDropdownItem\r\n [disabled]=\"!('UpdateCustomerGroup' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'customer.remove-from-group' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n <button class=\"btn btn-secondary btn-sm\" (click)=\"addToGroup(activeGroup)\">\r\n {{ 'customer.add-customers-to-group' | translate: { groupName: activeGroup.name } }}\r\n </button>\r\n </div>\r\n <vdr-customer-group-member-list\r\n [members]=\"members$ | async\"\r\n [route]=\"route\"\r\n [totalItems]=\"membersTotal$ | async\"\r\n [selectedMemberIds]=\"selectedCustomerIds\"\r\n (selectionChange)=\"selectedCustomerIds = $event\"\r\n (fetchParamsChange)=\"fetchGroupMembers$.next($event)\"\r\n ></vdr-customer-group-member-list>\r\n </ng-container>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n DeletionResult,\r\n GetCustomerGroupsQuery,\r\n GetCustomerGroupWithCustomersQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, EMPTY, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, mapTo, switchMap, tap } from 'rxjs/operators';\r\n\r\nimport { AddCustomerToGroupDialogComponent } from '../add-customer-to-group-dialog/add-customer-to-group-dialog.component';\r\nimport { CustomerGroupDetailDialogComponent } from '../customer-group-detail-dialog/customer-group-detail-dialog.component';\r\nimport { CustomerGroupMemberFetchParams } from '../customer-group-member-list/customer-group-member-list.component';\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-list',\r\n templateUrl: './customer-group-list.component.html',\r\n styleUrls: ['./customer-group-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupListComponent implements OnInit {\r\n activeGroup$: Observable<ItemOf<GetCustomerGroupsQuery, 'customerGroups'> | undefined>;\r\n groups$: Observable<Array<ItemOf<GetCustomerGroupsQuery, 'customerGroups'>>>;\r\n listIsEmpty$: Observable<boolean>;\r\n members$: Observable<\r\n NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>['customers']['items']\r\n >;\r\n membersTotal$: Observable<number>;\r\n selectedCustomerIds: string[] = [];\r\n fetchGroupMembers$ = new BehaviorSubject<CustomerGroupMemberFetchParams>({\r\n skip: 0,\r\n take: 0,\r\n filterTerm: '',\r\n });\r\n private refreshActiveGroupMembers$ = new BehaviorSubject<void>(undefined);\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n public route: ActivatedRoute,\r\n private router: Router,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.groups$ = this.dataService.customer\r\n .getCustomerGroupList()\r\n .mapStream(data => data.customerGroups.items);\r\n const activeGroupId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n tap(() => (this.selectedCustomerIds = [])),\r\n );\r\n this.listIsEmpty$ = this.groups$.pipe(map(groups => groups.length === 0));\r\n this.activeGroup$ = combineLatest(this.groups$, activeGroupId$).pipe(\r\n map(([groups, activeGroupId]) => {\r\n if (activeGroupId) {\r\n return groups.find(g => g.id === activeGroupId);\r\n }\r\n }),\r\n );\r\n const membersResult$ = combineLatest(\r\n this.activeGroup$,\r\n this.fetchGroupMembers$,\r\n this.refreshActiveGroupMembers$,\r\n ).pipe(\r\n switchMap(([activeGroup, { skip, take, filterTerm }]) => {\r\n if (activeGroup) {\r\n return this.dataService.customer\r\n .getCustomerGroupWithCustomers(activeGroup.id, {\r\n skip,\r\n take,\r\n filter: {\r\n emailAddress: {\r\n contains: filterTerm,\r\n },\r\n },\r\n })\r\n .mapStream(res => res.customerGroup?.customers);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n );\r\n\r\n this.members$ = membersResult$.pipe(map(res => res?.items ?? []));\r\n this.membersTotal$ = membersResult$.pipe(map(res => res?.totalItems ?? 0));\r\n }\r\n\r\n create() {\r\n this.modalService\r\n .fromComponent(CustomerGroupDetailDialogComponent, { locals: { group: { name: '' } } })\r\n .pipe(\r\n switchMap(result =>\r\n result\r\n ? this.dataService.customer.createCustomerGroup({ ...result, customerIds: [] })\r\n : EMPTY,\r\n ),\r\n // refresh list\r\n switchMap(() => this.dataService.customer.getCustomerGroupList().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n delete(groupId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('customer.confirm-delete-customer-group'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response ? this.dataService.customer.deleteCustomerGroup(groupId) : EMPTY,\r\n ),\r\n\r\n switchMap(result => {\r\n if (result.deleteCustomerGroup.result === DeletionResult.DELETED) {\r\n // refresh list\r\n return this.dataService.customer\r\n .getCustomerGroupList()\r\n .mapSingle(() => ({ errorMessage: false }));\r\n } else {\r\n return of({ errorMessage: result.deleteCustomerGroup.message });\r\n }\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n if (typeof result.errorMessage === 'string') {\r\n this.notificationService.error(result.errorMessage);\r\n } else {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n update(group: ItemOf<GetCustomerGroupsQuery, 'customerGroups'>) {\r\n this.modalService\r\n .fromComponent(CustomerGroupDetailDialogComponent, { locals: { group } })\r\n .pipe(\r\n switchMap(result =>\r\n result\r\n ? this.dataService.customer.updateCustomerGroup({ id: group.id, ...result })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n closeMembers() {\r\n const params = { ...this.route.snapshot.params };\r\n delete params.contents;\r\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\r\n }\r\n\r\n addToGroup(group: NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>) {\r\n this.modalService\r\n .fromComponent(AddCustomerToGroupDialogComponent, {\r\n locals: {\r\n group,\r\n route: this.route,\r\n },\r\n size: 'md',\r\n verticalAlign: 'top',\r\n })\r\n .pipe(\r\n switchMap(customerIds =>\r\n customerIds\r\n ? this.dataService.customer\r\n .addCustomersToGroup(group.id, customerIds)\r\n .pipe(mapTo(customerIds))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe({\r\n next: result => {\r\n this.notificationService.success(_(`customer.add-customers-to-group-success`), {\r\n customerCount: result.length,\r\n groupName: group.name,\r\n });\r\n this.refreshActiveGroupMembers$.next();\r\n this.selectedCustomerIds = [];\r\n },\r\n });\r\n }\r\n\r\n removeFromGroup(\r\n group: NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>,\r\n customerIds: string[],\r\n ) {\r\n this.dataService.customer.removeCustomersFromGroup(group.id, customerIds).subscribe({\r\n complete: () => {\r\n this.notificationService.success(_(`customer.remove-customers-from-group-success`), {\r\n customerCount: customerIds.length,\r\n groupName: group.name,\r\n });\r\n this.refreshActiveGroupMembers$.next();\r\n this.selectedCustomerIds = [];\r\n },\r\n });\r\n }\r\n}\r\n","<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","import { Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n GetCustomerListQuery,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { SortOrder } from '@vendure/common/lib/generated-shop-types';\r\nimport { EMPTY } from 'rxjs';\r\nimport { debounceTime, filter, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-customer-list',\r\n templateUrl: './customer-list.component.html',\r\n styleUrls: ['./customer-list.component.scss'],\r\n})\r\nexport class CustomerListComponent\r\n extends BaseListComponent<GetCustomerListQuery, ItemOf<GetCustomerListQuery, 'customers'>>\r\n implements OnInit\r\n{\r\n searchTerm = new FormControl('');\r\n constructor(\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.customer.getCustomerList(...args).refetchOnChannelChange(),\r\n data => data.customers,\r\n (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n emailAddress: {\r\n contains: this.searchTerm.value,\r\n },\r\n lastName: {\r\n contains: this.searchTerm.value,\r\n },\r\n postalCode: {\r\n contains: this.searchTerm.value,\r\n },\r\n },\r\n filterOperator: LogicalOperator.OR,\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n },\r\n }),\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.searchTerm.valueChanges\r\n .pipe(\r\n filter(value => 2 < value.length || value.length === 0),\r\n debounceTime(250),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n deleteCustomer(customer: ItemOf<GetCustomerListQuery, 'customers'>) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-customer'),\r\n body: `${customer.firstName} ${customer.lastName}`,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(switchMap(res => (res ? this.dataService.customer.deleteCustomer(customer.id) : EMPTY)))\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Customer',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Customer',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, CustomerFragment, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomerResolver extends BaseEntityResolver<CustomerFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Customer',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n title: '',\r\n firstName: '',\r\n lastName: '',\r\n emailAddress: '',\r\n phoneNumber: null,\r\n addresses: null,\r\n user: null,\r\n },\r\n id => dataService.customer.getCustomer(id).mapStream(data => data.customer),\r\n );\r\n }\r\n}\r\n","import { Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n CustomerFragment,\r\n detailBreadcrumb,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { CustomerDetailComponent } from './components/customer-detail/customer-detail.component';\r\nimport { CustomerGroupListComponent } from './components/customer-group-list/customer-group-list.component';\r\nimport { CustomerListComponent } from './components/customer-list/customer-list.component';\r\nimport { CustomerResolver } from './providers/routing/customer-resolver';\r\n\r\nexport const customerRoutes: Route[] = [\r\n {\r\n path: 'customers',\r\n component: CustomerListComponent,\r\n pathMatch: '',\r\n data: {\r\n breadcrumb: _('breadcrumb.customers'),\r\n },\r\n },\r\n {\r\n path: 'customers/:id',\r\n component: CustomerDetailComponent,\r\n resolve: createResolveData(CustomerResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: customerBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'groups',\r\n component: CustomerGroupListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.customer-groups'),\r\n },\r\n },\r\n];\r\n\r\nexport function customerBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<CustomerFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.customers',\r\n getName: customer => `${customer.firstName} ${customer.lastName}`,\r\n route: 'customers',\r\n });\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SharedModule } from '@vendure/admin-ui/core';\r\n\r\nimport { AddCustomerToGroupDialogComponent } from './components/add-customer-to-group-dialog/add-customer-to-group-dialog.component';\r\nimport { AddressCardComponent } from './components/address-card/address-card.component';\r\nimport { AddressDetailDialogComponent } from './components/address-detail-dialog/address-detail-dialog.component';\r\nimport { CustomerDetailComponent } from './components/customer-detail/customer-detail.component';\r\nimport { CustomerGroupDetailDialogComponent } from './components/customer-group-detail-dialog/customer-group-detail-dialog.component';\r\nimport { CustomerGroupListComponent } from './components/customer-group-list/customer-group-list.component';\r\nimport { CustomerGroupMemberListComponent } from './components/customer-group-member-list/customer-group-member-list.component';\r\nimport { CustomerHistoryComponent } from './components/customer-history/customer-history.component';\r\nimport { CustomerListComponent } from './components/customer-list/customer-list.component';\r\nimport { CustomerStatusLabelComponent } from './components/customer-status-label/customer-status-label.component';\r\nimport { SelectCustomerGroupDialogComponent } from './components/select-customer-group-dialog/select-customer-group-dialog.component';\r\nimport { customerRoutes } from './customer.routes';\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild(customerRoutes)],\r\n declarations: [\r\n CustomerListComponent,\r\n CustomerDetailComponent,\r\n CustomerStatusLabelComponent,\r\n AddressCardComponent,\r\n CustomerGroupListComponent,\r\n CustomerGroupDetailDialogComponent,\r\n AddCustomerToGroupDialogComponent,\r\n CustomerGroupMemberListComponent,\r\n SelectCustomerGroupDialogComponent,\r\n CustomerHistoryComponent,\r\n AddressDetailDialogComponent,\r\n ],\r\n exports: [AddressCardComponent],\r\n})\r\nexport class CustomerModule {}\r\n"],"sourceRoot":"webpack:///","file":"600.8f0165a8d1255cd0.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkvendure_admin=self.webpackChunkvendure_admin||[]).push([[625],{2625:(T,u,r)=>{r.r(u),r.d(u,{LoginComponent:()=>g,LoginGuard:()=>l,LoginModule:()=>p,loginRoutes:()=>h});var a=r(279),e=r(3184),m=r(9720),s=r(587),c=r(2748),f=r(7890),v=r(6362),C=r(7514);function M(o,t){1&o&&(e.TgZ(0,"span"),e._uU(1,"-"),e.qZA())}function b(o,t){if(1&o&&(e.TgZ(0,"span"),e._uU(1),e.YNc(2,M,2,0,"span",12),e.qZA()),2&o){const n=e.oxw();e.xp6(1),e.hij("",n.brand," "),e.xp6(1),e.Q6J("ngIf",!n.hideVendureBranding||!n.hideVersion)}}function x(o,t){1&o&&(e.TgZ(0,"span"),e._uU(1,"vendure"),e.qZA())}function Z(o,t){if(1&o&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&o){const n=e.oxw();e.xp6(1),e.hij("v",n.version,"")}}class g{constructor(t,n){this.authService=t,this.router=n,this.username="",this.password="",this.rememberMe=!1,this.version=a.s5M,this.brand=(0,a.hq7)().brand,this.hideVendureBranding=(0,a.hq7)().hideVendureBranding,this.hideVersion=(0,a.hq7)().hideVersion}logIn(){this.errorMessage=void 0,this.authService.logIn(this.username,this.password,this.rememberMe).subscribe(t=>{switch(t.__typename){case"CurrentUser":const n=this.getRedirectRoute();this.router.navigateByUrl(n||"/");break;case"InvalidCredentialsError":case"NativeAuthStrategyError":this.errorMessage=t.message}})}getRedirectRoute(){let t;const n=new RegExp(`${a.ONw}=(.*)`);try{const i=window.location.search.match(n);i&&1<i.length&&(t=atob(decodeURIComponent(i[1])))}catch(i){}return t}}g.\u0275fac=function(t){return new(t||g)(e.Y36(a.e80),e.Y36(m.F0))},g.\u0275cmp=e.Xpm({type:g,selectors:[["vdr-login"]],decls:25,vars:24,consts:[[1,"login-wrapper"],[1,"login"],[1,"title"],["src","assets/logo-300px.png"],[1,"login-group"],["type","text","name","username","id","login_username",1,"username",3,"ngModel","placeholder","ngModelChange"],["name","password","type","password","id","login_password",1,"password",3,"ngModel","placeholder","ngModelChange"],[1,"login-error",3,"clrAlertType","clrAlertClosable"],[1,"alert-text"],["type","checkbox","clrCheckbox","","id","rememberme","name","rememberme",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn-primary",3,"disabled","click"],[1,"version"],[4,"ngIf"]],template:function(t,n){1&t&&(e.TgZ(0,"div",0)(1,"form",1)(2,"label",2),e._UZ(3,"img",3),e.qZA(),e.TgZ(4,"div",4)(5,"input",5),e.NdJ("ngModelChange",function(d){return n.username=d}),e.ALo(6,"translate"),e.qZA(),e.TgZ(7,"input",6),e.NdJ("ngModelChange",function(d){return n.password=d}),e.ALo(8,"translate"),e.qZA(),e.TgZ(9,"clr-alert",7)(10,"clr-alert-item")(11,"span",8),e._uU(12),e.qZA()()(),e.TgZ(13,"clr-checkbox-wrapper")(14,"input",9),e.NdJ("ngModelChange",function(d){return n.rememberMe=d}),e.qZA(),e.TgZ(15,"label"),e._uU(16),e.ALo(17,"translate"),e.qZA()(),e.TgZ(18,"button",10),e.NdJ("click",function(){return n.logIn()}),e._uU(19),e.ALo(20,"translate"),e.qZA()(),e.TgZ(21,"div",11),e.YNc(22,b,3,2,"span",12),e.YNc(23,x,2,0,"span",12),e.YNc(24,Z,2,1,"span",12),e.qZA()()()),2&t&&(e.xp6(5),e.Q6J("ngModel",n.username)("placeholder",e.lcZ(6,16,"common.username")),e.xp6(2),e.Q6J("ngModel",n.password)("placeholder",e.lcZ(8,18,"common.password")),e.xp6(2),e.ekj("visible",n.errorMessage),e.Q6J("clrAlertType","danger")("clrAlertClosable",!1),e.xp6(3),e.hij(" ",n.errorMessage," "),e.xp6(2),e.Q6J("ngModel",n.rememberMe),e.xp6(2),e.Oqu(e.lcZ(17,20,"common.remember-me")),e.xp6(2),e.Q6J("disabled",!n.username||!n.password),e.xp6(1),e.hij(" ",e.lcZ(20,22,"common.login")," "),e.xp6(3),e.Q6J("ngIf",n.brand),e.xp6(1),e.Q6J("ngIf",!n.hideVendureBranding),e.xp6(1),e.Q6J("ngIf",!n.hideVersion))},directives:[s._Y,s.JL,s.F,c.MgK,f.y,s.Fj,s.JJ,s.On,c.TIm,c.CyW,c.I9z,c.PEh,s.Wl,c.KKC,v.O5],pipes:[C.X$],styles:[".login-wrapper[_ngcontent-%COMP%]{background:var(--login-page-bg);background-size:auto;justify-content:center}.title[_ngcontent-%COMP%]{text-align:center}.version[_ngcontent-%COMP%]{flex:1;display:flex;align-items:flex-end;justify-content:center;color:var(--color-grey-300)}.version[_ngcontent-%COMP%] span[_ngcontent-%COMP%] + span[_ngcontent-%COMP%]{margin-left:5px}.login-error[_ngcontent-%COMP%]{max-height:0;overflow:hidden}.login-error.visible[_ngcontent-%COMP%]{max-height:46px;transition:max-height .2s;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation-delay:.2s;transform:translate(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;perspective:1000px}@keyframes shake{10%,90%{transform:translate(-1px)}20%,80%{transform:translate(2px)}30%,50%,70%{transform:translate(-4px)}40%,60%{transform:translate(4px)}}"]});var y=r(635);class l{constructor(t,n){this.router=t,this.authService=n}canActivate(t){return this.authService.checkAuthenticatedStatus().pipe((0,y.U)(n=>(n&&this.router.navigate(["/"]),!n)))}}l.\u0275fac=function(t){return new(t||l)(e.LFG(m.F0),e.LFG(a.e80))},l.\u0275prov=e.Yz7({token:l,factory:l.\u0275fac,providedIn:"root"});const h=[{path:"",component:g,pathMatch:"full",canActivate:[l]}];class p{}p.\u0275fac=function(t){return new(t||p)},p.\u0275mod=e.oAB({type:p}),p.\u0275inj=e.cJS({imports:[[a.m81,m.Bz.forChild(h)]]})}}]);
|
|
2
|
-
//# sourceMappingURL=625.adebc6a7222bde82.js.map
|