@vendure/admin-ui-plugin 2.0.0-next.20 → 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/{26.d4121b2f19189eb7.js → 26.5cc3bfffe8943e16.js} +2 -2
- package/lib/admin-ui/26.5cc3bfffe8943e16.js.map +1 -0
- package/lib/admin-ui/index.html +1 -1
- package/lib/admin-ui/main.65109179713dd228.js +2944 -0
- package/lib/admin-ui/main.65109179713dd228.js.map +1 -0
- package/lib/admin-ui/{runtime.03c9d901339d6844.js → runtime.28bd5da02a9b1f7b.js} +2 -2
- package/lib/admin-ui/{runtime.03c9d901339d6844.js.map → runtime.28bd5da02a9b1f7b.js.map} +1 -1
- package/package.json +4 -4
- package/lib/admin-ui/26.d4121b2f19189eb7.js.map +0 -1
- package/lib/admin-ui/main.b70cff0822881967.js +0 -2944
- package/lib/admin-ui/main.b70cff0822881967.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["constructor","n","Y","e","selectors","$","this","selectedMemberIds","indexOf","id","filteredMembers","filterTerm","toLocaleLowerCase","members","filter","t","name","includes","code","areAllSelected","length","toggleSelectAll","selectionChange","emit","map","toggleSelectMember","item","j","cancel","add","ngOnInit","currentMembers","availableCountries$","dataService","settings","getCountries","mapStream","countries","items","pipe","L","i","resolveWith","re","oxw","toggleAll","setPermission","buildGrid","readonly","permissionChange","permission","value","some","activePermissions","Map","r","l","permissionDefinitions","test","h","match","f","get","push","set","assignable","gridData","label","description","permissions","Array","from","entries","d","extractCrudDescription","replace","z","create","save","s","super","customFields","getCustomFieldConfig","detailForm","formBuilder","group","emailAddress","a","firstName","lastName","password","roles","reduce","y","Object","getAvailableChannels","values","selectedRolePermissions","init","administrator$","entity$","allRoles$","administrator","getRoles","se","client","userStatus","single$","subscribe","disable","serverConfigService","getPermissionDefinitions","ngOnDestroy","destroy","rolesChanged","buildPermissionsMap","getPermissionsForSelectedChannel","selectedChannelId","channelId","roleIds","createAdministrator","notificationService","success","entity","markAsPristine","changeDetector","markForCheck","router","navigate","relativeTo","route","error","F","updateAdministrator","setFormValues","patchValue","user","setCustomFieldFormValues","setValidators","channels","Set","forEach","keys","has","channelCode","ae","deleteAdministrator","setQueryFn","getAdministrators","administrators","modalService","dialog","title","c","body","buttons","type","returnValue","J","refresh","le","token","pricesIncludeTax","currencyCode","defaultShippingZoneId","defaultLanguageCode","defaultTaxZoneId","zones$","getZones","mapSingle","zones","availableLanguageCodes$","getAvailableLanguages","saveButtonEnabled","dirty","valid","createChannel","auth","currentUser","me","T","updateUserChannels","__typename","message","updateChannel","generateToken","defaultShippingZone","defaultTaxZone","Math","random","toString","substr","ce","deleteChannel","qe","channels$","refresh$","v","getChannels","isDefaultChannel","next","de","enabled","country$","w","languageCode$","translatable","updatedFields","customFieldConfig","languageCode","defaultTranslation","createCountry","updateCountry","deleteCountry","contentLanguage$","uiState","contentLanguage","searchTerm","valueChanges","countriesWithZones$","find","availableLanguages$","destroy$","complete","setLanguage","setContentLanguage","result","isZone","hasOwnProperty","ue","clear","call","availableLanguages","trackInventory","outOfStockThreshold","updateGlobalSettings","refreshGlobalSettings","globalSettings","pe","removeChecker","selectChecker","removeHandler","selectHandler","updateCode","checker","handler","getPaymentMethodOperations","checkers","paymentMethodEligibilityCheckers","handlers","paymentMethodHandlers","selectedCheckerDefinition","selectedHandlerDefinition","pristine","setValue","configArgsIsPopulated","controls","selectedChecker","clearValidators","updateValueAndValidity","onlySelf","markAsDirty","selectedHandler","createPaymentMethod","updatePaymentMethod","args","ge","deletePaymentMethod","getPaymentMethods","refetchOnChannelChange","paymentMethods","showModalAndDelete","_e","updateActiveAdministrator","he","channelIds","role$","kn","createRole","updateRole","detectChanges","fe","toggleDisplayLimit","deleteRole","visibleRoles$","items$","displayLimit","initialLimit","isDefaultRole","be","ve","updateQuantity","removeLine","subTotal","lines","unitPriceWithTax","quantity","loadFromLocalStorage","orderLinesChange","getActiveChannel","activeChannel","selectResult","addToLines","productVariantId","productVariantName","preview","productAsset","sku","priceWithTax","persistToLocalStorage","localStorageService","setForCurrentLocation","getForCurrentLocation","E","getAvailableCountries","city","countryCode","postalCode","province","addressChange","form","subscription","unsubscribe","H","selectCalculator","setTestOrderLines","setTestAddress","runTest","Ze","fulfillmentHandler","calculator","shippingMethod","getShippingMethodOperations","shippingEligibilityCheckers","calculators","shippingCalculators","fulfillmentHandlers","selectedCalculatorDefinition","activeChannel$","testResult$","fetchTestResult$","selectedCalculator","Ge","shippingAddress","streetLine1","testShippingMethod","eo","to","testDataUpdated","getUpdatedShippingMethod","createShippingMethod","updateShippingMethod","console","testOrderLines","testAddress","allTestDataPresent","fulfillmentHandlerCode","Ce","deleteShippingMethod","getShippingMethods","shippingMethods","testEligibleShippingMethods","ye","isDefault","taxCategory$","createTaxCategory","updateTaxCategory","xe","deleteTaxCategory","queryResult","getTaxCategories","taxCategories$","taxCategories","ref","refetch","Te","taxCategoryId","zoneId","customerGroupId","categoryId","createTaxRate","updateTaxRate","category","zone","customerGroup","Ae","deleteTaxRate","getTaxRates","taxRates","Le","getCustomFieldsFor","G","update","delete","closeMembers","addToZone","removeFromZone","data","paramMap","ui","activeZone$","fromComponent","locals","createZone","memberIds","deleteZone","errorMessage","updateZone","snapshot","params","contents","queryParamsHandling","zoneName","size","addMembersToZone","countryCount","removeMembersFromZone","Fe","createdAt","updatedAt","getAdministrator","V","factory","getChannel","channel","B","translations","getCountry","country","K","getGlobalSettings","W","getPaymentMethod","paymentMethod","X","getActiveAdministrator","activeAdministrator","ee","getRole","role","te","getShippingMethod","ne","getTaxCategory","taxCategory","oe","getTaxRate","taxRate","ie","Ke","path","component","resolve","canDeactivate","breadcrumb","We","Xe","et","tt","nt","ot","it","rt","o","breadcrumbKey","getName","Je","g"],"sources":["./src/lib/settings/src/components/zone-member-list/zone-member-controls.directive.ts","./src/lib/settings/src/components/zone-member-list/zone-member-list-header.directive.ts","./src/lib/settings/src/components/zone-member-list/zone-member-list.component.html","./src/lib/settings/src/components/zone-member-list/zone-member-list.component.ts","./src/lib/settings/src/components/add-country-to-zone-dialog/add-country-to-zone-dialog.component.html","./src/lib/settings/src/components/add-country-to-zone-dialog/add-country-to-zone-dialog.component.ts","./src/lib/settings/src/components/permission-grid/permission-grid.component.html","./src/lib/settings/src/components/permission-grid/permission-grid.component.ts","./src/lib/settings/src/components/admin-detail/admin-detail.component.html","./src/lib/settings/src/components/admin-detail/admin-detail.component.ts","./src/lib/settings/src/components/administrator-list/administrator-list.component.html","./src/lib/settings/src/components/administrator-list/administrator-list.component.ts","./src/lib/settings/src/components/channel-detail/channel-detail.component.html","./src/lib/settings/src/components/channel-detail/channel-detail.component.ts","./src/lib/settings/src/components/channel-list/channel-list.component.html","./src/lib/settings/src/components/channel-list/channel-list.component.ts","./src/lib/settings/src/components/country-detail/country-detail.component.html","./src/lib/settings/src/components/country-detail/country-detail.component.ts","./src/lib/settings/src/components/country-list/country-list.component.html","./src/lib/settings/src/components/country-list/country-list.component.ts","./src/lib/settings/src/components/global-settings/global-settings.component.html","./src/lib/settings/src/components/global-settings/global-settings.component.ts","./src/lib/settings/src/components/payment-method-detail/payment-method-detail.component.html","./src/lib/settings/src/components/payment-method-detail/payment-method-detail.component.ts","./src/lib/settings/src/components/payment-method-list/payment-method-list.component.html","./src/lib/settings/src/components/payment-method-list/payment-method-list.component.ts","./src/lib/settings/src/components/profile/profile.component.html","./src/lib/settings/src/components/profile/profile.component.ts","./src/lib/settings/src/components/role-detail/role-detail.component.html","./src/lib/settings/src/components/role-detail/role-detail.component.ts","./src/lib/settings/src/components/role-list/role-list.component.html","./src/lib/settings/src/components/role-list/role-list.component.ts","./src/lib/settings/src/components/shipping-eligibility-test-result/shipping-eligibility-test-result.component.html","./src/lib/settings/src/components/shipping-eligibility-test-result/shipping-eligibility-test-result.component.ts","./src/lib/settings/src/components/test-order-builder/test-order-builder.component.html","./src/lib/settings/src/components/test-order-builder/test-order-builder.component.ts","./src/lib/settings/src/components/test-address-form/test-address-form.component.html","./src/lib/settings/src/components/test-address-form/test-address-form.component.ts","./src/lib/settings/src/components/shipping-method-test-result/shipping-method-test-result.component.html","./src/lib/settings/src/components/shipping-method-test-result/shipping-method-test-result.component.ts","./src/lib/settings/src/components/shipping-method-detail/shipping-method-detail.component.html","./src/lib/settings/src/components/shipping-method-detail/shipping-method-detail.component.ts","./src/lib/settings/src/components/shipping-method-list/shipping-method-list.component.html","./src/lib/settings/src/components/shipping-method-list/shipping-method-list.component.ts","./src/lib/settings/src/components/tax-category-detail/tax-category-detail.component.html","./src/lib/settings/src/components/tax-category-detail/tax-category-detail.component.ts","./src/lib/settings/src/components/tax-category-list/tax-category-list.component.html","./src/lib/settings/src/components/tax-category-list/tax-category-list.component.ts","./src/lib/settings/src/components/tax-rate-detail/tax-rate-detail.component.html","./src/lib/settings/src/components/tax-rate-detail/tax-rate-detail.component.ts","./src/lib/settings/src/components/tax-rate-list/tax-rate-list.component.html","./src/lib/settings/src/components/tax-rate-list/tax-rate-list.component.ts","./src/lib/settings/src/components/zone-detail-dialog/zone-detail-dialog.component.html","./src/lib/settings/src/components/zone-detail-dialog/zone-detail-dialog.component.ts","./src/lib/settings/src/components/zone-list/zone-list.component.html","./src/lib/settings/src/components/zone-list/zone-list.component.ts","./src/lib/settings/src/providers/routing/administrator-resolver.ts","./src/lib/settings/src/providers/routing/channel-resolver.ts","./src/lib/settings/src/providers/routing/country-resolver.ts","./src/lib/settings/src/providers/routing/global-settings-resolver.ts","./src/lib/settings/src/providers/routing/payment-method-resolver.ts","./src/lib/settings/src/providers/routing/profile-resolver.ts","./src/lib/settings/src/providers/routing/role-resolver.ts","./src/lib/settings/src/providers/routing/shipping-method-resolver.ts","./src/lib/settings/src/providers/routing/tax-category-resolver.ts","./src/lib/settings/src/providers/routing/tax-rate-resolver.ts","./src/lib/settings/src/settings.routes.ts","./src/lib/settings/src/settings.module.ts"],"sourcesContent":["import { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[vdrZoneMemberControls]',\r\n})\r\nexport class ZoneMemberControlsDirective {\r\n constructor(public templateRef: TemplateRef<any>) {}\r\n}\r\n","import { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[vdrZoneMemberListHeader]',\r\n})\r\nexport class ZoneMemberListHeaderDirective {\r\n constructor(public templateRef: TemplateRef<any>) {}\r\n}\r\n","<div class=\"members-header\">\r\n <ng-container *ngIf=\"headerTemplate\">\r\n <ng-container *ngTemplateOutlet=\"headerTemplate.templateRef\"></ng-container>\r\n </ng-container>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"'settings.filter-by-member-name' | translate\"\r\n [(ngModel)]=\"filterTerm\"\r\n />\r\n</div>\r\n<vdr-data-table\r\n [items]=\"filteredMembers()\"\r\n [allSelected]=\"areAllSelected()\"\r\n [isRowSelectedFn]=\"(['UpdateSettings', 'UpdateZone'] | hasPermission) && isMemberSelected\"\r\n (rowSelectChange)=\"toggleSelectMember($event)\"\r\n (allSelectChange)=\"toggleSelectAll()\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.enabled' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-member=\"item\">\r\n <td class=\"left align-middle\">{{ member.code }}</td>\r\n <td class=\"left align-middle\">{{ member.name }}</td>\r\n <td class=\"left align-middle\">\r\n <clr-icon\r\n [class.is-success]=\"member.enabled\"\r\n [attr.shape]=\"member.enabled ? 'check' : 'times'\"\r\n ></clr-icon>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <ng-container *ngIf=\"controlsTemplate\">\r\n <ng-container\r\n *ngTemplateOutlet=\"controlsTemplate.templateRef; context: { member: member }\"\r\n ></ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { ZoneMemberControlsDirective } from './zone-member-controls.directive';\r\nimport { ZoneMemberListHeaderDirective } from './zone-member-list-header.directive';\r\n\r\nexport type ZoneMember = { id: string; name: string; code: string };\r\n\r\n@Component({\r\n selector: 'vdr-zone-member-list',\r\n templateUrl: './zone-member-list.component.html',\r\n styleUrls: ['./zone-member-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ZoneMemberListComponent {\r\n @Input() members: ZoneMember[] = [];\r\n @Input() selectedMemberIds: string[] = [];\r\n @Output() selectionChange = new EventEmitter<string[]>();\r\n @ContentChild(ZoneMemberListHeaderDirective) headerTemplate: ZoneMemberListHeaderDirective;\r\n @ContentChild(ZoneMemberControlsDirective) controlsTemplate: ZoneMemberControlsDirective;\r\n filterTerm = '';\r\n\r\n filteredMembers(): ZoneMember[] {\r\n if (this.filterTerm !== '') {\r\n const term = this.filterTerm.toLocaleLowerCase();\r\n return this.members.filter(\r\n m => m.name.toLocaleLowerCase().includes(term) || m.code.toLocaleLowerCase().includes(term),\r\n );\r\n } else {\r\n return this.members;\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({ item: member }: { item: 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>{{ 'settings.add-countries-to-zone' | translate: { zoneName: zoneName } }}</ng-template>\r\n\r\n<vdr-zone-member-list\r\n [members]=\"availableCountries$ | async\"\r\n [selectedMemberIds]=\"selectedMemberIds\"\r\n (selectionChange)=\"selectedMemberIds = $event\"\r\n>\r\n</vdr-zone-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]=\"!selectedMemberIds.length\" class=\"btn btn-primary\">\r\n {{ 'settings.add-countries-to-zone' | translate: { zoneName: zoneName } }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { DataService, Dialog, GetCountryListQuery, GetZonesQuery, ItemOf } from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-add-country-to-zone-dialog',\r\n templateUrl: './add-country-to-zone-dialog.component.html',\r\n styleUrls: ['./add-country-to-zone-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddCountryToZoneDialogComponent implements Dialog<string[]>, OnInit {\r\n resolveWith: (result?: string[]) => void;\r\n zoneName: string;\r\n currentMembers: GetZonesQuery['zones'][number]['members'] = [];\r\n availableCountries$: Observable<Array<ItemOf<GetCountryListQuery, 'countries'>>>;\r\n selectedMemberIds: string[] = [];\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n const currentMemberIds = this.currentMembers.map(m => m.id);\r\n this.availableCountries$ = this.dataService.settings\r\n .getCountries(999)\r\n .mapStream(data => data.countries.items)\r\n .pipe(map(countries => countries.filter(c => !currentMemberIds.includes(c.id))));\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n add() {\r\n this.resolveWith(this.selectedMemberIds);\r\n }\r\n}\r\n","<table class=\"table\">\r\n <tbody>\r\n <tr *ngFor=\"let section of gridData\">\r\n <td class=\"permission-group left\">\r\n <div><strong>{{ section.label | translate }}</strong></div>\r\n <small>{{ section.description | translate }}</small><br>\r\n <button *ngIf=\"1 < section.permissions.length && !readonly\" class=\"btn btn-sm btn-link\" (click)=\"toggleAll(section.permissions)\">\r\n {{ 'common.toggle-all' | translate }}\r\n </button>\r\n </td>\r\n <td *ngFor=\"let permission of section.permissions\" [attr.colspan]=\"section.permissions.length === 1 ? 4 : 1\">\r\n <vdr-select-toggle\r\n size=\"small\"\r\n [title]=\"permission.description\"\r\n [label]=\"permission.name\"\r\n [disabled]=\"readonly\"\r\n [selected]=\"activePermissions?.includes(permission.name)\"\r\n (selectedChange)=\"setPermission(permission.name, $event)\"\r\n ></vdr-select-toggle>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport { PermissionDefinition } from '@vendure/admin-ui/core';\n\nexport interface PermissionGridRow {\n label: string;\n description: string;\n permissions: PermissionDefinition[];\n}\n\n/**\n * A table showing and allowing the setting of all possible CRUD permissions.\n */\n@Component({\n selector: 'vdr-permission-grid',\n templateUrl: './permission-grid.component.html',\n styleUrls: ['./permission-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PermissionGridComponent implements OnInit {\n @Input() permissionDefinitions: PermissionDefinition[];\n @Input() activePermissions: string[];\n @Input() readonly = false;\n @Output() permissionChange = new EventEmitter<{ permission: string; value: boolean }>();\n gridData: PermissionGridRow[];\n\n ngOnInit() {\n this.buildGrid();\n }\n\n setPermission(permission: string, value: boolean) {\n if (!this.readonly) {\n this.permissionChange.emit({ permission, value });\n }\n }\n\n toggleAll(defs: PermissionDefinition[]) {\n const value = defs.some(d => !this.activePermissions.includes(d.name));\n for (const def of defs) {\n this.permissionChange.emit({ permission: def.name, value });\n }\n }\n\n private buildGrid() {\n const crudGroups = new Map<string, PermissionDefinition[]>();\n const nonCrud: PermissionDefinition[] = [];\n const crudRe = /^(Create|Read|Update|Delete)([a-zA-Z]+)$/;\n for (const def of this.permissionDefinitions) {\n const isCrud = crudRe.test(def.name);\n if (isCrud) {\n const groupName = def.name.match(crudRe)?.[2];\n if (groupName) {\n const existing = crudGroups.get(groupName);\n if (existing) {\n existing.push(def);\n } else {\n crudGroups.set(groupName, [def]);\n }\n }\n } else if (def.assignable) {\n nonCrud.push(def);\n }\n }\n this.gridData = [\n ...nonCrud.map(d => ({\n label: d.name,\n description: d.description,\n permissions: [d],\n })),\n ...Array.from(crudGroups.entries()).map(([label, defs]) => {\n return {\n label,\n description: this.extractCrudDescription(defs[0]),\n permissions: defs,\n };\n }),\n ];\n }\n\n private extractCrudDescription(def: PermissionDefinition): string {\n return def.description.replace(/Grants permission to [\\w]+/, 'Grants permissions on');\n }\n}\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"administrator-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]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n *vdrIfPermissions=\"'UpdateAdministrator'\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\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\">\r\n <vdr-form-field [label]=\"'settings.email-address' | translate\" for=\"emailAddress\">\r\n <input\r\n id=\"emailAddress\"\r\n type=\"text\"\r\n formControlName=\"emailAddress\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.first-name' | translate\" for=\"firstName\">\r\n <input\r\n id=\"firstName\"\r\n type=\"text\"\r\n formControlName=\"firstName\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.last-name' | translate\" for=\"lastName\">\r\n <input\r\n id=\"lastName\"\r\n type=\"text\"\r\n formControlName=\"lastName\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field *ngIf=\"isNew$ | async\" [label]=\"'settings.password' | translate\" for=\"password\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n *ngIf=\"!(isNew$ | async) && ('UpdateAdministrator' | hasPermission)\"\r\n [label]=\"'settings.password' | translate\"\r\n for=\"password\"\r\n [readOnlyToggle]=\"true\"\r\n >\r\n <input id=\"password\" type=\"password\" formControlName=\"password\" />\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=\"Administrator\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"administrator-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n <label class=\"clr-control-label\">{{ 'settings.roles' | translate }}</label>\r\n <ng-select\r\n [items]=\"allRoles$ | async\"\r\n [multiple]=\"true\"\r\n [hideSelected]=\"true\"\r\n formControlName=\"roles\"\r\n (change)=\"rolesChanged($event)\"\r\n bindLabel=\"description\"\r\n ></ng-select>\r\n\r\n <ul class=\"nav\" role=\"tablist\">\r\n <li role=\"presentation\" class=\"nav-item\" *ngFor=\"let channel of getAvailableChannels()\">\r\n <button\r\n [id]=\"channel.channelId\"\r\n (click)=\"selectedChannelId = channel.channelId\"\r\n class=\"btn btn-link nav-link\"\r\n [class.active]=\"selectedChannelId === channel.channelId\"\r\n [attr.aria-selected]=\"selectedChannelId === channel.channelId\"\r\n type=\"button\"\r\n >\r\n {{ channel.channelCode | channelCodeToLabel | translate }}\r\n </button>\r\n </li>\r\n </ul>\r\n <vdr-permission-grid\r\n [activePermissions]=\"getPermissionsForSelectedChannel()\"\r\n [permissionDefinitions]=\"permissionDefinitions\"\r\n [readonly]=\"true\"\r\n ></vdr-permission-grid>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 Administrator,\r\n AdministratorFragment,\r\n BaseDetailComponent,\r\n CreateAdministratorInput,\r\n CustomFieldConfig,\r\n DataService,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n PermissionDefinition,\r\n RoleFragment,\r\n ServerConfigService,\r\n UpdateAdministratorInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { CUSTOMER_ROLE_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { Observable } from 'rxjs';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\nexport interface PermissionsByChannel {\r\n channelId: string;\r\n channelCode: string;\r\n permissions: { [K in Permission]: boolean };\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-admin-detail',\r\n templateUrl: './admin-detail.component.html',\r\n styleUrls: ['./admin-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AdminDetailComponent\r\n extends BaseDetailComponent<AdministratorFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n administrator$: Observable<AdministratorFragment>;\r\n permissionDefinitions: PermissionDefinition[];\r\n allRoles$: Observable<RoleFragment[]>;\r\n selectedRoles: RoleFragment[] = [];\r\n detailForm: FormGroup;\r\n selectedRolePermissions: { [channelId: string]: PermissionsByChannel } = {} as any;\r\n selectedChannelId: string | null = null;\r\n\r\n getAvailableChannels(): PermissionsByChannel[] {\r\n return Object.values(this.selectedRolePermissions);\r\n }\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Administrator');\r\n this.detailForm = this.formBuilder.group({\r\n emailAddress: ['', Validators.required],\r\n firstName: ['', Validators.required],\r\n lastName: ['', Validators.required],\r\n password: [''],\r\n roles: [[]],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.administrator$ = this.entity$;\r\n this.allRoles$ = this.dataService.administrator\r\n .getRoles(999)\r\n .mapStream(item => item.roles.items.filter(i => i.code !== CUSTOMER_ROLE_CODE));\r\n this.dataService.client.userStatus().single$.subscribe(({ userStatus }) => {\r\n if (!userStatus.permissions.includes(Permission.UpdateAdministrator)) {\r\n const rolesSelect = this.detailForm.get('roles');\r\n if (rolesSelect) {\r\n rolesSelect.disable();\r\n }\r\n }\r\n });\r\n this.permissionDefinitions = this.serverConfigService.getPermissionDefinitions();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n rolesChanged(roles: RoleFragment[]) {\r\n this.buildPermissionsMap();\r\n }\r\n\r\n getPermissionsForSelectedChannel(): string[] {\r\n function getActivePermissions(input: PermissionsByChannel['permissions']): string[] {\r\n return Object.entries(input)\r\n .filter(([permission, active]) => active)\r\n .map(([permission, active]) => permission);\r\n }\r\n if (this.selectedChannelId) {\r\n const selectedChannel = this.selectedRolePermissions[this.selectedChannelId];\r\n if (selectedChannel) {\r\n const permissionMap = this.selectedRolePermissions[this.selectedChannelId].permissions;\r\n return getActivePermissions(permissionMap);\r\n }\r\n }\r\n const channels = Object.values(this.selectedRolePermissions);\r\n if (0 < channels.length) {\r\n this.selectedChannelId = channels[0].channelId;\r\n return getActivePermissions(channels[0].permissions);\r\n }\r\n return [];\r\n }\r\n\r\n create() {\r\n const formValue = this.detailForm.value;\r\n const administrator: CreateAdministratorInput = {\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n password: formValue.password,\r\n customFields: formValue.customFields,\r\n roleIds: formValue.roles.map(role => role.id),\r\n };\r\n this.dataService.administrator.createAdministrator(administrator).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Administrator',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createAdministrator.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Administrator',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n this.administrator$\r\n .pipe(\r\n take(1),\r\n mergeMap(({ id }) => {\r\n const formValue = this.detailForm.value;\r\n const administrator: UpdateAdministratorInput = {\r\n id,\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n password: formValue.password,\r\n customFields: formValue.customFields,\r\n roleIds: formValue.roles.map(role => role.id),\r\n };\r\n return this.dataService.administrator.updateAdministrator(administrator);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Administrator',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Administrator',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(administrator: Administrator, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n emailAddress: administrator.emailAddress,\r\n firstName: administrator.firstName,\r\n lastName: administrator.lastName,\r\n roles: administrator.user.roles,\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n administrator,\r\n );\r\n }\r\n const passwordControl = this.detailForm.get('password');\r\n if (passwordControl) {\r\n if (!administrator.id) {\r\n passwordControl.setValidators([Validators.required]);\r\n } else {\r\n passwordControl.setValidators([]);\r\n }\r\n }\r\n this.buildPermissionsMap();\r\n }\r\n\r\n private buildPermissionsMap() {\r\n const permissionsControl = this.detailForm.get('roles');\r\n if (permissionsControl) {\r\n const roles: RoleFragment[] = permissionsControl.value;\r\n const channelIdPermissionsMap = new Map<string, Set<Permission>>();\r\n const channelIdCodeMap = new Map<string, string>();\r\n\r\n for (const role of roles) {\r\n for (const channel of role.channels) {\r\n const channelPermissions = channelIdPermissionsMap.get(channel.id);\r\n const permissionSet = channelPermissions || new Set<Permission>();\r\n\r\n role.permissions.forEach(p => permissionSet.add(p));\r\n channelIdPermissionsMap.set(channel.id, permissionSet);\r\n channelIdCodeMap.set(channel.id, channel.code);\r\n }\r\n }\r\n\r\n this.selectedRolePermissions = {} as any;\r\n for (const channelId of Array.from(channelIdPermissionsMap.keys())) {\r\n // tslint:disable-next-line:no-non-null-assertion\r\n const permissionSet = channelIdPermissionsMap.get(channelId)!;\r\n const permissionsHash: { [K in Permission]: boolean } = {} as any;\r\n for (const def of this.serverConfigService.getPermissionDefinitions()) {\r\n permissionsHash[def.name] = permissionSet.has(def.name as Permission);\r\n }\r\n this.selectedRolePermissions[channelId] = {\r\n // tslint:disable:no-non-null-assertion\r\n channelId,\r\n channelCode: channelIdCodeMap.get(channelId)!,\r\n permissions: permissionsHash,\r\n // tslint:enable:no-non-null-assertion\r\n };\r\n }\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"administrator-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreateAdministrator'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'admin.create-new-administrator' | 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>{{ 'settings.first-name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.last-name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.email-address' | 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-administrator=\"item\">\r\n <td class=\"left align-middle\">{{ administrator.firstName }}</td>\r\n <td class=\"left align-middle\">{{ administrator.lastName }}</td>\r\n <td class=\"left align-middle\">{{ administrator.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]=\"['./', administrator.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)=\"deleteAdministrator(administrator)\"\r\n [disabled]=\"!('DeleteAdministrator' | 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 } from '@angular/core';\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 GetAdministratorsQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-administrator-list',\r\n templateUrl: './administrator-list.component.html',\r\n styleUrls: ['./administrator-list.component.scss'],\r\n})\r\nexport class AdministratorListComponent extends BaseListComponent<\r\n GetAdministratorsQuery,\r\n ItemOf<GetAdministratorsQuery, 'administrators'>\r\n> {\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.administrator.getAdministrators(...args),\r\n data => data.administrators,\r\n );\r\n }\r\n\r\n deleteAdministrator(administrator: ItemOf<GetAdministratorsQuery, 'administrators'>) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-administrator'),\r\n body: `${administrator.firstName} ${administrator.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(\r\n switchMap(res =>\r\n res ? this.dataService.administrator.deleteAdministrator(administrator.id) : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Administrator',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Administrator',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"channel-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]=\"!saveButtonEnabled()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n *vdrIfPermissions=\"['SuperAdmin', 'UpdateChannel']\"\r\n [disabled]=\"!saveButtonEnabled()\"\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\">\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.channel-token' | translate\" for=\"token\">\r\n <input\r\n id=\"token\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"token\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.currency' | translate\" for=\"defaultTaxZoneId\">\r\n <select\r\n clrSelect\r\n name=\"currencyCode\"\r\n formControlName=\"currencyCode\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option *ngFor=\"let code of currencyCodes\" [value]=\"code\">{{ code | localeCurrencyName }}</option>\r\n </select>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.default-language' | translate\" for=\"defaultLanguage\">\r\n <select\r\n clrSelect\r\n name=\"defaultLanguageCode\"\r\n formControlName=\"defaultLanguageCode\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option *ngFor=\"let languageCode of availableLanguageCodes$ | async\" [value]=\"languageCode\">\r\n {{ languageCode | localeLanguageName }} ({{ languageCode | uppercase }})\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.prices-include-tax' | translate\" for=\"pricesIncludeTax\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n id=\"pricesIncludeTax\"\r\n formControlName=\"pricesIncludeTax\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.default-tax-zone' | translate\" for=\"defaultTaxZoneId\">\r\n <select\r\n clrSelect\r\n name=\"defaultTaxZoneId\"\r\n formControlName=\"defaultTaxZoneId\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option selected value style=\"display: none\"></option>\r\n <option *ngFor=\"let zone of zones$ | async\" [value]=\"zone.id\">{{ zone.name }}</option>\r\n </select>\r\n </vdr-form-field>\r\n <clr-alert\r\n *ngIf=\"detailForm.value.code && !detailForm.value.defaultTaxZoneId\"\r\n clrAlertType=\"danger\"\r\n [clrAlertClosable]=\"false\"\r\n >\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'error.no-default-tax-zone-set' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n\r\n <vdr-form-field [label]=\"'settings.default-shipping-zone' | translate\" for=\"defaultShippingZoneId\">\r\n <select\r\n clrSelect\r\n name=\"defaultShippingZoneId\"\r\n formControlName=\"defaultShippingZoneId\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option selected value style=\"display: none\"></option>\r\n <option *ngFor=\"let zone of zones$ | async\" [value]=\"zone.id\">{{ zone.name }}</option>\r\n </select>\r\n </vdr-form-field>\r\n <clr-alert\r\n *ngIf=\"detailForm.value.code && !detailForm.value.defaultShippingZoneId\"\r\n clrAlertType=\"warning\"\r\n [clrAlertClosable]=\"false\"\r\n >\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'error.no-default-shipping-zone-set' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\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=\"Channel\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"channel-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 ChannelFragment,\r\n CreateChannelInput,\r\n CurrencyCode,\r\n CustomFieldConfig,\r\n DataService,\r\n GetZonesQuery,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n UpdateChannelInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { Observable } from 'rxjs';\r\nimport { map, mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-channel-detail',\r\n templateUrl: './channel-detail.component.html',\r\n styleUrls: ['./channel-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChannelDetailComponent\r\n extends BaseDetailComponent<ChannelFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n zones$: Observable<GetZonesQuery['zones']>;\r\n detailForm: FormGroup;\r\n currencyCodes = Object.values(CurrencyCode);\r\n availableLanguageCodes$: Observable<LanguageCode[]>;\r\n readonly updatePermission = [Permission.SuperAdmin, Permission.UpdateChannel, Permission.CreateChannel];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n protected serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Channel');\r\n this.detailForm = this.formBuilder.group({\r\n code: ['', Validators.required],\r\n token: ['', Validators.required],\r\n pricesIncludeTax: [false],\r\n currencyCode: [''],\r\n defaultShippingZoneId: ['', Validators.required],\r\n defaultLanguageCode: [],\r\n defaultTaxZoneId: ['', Validators.required],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.zones$ = this.dataService.settings.getZones().mapSingle(data => data.zones);\r\n this.availableLanguageCodes$ = this.serverConfigService.getAvailableLanguages();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n saveButtonEnabled(): boolean {\r\n return this.detailForm.dirty && this.detailForm.valid;\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n const input: CreateChannelInput = {\r\n code: formValue.code,\r\n token: formValue.token,\r\n defaultLanguageCode: formValue.defaultLanguageCode,\r\n pricesIncludeTax: formValue.pricesIncludeTax,\r\n currencyCode: formValue.currencyCode,\r\n defaultShippingZoneId: formValue.defaultShippingZoneId,\r\n defaultTaxZoneId: formValue.defaultTaxZoneId,\r\n customFields: formValue.customFields,\r\n };\r\n this.dataService.settings\r\n .createChannel(input)\r\n .pipe(\r\n mergeMap(({ createChannel }) =>\r\n this.dataService.auth.currentUser().single$.pipe(\r\n map(({ me }) => ({\r\n me,\r\n createChannel,\r\n })),\r\n ),\r\n ),\r\n mergeMap(({ me, createChannel }) =>\r\n // tslint:disable-next-line:no-non-null-assertion\r\n this.dataService.client.updateUserChannels(me!.channels).pipe(map(() => createChannel)),\r\n ),\r\n )\r\n .subscribe(data => {\r\n switch (data.__typename) {\r\n case 'Channel':\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Channel',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.id], { relativeTo: this.route });\r\n break;\r\n case 'LanguageNotAvailableError':\r\n this.notificationService.error(data.message);\r\n break;\r\n }\r\n });\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(channel => {\r\n const input = {\r\n id: channel.id,\r\n code: formValue.code,\r\n token: formValue.token,\r\n pricesIncludeTax: formValue.pricesIncludeTax,\r\n currencyCode: formValue.currencyCode,\r\n defaultShippingZoneId: formValue.defaultShippingZoneId,\r\n defaultLanguageCode: formValue.defaultLanguageCode,\r\n defaultTaxZoneId: formValue.defaultTaxZoneId,\r\n customFields: formValue.customFields,\r\n } as UpdateChannelInput;\r\n return this.dataService.settings.updateChannel(input);\r\n }),\r\n )\r\n .subscribe(({ updateChannel }) => {\r\n switch (updateChannel.__typename) {\r\n case 'Channel':\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Channel',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n break;\r\n case 'LanguageNotAvailableError':\r\n this.notificationService.error(updateChannel.message);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the form values when the entity changes.\r\n */\r\n protected setFormValues(entity: ChannelFragment, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n code: entity.code,\r\n token: entity.token || this.generateToken(),\r\n pricesIncludeTax: entity.pricesIncludeTax,\r\n currencyCode: entity.currencyCode,\r\n defaultShippingZoneId: entity.defaultShippingZone ? entity.defaultShippingZone.id : '',\r\n defaultLanguageCode: entity.defaultLanguageCode,\r\n defaultTaxZoneId: entity.defaultTaxZone ? entity.defaultTaxZone.id : '',\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\r\n }\r\n if (entity.code === DEFAULT_CHANNEL_CODE) {\r\n const codeControl = this.detailForm.get('code');\r\n if (codeControl) {\r\n codeControl.disable();\r\n }\r\n }\r\n }\r\n\r\n private generateToken(): string {\r\n const randomString = () => Math.random().toString(36).substr(3, 10);\r\n return `${randomString()}${randomString()}`;\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"channel-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"['SuperAdmin', 'CreateChannel']\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-channel' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table [items]=\"channels$ | async\">\r\n <vdr-dt-column>{{ 'common.code' | 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-channel=\"item\">\r\n <td class=\"left align-middle\">\r\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel | translate }}\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]=\"['./', channel.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger [disabled]=\"isDefaultChannel(channel.code)\">\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)=\"deleteChannel(channel.id)\"\r\n [disabled]=\"!(['SuperAdmin', 'DeleteChannel'] | 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 { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport { ChannelFragment, DataService, ModalService, NotificationService } from '@vendure/admin-ui/core';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { mergeMap, startWith, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-channel-list',\r\n templateUrl: './channel-list.component.html',\r\n styleUrls: ['./channel-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChannelListComponent {\r\n channels$: Observable<ChannelFragment[]>;\r\n private refresh$ = new Subject();\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n ) {\r\n this.channels$ = this.refresh$.pipe(\r\n startWith(1),\r\n switchMap(() => this.dataService.settings.getChannels().mapStream(data => data.channels)),\r\n );\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n deleteChannel(id: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-channel'),\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 => (response ? this.dataService.settings.deleteChannel(id) : EMPTY)),\r\n mergeMap(() => this.dataService.auth.currentUser().single$),\r\n // tslint:disable-next-line:no-non-null-assertion\r\n mergeMap(data => this.dataService.client.updateUserChannels(data.me!.channels)),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Channel',\r\n });\r\n this.refresh$.next(1);\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Channel',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"country-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]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"updatePermission\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\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\">\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\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]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.enabled' | translate\" for=\"enabled\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n id=\"enabled\"\r\n formControlName=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\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=\"Country\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"country-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 CountryFragment,\r\n CreateCountryInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n findTranslation,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n UpdateCountryInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, Observable } from 'rxjs';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-country-detail',\r\n templateUrl: './country-detail.component.html',\r\n styleUrls: ['./country-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CountryDetailComponent\r\n extends BaseDetailComponent<CountryFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n country$: Observable<CountryFragment>;\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateCountry];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Country');\r\n this.detailForm = this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: ['', Validators.required],\r\n enabled: [true],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.country$ = this.entity$;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n combineLatest(this.country$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([country, languageCode]) => {\r\n const formValue = this.detailForm.value;\r\n const input: CreateCountryInput = createUpdatedTranslatable({\r\n translatable: country,\r\n updatedFields: formValue,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n name: formValue.name,\r\n languageCode,\r\n },\r\n });\r\n return this.dataService.settings.createCountry(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Country',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createCountry.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Country',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.country$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([country, languageCode]) => {\r\n const formValue = this.detailForm.value;\r\n const input: UpdateCountryInput = createUpdatedTranslatable({\r\n translatable: country,\r\n updatedFields: formValue,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n name: formValue.name,\r\n languageCode,\r\n },\r\n });\r\n return this.dataService.settings.updateCountry(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Country',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Country',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(country: CountryFragment, languageCode: LanguageCode): void {\r\n const currentTranslation = findTranslation(country, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n code: country.code,\r\n name: currentTranslation ? currentTranslation.name : '',\r\n enabled: country.enabled,\r\n });\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n country,\r\n currentTranslation,\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=\"searchTerm\"\r\n [formControl]=\"searchTerm\"\r\n [placeholder]=\"'settings.search-country-by-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n <div>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"country-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateSettings', 'CreateCountry']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-country' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table [items]=\"countriesWithZones$ | async\">\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.zone' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.enabled' | 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-country=\"item\">\r\n <td class=\"left align-middle\">{{ country.code }}</td>\r\n <td class=\"left align-middle\">{{ country.name }}</td>\r\n <td class=\"left align-middle\">\r\n <a\r\n [routerLink]=\"['/settings', 'zones', { contents: zone.id }]\"\r\n *ngFor=\"let zone of country.zones\"\r\n >\r\n <vdr-chip [colorFrom]=\"zone.name\">{{ zone.name }}</vdr-chip>\r\n </a>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <clr-icon\r\n [class.is-success]=\"country.enabled\"\r\n [attr.shape]=\"country.enabled ? 'check' : 'times'\"\r\n ></clr-icon>\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]=\"['./', country.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right 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 type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteCountry(country.id)\"\r\n vdrDropdownItem\r\n [disabled]=\"!(['DeleteSettings', 'DeleteCountry'] | 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 </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n DeletionResult,\r\n GetCountryListQuery,\r\n GetZonesQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n ZoneFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, EMPTY, Observable, Subject } from 'rxjs';\r\nimport { map, startWith, switchMap, tap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-country-list',\r\n templateUrl: './country-list.component.html',\r\n styleUrls: ['./country-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CountryListComponent implements OnInit, OnDestroy {\r\n searchTerm = new FormControl('');\r\n countriesWithZones$: Observable<\r\n Array<ItemOf<GetCountryListQuery, 'countries'> & { zones: GetZonesQuery['zones'] }>\r\n >;\r\n zones$: Observable<GetZonesQuery['zones']>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n\r\n private countries: GetCountryListQuery['countries']['items'] = [];\r\n private destroy$ = new Subject<void>();\r\n private refresh$ = new Subject<void>();\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private serverConfigService: ServerConfigService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage);\r\n\r\n const countries$ = combineLatest(\r\n this.contentLanguage$,\r\n this.searchTerm.valueChanges.pipe(startWith(null)),\r\n ).pipe(\r\n map(([__, term]) => term),\r\n switchMap(term => this.dataService.settings.getCountries(999, 0, term).single$),\r\n tap(data => {\r\n this.countries = data.countries.items;\r\n }),\r\n map(data => data.countries.items),\r\n );\r\n\r\n this.zones$ = this.dataService.settings.getZones().mapStream(data => data.zones);\r\n\r\n this.countriesWithZones$ = combineLatest(countries$, this.zones$).pipe(\r\n map(([countries, zones]) => {\r\n return countries.map(country => ({\r\n ...country,\r\n zones: zones.filter(z => !!z.members.find(c => c.id === country.id)),\r\n }));\r\n }),\r\n );\r\n\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next(undefined);\r\n this.destroy$.complete();\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n deleteCountry(countryId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-country'),\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.settings.deleteCountry(countryId) : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n response => {\r\n if (response.deleteCountry.result === DeletionResult.DELETED) {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Country',\r\n });\r\n this.dataService.settings.getCountries(999, 0).single$.subscribe();\r\n } else {\r\n this.notificationService.error(response.deleteCountry.message || '');\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Country',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private isZone(input: ZoneFragment | { name: string } | string): input is ZoneFragment {\r\n return input.hasOwnProperty('id');\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"global-settings-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n *vdrIfPermissions=\"updatePermission\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-form-field [label]=\"'common.available-languages' | translate\" for=\"availableLanguages\">\r\n <ng-select\r\n [items]=\"languageCodes\"\r\n [addTag]=\"false\"\r\n [hideSelected]=\"true\"\r\n multiple=\"true\"\r\n appendTo=\"body\"\r\n formControlName=\"availableLanguages\"\r\n >\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-icon left\" (click)=\"clear.call(null, item)\" aria-hidden=\"true\">\r\n ×\r\n </span>\r\n <span class=\"ng-value-label\">{{ item | localeLanguageName }} ({{ item }})</span>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n {{ item | localeLanguageName }} ({{ item }})\r\n </ng-template>\r\n </ng-select>\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'settings.global-out-of-stock-threshold' | translate\"\r\n for=\"outOfStockThreshold\"\r\n [tooltip]=\"'settings.global-out-of-stock-threshold-tooltip' | translate\"\r\n >\r\n <input\r\n id=\"outOfStockThreshold\"\r\n type=\"number\"\r\n formControlName=\"outOfStockThreshold\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'settings.track-inventory-default' | translate\"\r\n for=\"enabled\"\r\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\r\n >\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n formControlName=\"trackInventory\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\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=\"GlobalSettings\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"global-settings-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 CustomFieldConfig,\r\n DataService,\r\n GlobalSettings,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { switchMap, tap, withLatestFrom } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-global-settings',\r\n templateUrl: './global-settings.component.html',\r\n styleUrls: ['./global-settings.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GlobalSettingsComponent extends BaseDetailComponent<GlobalSettings> implements OnInit {\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n languageCodes = Object.values(LanguageCode);\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateGlobalSettings];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('GlobalSettings');\r\n this.detailForm = this.formBuilder.group({\r\n availableLanguages: [''],\r\n trackInventory: false,\r\n outOfStockThreshold: [0, Validators.required],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.init();\r\n this.dataService.client.userStatus().single$.subscribe(({ userStatus }) => {\r\n if (!userStatus.permissions.includes(Permission.UpdateSettings)) {\r\n const languagesSelect = this.detailForm.get('availableLanguages');\r\n if (languagesSelect) {\r\n languagesSelect.disable();\r\n }\r\n }\r\n });\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n\r\n this.dataService.settings\r\n .updateGlobalSettings(this.detailForm.value)\r\n .pipe(\r\n tap(({ updateGlobalSettings }) => {\r\n switch (updateGlobalSettings.__typename) {\r\n case 'GlobalSettings':\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Settings',\r\n });\r\n break;\r\n case 'ChannelDefaultLanguageError':\r\n this.notificationService.error(updateGlobalSettings.message);\r\n }\r\n }),\r\n switchMap(() => this.serverConfigService.refreshGlobalSettings()),\r\n withLatestFrom(this.dataService.client.uiState().single$),\r\n )\r\n .subscribe(([{ globalSettings }, { uiState }]) => {\r\n const availableLangs = globalSettings.availableLanguages;\r\n if (availableLangs.length && !availableLangs.includes(uiState.contentLanguage)) {\r\n this.dataService.client.setContentLanguage(availableLangs[0]).subscribe();\r\n }\r\n });\r\n }\r\n\r\n protected setFormValues(entity: GlobalSettings, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n availableLanguages: entity.availableLanguages,\r\n trackInventory: entity.trackInventory,\r\n outOfStockThreshold: entity.outOfStockThreshold,\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get('customFields'), entity);\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"payment-method-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\r\n (click)=\"create()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.pristine || detailForm.invalid || !selectedHandler\"\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\" *ngIf=\"entity$ | async as paymentMethod\">\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]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateCode(paymentMethod.code, $event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n [readOnlyToggle]=\"updatePermission | hasPermission\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n <vdr-form-field [label]=\"'common.enabled' | translate\" for=\"description\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n id=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"enabled\"\r\n />\r\n </clr-toggle-wrapper>\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=\"PaymentMethod\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n\r\n <vdr-custom-detail-component-host\r\n locationId=\"payment-method-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n\r\n <div class=\"clr-row mt4\">\r\n <div class=\"clr-col\">\r\n <label class=\"clr-control-label\">{{ 'settings.payment-eligibility-checker' | translate }}</label>\r\n <vdr-configurable-input\r\n *ngIf=\"selectedChecker && selectedCheckerDefinition\"\r\n [operation]=\"selectedChecker\"\r\n [operationDefinition]=\"selectedCheckerDefinition\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (remove)=\"removeChecker()\"\r\n formControlName=\"checker\"\r\n ></vdr-configurable-input>\r\n <div *ngIf=\"!selectedChecker || !selectedCheckerDefinition\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'common.select' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let checker of checkers\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectChecker(checker)\"\r\n >\r\n {{ checker.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n <div class=\"clr-col\">\r\n <label class=\"clr-control-label\">{{ 'settings.payment-handler' | translate }}</label>\r\n <vdr-configurable-input\r\n *ngIf=\"selectedHandler && selectedHandlerDefinition\"\r\n [operation]=\"selectedHandler\"\r\n [operationDefinition]=\"selectedHandlerDefinition\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (remove)=\"removeHandler()\"\r\n formControlName=\"handler\"\r\n ></vdr-configurable-input>\r\n <div *ngIf=\"!selectedHandler || !selectedHandlerDefinition\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'common.select' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let handler of handlers\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectHandler(handler)\"\r\n >\r\n {{ handler.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 configurableDefinitionToInstance,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n CreatePaymentMethodInput,\r\n CustomFieldConfig,\r\n DataService,\r\n getConfigArgValue,\r\n NotificationService,\r\n PaymentMethodFragment,\r\n Permission,\r\n ServerConfigService,\r\n toConfigurableOperationInput,\r\n UpdatePaymentMethodInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { combineLatest } from 'rxjs';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-payment-method-detail',\r\n templateUrl: './payment-method-detail.component.html',\r\n styleUrls: ['./payment-method-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentMethodDetailComponent\r\n extends BaseDetailComponent<PaymentMethodFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n checkers: ConfigurableOperationDefinition[] = [];\r\n handlers: ConfigurableOperationDefinition[] = [];\r\n selectedChecker?: ConfigurableOperation | null;\r\n selectedCheckerDefinition?: ConfigurableOperationDefinition;\r\n selectedHandler?: ConfigurableOperation | null;\r\n selectedHandlerDefinition?: ConfigurableOperationDefinition;\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdatePaymentMethod];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('PaymentMethod');\r\n this.detailForm = this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: ['', Validators.required],\r\n description: '',\r\n enabled: [true, Validators.required],\r\n checker: {},\r\n handler: {},\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n combineLatest([\r\n this.dataService.settings.getPaymentMethodOperations().single$,\r\n this.entity$.pipe(take(1)),\r\n ]).subscribe(([data, entity]) => {\r\n this.checkers = data.paymentMethodEligibilityCheckers;\r\n this.handlers = data.paymentMethodHandlers;\r\n this.changeDetector.markForCheck();\r\n this.selectedCheckerDefinition = data.paymentMethodEligibilityCheckers.find(\r\n c => c.code === (entity.checker && entity.checker.code),\r\n );\r\n this.selectedHandlerDefinition = data.paymentMethodHandlers.find(\r\n c => c.code === (entity.handler && entity.handler.code),\r\n );\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n updateCode(currentCode: string, nameValue: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n configArgsIsPopulated(): boolean {\r\n const configArgsGroup = this.detailForm.get('configArgs') as FormGroup | undefined;\r\n if (!configArgsGroup) {\r\n return false;\r\n }\r\n return 0 < Object.keys(configArgsGroup.controls).length;\r\n }\r\n\r\n selectChecker(checker: ConfigurableOperationDefinition) {\r\n this.selectedCheckerDefinition = checker;\r\n this.selectedChecker = configurableDefinitionToInstance(checker);\r\n const formControl = this.detailForm.get('checker');\r\n if (formControl) {\r\n formControl.clearValidators();\r\n formControl.updateValueAndValidity({ onlySelf: true });\r\n formControl.patchValue(this.selectedChecker);\r\n }\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n selectHandler(handler: ConfigurableOperationDefinition) {\r\n this.selectedHandlerDefinition = handler;\r\n this.selectedHandler = configurableDefinitionToInstance(handler);\r\n const formControl = this.detailForm.get('handler');\r\n if (formControl) {\r\n formControl.clearValidators();\r\n formControl.updateValueAndValidity({ onlySelf: true });\r\n formControl.patchValue(this.selectedHandler);\r\n }\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n removeChecker() {\r\n this.selectedChecker = null;\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n removeHandler() {\r\n this.selectedHandler = null;\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n create() {\r\n const selectedChecker = this.selectedChecker;\r\n const selectedHandler = this.selectedHandler;\r\n if (!selectedHandler) {\r\n return;\r\n }\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(({ id }) => {\r\n const formValue = this.detailForm.value;\r\n const input: CreatePaymentMethodInput = {\r\n name: formValue.name,\r\n code: formValue.code,\r\n description: formValue.description,\r\n enabled: formValue.enabled,\r\n checker: selectedChecker\r\n ? toConfigurableOperationInput(selectedChecker, formValue.checker)\r\n : null,\r\n handler: toConfigurableOperationInput(selectedHandler, formValue.handler),\r\n customFields: formValue.customFields,\r\n };\r\n return this.dataService.settings.createPaymentMethod(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'PaymentMethod',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createPaymentMethod.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'PaymentMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n const selectedChecker = this.selectedChecker;\r\n const selectedHandler = this.selectedHandler;\r\n if (!selectedHandler) {\r\n return;\r\n }\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(({ id }) => {\r\n const formValue = this.detailForm.value;\r\n const input: UpdatePaymentMethodInput = {\r\n id,\r\n name: formValue.name,\r\n code: formValue.code,\r\n description: formValue.description,\r\n enabled: formValue.enabled,\r\n checker: selectedChecker\r\n ? toConfigurableOperationInput(selectedChecker, formValue.checker)\r\n : null,\r\n handler: toConfigurableOperationInput(selectedHandler, formValue.handler),\r\n customFields: formValue.customFields,\r\n };\r\n return this.dataService.settings.updatePaymentMethod(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'PaymentMethod',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'PaymentMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(paymentMethod: PaymentMethodFragment): void {\r\n this.detailForm.patchValue({\r\n name: paymentMethod.name,\r\n code: paymentMethod.code,\r\n description: paymentMethod.description,\r\n enabled: paymentMethod.enabled,\r\n checker: paymentMethod.checker || {},\r\n handler: paymentMethod.handler || {},\r\n });\r\n if (!this.selectedChecker) {\r\n this.selectedChecker = paymentMethod.checker && {\r\n code: paymentMethod.checker.code,\r\n args: paymentMethod.checker.args.map(a => ({ ...a, value: getConfigArgValue(a.value) })),\r\n };\r\n }\r\n if (!this.selectedHandler) {\r\n this.selectedHandler = paymentMethod.handler && {\r\n code: paymentMethod.handler.code,\r\n args: paymentMethod.handler.args.map(a => ({ ...a, value: getConfigArgValue(a.value) })),\r\n };\r\n }\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get('customFields'),\r\n paymentMethod,\r\n );\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"payment-method-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"['CreateSettings', 'CreatePaymentMethod']\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-payment-method' | 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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.enabled' | 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-paymentMethod=\"item\">\r\n <td class=\"left align-middle\">{{ paymentMethod.code }}</td>\r\n <td class=\"left align-middle\">{{ paymentMethod.enabled }}</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]=\"['./', paymentMethod.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right 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 type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deletePaymentMethod(paymentMethod.id)\"\r\n [disabled]=\"!(['DeleteSettings', 'DeletePaymentMethod'] | 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 { ChangeDetectionStrategy, Component } from '@angular/core';\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 DeletionResult,\r\n GetPaymentMethodListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-payment-method-list',\r\n templateUrl: './payment-method-list.component.html',\r\n styleUrls: ['./payment-method-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentMethodListComponent extends BaseListComponent<\r\n GetPaymentMethodListQuery,\r\n ItemOf<GetPaymentMethodListQuery, 'paymentMethods'>\r\n> {\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.settings.getPaymentMethods(...args).refetchOnChannelChange(),\r\n data => data.paymentMethods,\r\n );\r\n }\r\n\r\n deletePaymentMethod(paymentMethodId: string) {\r\n this.showModalAndDelete(paymentMethodId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(paymentMethodId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n // Refresh the cached facets to reflect the changes\r\n switchMap(() => this.dataService.settings.getPaymentMethods(100).single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'PaymentMethod',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'PaymentMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(paymentMethodId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('settings.confirm-delete-payment-method'),\r\n body: message,\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(res =>\r\n res ? this.dataService.settings.deletePaymentMethod(paymentMethodId, !!message) : EMPTY,\r\n ),\r\n map(res => res.deletePaymentMethod),\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"administrator-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-form-field [label]=\"'settings.email-address' | translate\" for=\"emailAddress\">\r\n <input id=\"emailAddress\" type=\"text\" formControlName=\"emailAddress\"/>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.first-name' | translate\" for=\"firstName\">\r\n <input id=\"firstName\" type=\"text\" formControlName=\"firstName\"/>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.last-name' | translate\" for=\"lastName\">\r\n <input id=\"lastName\" type=\"text\" formControlName=\"lastName\"/>\r\n </vdr-form-field>\r\n <vdr-form-field *ngIf=\"isNew$ | async\" [label]=\"'settings.password' | translate\" for=\"password\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\"/>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.password' | translate\" for=\"password\" [readOnlyToggle]=\"true\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\"/>\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=\"Administrator\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"administrator-profile\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 Administrator,\r\n BaseDetailComponent,\r\n CustomFieldConfig,\r\n DataService,\r\n GetActiveAdministratorQuery,\r\n LanguageCode,\r\n NotificationService,\r\n ServerConfigService,\r\n UpdateActiveAdministratorInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-profile',\r\n templateUrl: './profile.component.html',\r\n styleUrls: ['./profile.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProfileComponent\r\n extends BaseDetailComponent<NonNullable<GetActiveAdministratorQuery['activeAdministrator']>>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields: CustomFieldConfig[];\r\n detailForm: FormGroup;\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('Administrator');\r\n this.detailForm = this.formBuilder.group({\r\n emailAddress: ['', Validators.required],\r\n firstName: ['', Validators.required],\r\n lastName: ['', Validators.required],\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 }\r\n\r\n ngOnInit() {\r\n this.init();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\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 formValue = this.detailForm.value;\r\n const administrator: UpdateActiveAdministratorInput = {\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n password: formValue.password,\r\n customFields: formValue.customFields,\r\n };\r\n return this.dataService.administrator.updateActiveAdministrator(administrator);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Administrator',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Administrator',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(administrator: Administrator, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n emailAddress: administrator.emailAddress,\r\n firstName: administrator.firstName,\r\n lastName: administrator.lastName,\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get('customFields'),\r\n administrator,\r\n );\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"role-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]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n *vdrIfPermissions=\"'UpdateAdministrator'\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\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\">\r\n <vdr-form-field [label]=\"'common.description' | translate\" for=\"description\">\r\n <input\r\n id=\"description\"\r\n type=\"text\"\r\n formControlName=\"description\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n (input)=\"updateCode($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n [readOnlyToggle]=\"'UpdateAdministrator' | hasPermission\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.channel' | translate\">\r\n <vdr-channel-assignment-control\r\n formControlName=\"channelIds\"\r\n [vdrDisabled]=\"!('UpdateAdministrator' | hasPermission)\"\r\n ></vdr-channel-assignment-control>\r\n </vdr-form-field>\r\n <label>{{ 'settings.permissions' | translate }}</label>\r\n <vdr-permission-grid\r\n [permissionDefinitions]=\"permissionDefinitions\"\r\n [activePermissions]=\"detailForm.get('permissions')?.value\"\r\n (permissionChange)=\"setPermission($event)\"\r\n [readonly]=\"!('UpdateAdministrator' | hasPermission)\"\r\n ></vdr-permission-grid>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n CreateRoleInput,\n DataService,\n LanguageCode,\n NotificationService,\n Permission,\n PermissionDefinition,\n Role,\n ServerConfigService,\n UpdateRoleInput,\n} from '@vendure/admin-ui/core';\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\nimport { unique } from '@vendure/common/lib/unique';\nimport { Observable } from 'rxjs';\nimport { mergeMap, take } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-role-detail',\n templateUrl: './role-detail.component.html',\n styleUrls: ['./role-detail.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RoleDetailComponent extends BaseDetailComponent<Role> implements OnInit, OnDestroy {\n role$: Observable<Role>;\n detailForm: FormGroup;\n permissionDefinitions: PermissionDefinition[];\n constructor(\n router: Router,\n route: ActivatedRoute,\n serverConfigService: ServerConfigService,\n private changeDetector: ChangeDetectorRef,\n protected dataService: DataService,\n private formBuilder: FormBuilder,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService);\n this.detailForm = this.formBuilder.group({\n code: ['', Validators.required],\n description: ['', Validators.required],\n channelIds: [],\n permissions: [],\n });\n }\n\n ngOnInit() {\n this.init();\n this.role$ = this.entity$;\n this.permissionDefinitions = this.serverConfigService.getPermissionDefinitions();\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n updateCode(nameValue: string) {\n const codeControl = this.detailForm.get(['code']);\n if (codeControl && codeControl.pristine) {\n codeControl.setValue(normalizeString(nameValue, '-'));\n }\n }\n\n setPermission(change: { permission: string; value: boolean }) {\n const permissionsControl = this.detailForm.get('permissions');\n if (permissionsControl) {\n const currentPermissions = permissionsControl.value as string[];\n const newValue =\n change.value === true\n ? unique([...currentPermissions, change.permission])\n : currentPermissions.filter(p => p !== change.permission);\n permissionsControl.setValue(newValue);\n permissionsControl.markAsDirty();\n }\n }\n\n create() {\n const formValue = this.detailForm.value;\n const role: CreateRoleInput = formValue;\n this.dataService.administrator.createRole(role).subscribe(\n data => {\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Role' });\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.router.navigate(['../', data.createRole.id], { relativeTo: this.route });\n },\n err => {\n this.notificationService.error(_('common.notify-create-error'), {\n entity: 'Role',\n });\n },\n );\n }\n\n save() {\n this.role$\n .pipe(\n take(1),\n mergeMap(({ id }) => {\n const formValue = this.detailForm.value;\n const role: UpdateRoleInput = { id, ...formValue };\n return this.dataService.administrator.updateRole(role);\n }),\n )\n .subscribe(\n data => {\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Role' });\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'Role',\n });\n },\n );\n }\n\n protected setFormValues(role: Role, languageCode: LanguageCode): void {\n this.detailForm.patchValue({\n description: role.description,\n code: role.code,\n channelIds: role.channels.map(c => c.id),\n permissions: role.permissions,\n });\n // This was required to get the channel selector component to\n // correctly display its contents. A while spent debugging the root\n // cause did not yield a solution, therefore this next line.\n this.changeDetector.detectChanges();\n }\n}\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"role-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreateAdministrator'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-role' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"visibleRoles$ | 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.description' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.channel' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.permissions' | 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-role=\"item\">\r\n <td class=\"left align-middle\">{{ role.description }}</td>\r\n <td class=\"left align-middle\"><span *ngIf=\"!isDefaultRole(role)\">{{ role.code }}</span></td>\r\n <td class=\"left align-middle\">\r\n <ng-container *ngIf=\"!isDefaultRole(role)\">\r\n <vdr-chip *ngFor=\"let channel of role.channels\">\r\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel | translate }}\r\n </vdr-chip>\r\n </ng-container>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <ng-container *ngIf=\"!isDefaultRole(role); else defaultRole\">\r\n <vdr-chip *ngFor=\"let permission of role.permissions | slice: 0:displayLimit[role.id] || 3\">{{ permission }}</vdr-chip>\r\n <button\r\n class=\"btn btn-sm btn-secondary btn-icon\"\r\n *ngIf=\"role.permissions.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(role)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[role.id] || 0) < role.permissions.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ role.permissions.length - initialLimit }}\r\n </ng-container>\r\n <ng-template #collapse>\r\n <clr-icon shape=\"minus\"></clr-icon>\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n <ng-template #defaultRole>\r\n <span class=\"default-role-label\">{{ 'settings.default-role-label' | translate }}</span>\r\n </ng-template>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n *ngIf=\"!isDefaultRole(role)\"\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', role.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger [disabled]=\"isDefaultRole(role)\">\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)=\"deleteRole(role.id)\"\r\n [disabled]=\"!('SuperAdmin' | 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 { 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 { BaseListComponent, GetRolesQuery, ItemOf } from '@vendure/admin-ui/core';\r\nimport { Role } from '@vendure/admin-ui/core';\r\nimport { NotificationService } from '@vendure/admin-ui/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\nimport { ModalService } from '@vendure/admin-ui/core';\r\nimport { CUSTOMER_ROLE_CODE, SUPER_ADMIN_ROLE_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-role-list',\r\n templateUrl: './role-list.component.html',\r\n styleUrls: ['./role-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RoleListComponent\r\n extends BaseListComponent<GetRolesQuery, ItemOf<GetRolesQuery, 'roles'>>\r\n implements OnInit\r\n{\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n visibleRoles$: Observable<Array<ItemOf<GetRolesQuery, 'roles'>>>;\r\n\r\n constructor(\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.administrator.getRoles(...args),\r\n data => data.roles,\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.visibleRoles$ = this.items$.pipe(\r\n map(roles => roles.filter(role => role.code !== CUSTOMER_ROLE_CODE)),\r\n );\r\n }\r\n\r\n toggleDisplayLimit(role: ItemOf<GetRolesQuery, 'roles'>) {\r\n if (this.displayLimit[role.id] === role.permissions.length) {\r\n this.displayLimit[role.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[role.id] = role.permissions.length;\r\n }\r\n }\r\n\r\n isDefaultRole(role: Role): boolean {\r\n return role.code === SUPER_ADMIN_ROLE_CODE || role.code === CUSTOMER_ROLE_CODE;\r\n }\r\n\r\n deleteRole(id: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('settings.confirm-delete-role'),\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(response => (response ? this.dataService.administrator.deleteRole(id) : EMPTY)))\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Role',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Role',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<div class=\"test-result card\">\r\n <div class=\"card-header\">\r\n {{ 'settings.test-result' | translate }}\r\n </div>\r\n <div class=\"card-block\" *ngFor=\"let quote of testResult\">\r\n <div class=\"result-details\" [class.stale]=\"testDataUpdated\">\r\n <vdr-labeled-data [label]=\"'settings.shipping-method' | translate\">\r\n {{ quote.name }}\r\n </vdr-labeled-data>\r\n <div class=\"price-row\">\r\n <vdr-labeled-data [label]=\"'common.price' | translate\">\r\n {{ quote.price | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'common.price-with-tax' | translate\">\r\n {{ quote.priceWithTax | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n </div>\r\n <vdr-object-tree *ngIf=\"quote.metadata\" [value]=\"quote.metadata\"></vdr-object-tree>\r\n </div>\r\n </div>\r\n <div class=\"card-block\" *ngIf=\"testResult?.length === 0\">\r\n <clr-icon shape=\"ban\" class=\"is-solid error\"></clr-icon>\r\n {{ 'settings.no-eligible-shipping-methods' | translate }}\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-secondary\" (click)=\"runTest.emit()\" [disabled]=\"!okToRun\">\r\n {{ 'settings.test-shipping-methods' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { CurrencyCode, ShippingMethodQuote } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-shipping-eligibility-test-result',\r\n templateUrl: './shipping-eligibility-test-result.component.html',\r\n styleUrls: ['./shipping-eligibility-test-result.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ShippingEligibilityTestResultComponent {\r\n @Input() testResult: ShippingMethodQuote[];\r\n @Input() okToRun = false;\r\n @Input() testDataUpdated = false;\r\n @Input() currencyCode: CurrencyCode;\r\n @Output() runTest = new EventEmitter<void>();\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'settings.test-order' | translate }}\r\n </div>\r\n <table class=\"order-table table\" *ngIf=\"lines.length; else emptyPlaceholder\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let line of lines\" class=\"order-line\">\r\n <td class=\"align-middle thumb\">\r\n <img [src]=\"line.preview + '?preset=tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: currencyCode }}\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n [(ngModel)]=\"line.quantity\"\r\n (change)=\"updateQuantity()\"\r\n type=\"number\"\r\n max=\"9999\"\r\n min=\"1\"\r\n />\r\n <button class=\"icon-button\" (click)=\"removeLine(line)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ (line.unitPriceWithTax * line.quantity) | localeCurrency: currencyCode }}\r\n </td>\r\n </tr>\r\n <tr class=\"sub-total\">\r\n <td class=\"left\">{{ 'order.sub-total' | translate }}</td>\r\n <td></td>\r\n <td></td>\r\n <td></td>\r\n <td></td>\r\n <td>{{ subTotal | localeCurrency: currencyCode }}</td>\r\n </tr>\r\n </table>\r\n\r\n <ng-template #emptyPlaceholder>\r\n <div class=\"card-block empty-placeholder\">\r\n <div class=\"empty-text\">{{ 'settings.add-products-to-test-order' | translate }}</div>\r\n <clr-icon shape=\"arrow\" dir=\"down\" size=\"96\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n <div class=\"card-block\">\r\n <vdr-product-variant-selector (productSelected)=\"selectResult($event)\"> </vdr-product-variant-selector>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n LocalStorageService,\r\n ProductSelectorSearchQuery,\r\n} from '@vendure/admin-ui/core';\r\n\r\ntype SearchItem = ProductSelectorSearchQuery['search']['items'][number];\r\n\r\nexport interface TestOrderLine {\r\n id: string;\r\n name: string;\r\n preview: string;\r\n sku: string;\r\n unitPriceWithTax: number;\r\n quantity: number;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-test-order-builder',\r\n templateUrl: './test-order-builder.component.html',\r\n styleUrls: ['./test-order-builder.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TestOrderBuilderComponent implements OnInit {\r\n @Output() orderLinesChange = new EventEmitter<TestOrderLine[]>();\r\n lines: TestOrderLine[] = [];\r\n currencyCode: CurrencyCode;\r\n get subTotal(): number {\r\n return this.lines.reduce((sum, l) => sum + l.unitPriceWithTax * l.quantity, 0);\r\n }\r\n\r\n constructor(private dataService: DataService, private localStorageService: LocalStorageService) {}\r\n\r\n ngOnInit() {\r\n this.lines = this.loadFromLocalStorage();\r\n if (this.lines) {\r\n this.orderLinesChange.emit(this.lines);\r\n }\r\n this.dataService.settings.getActiveChannel('cache-first').single$.subscribe(result => {\r\n this.currencyCode = result.activeChannel.currencyCode;\r\n });\r\n }\r\n\r\n selectResult(result: SearchItem) {\r\n if (result) {\r\n this.addToLines(result);\r\n }\r\n }\r\n\r\n private addToLines(result: SearchItem) {\r\n if (!this.lines.find(l => l.id === result.productVariantId)) {\r\n this.lines.push({\r\n id: result.productVariantId,\r\n name: result.productVariantName,\r\n preview: result.productAsset?.preview ?? '',\r\n quantity: 1,\r\n sku: result.sku,\r\n unitPriceWithTax:\r\n (result.priceWithTax.__typename === 'SinglePrice' && result.priceWithTax.value) || 0,\r\n });\r\n this.persistToLocalStorage();\r\n this.orderLinesChange.emit(this.lines);\r\n }\r\n }\r\n\r\n updateQuantity() {\r\n this.persistToLocalStorage();\r\n this.orderLinesChange.emit(this.lines);\r\n }\r\n\r\n removeLine(line: TestOrderLine) {\r\n this.lines = this.lines.filter(l => l.id !== line.id);\r\n this.persistToLocalStorage();\r\n this.orderLinesChange.emit(this.lines);\r\n }\r\n\r\n private persistToLocalStorage() {\r\n this.localStorageService.setForCurrentLocation('shippingTestOrder', this.lines);\r\n }\r\n\r\n private loadFromLocalStorage(): TestOrderLine[] {\r\n return this.localStorageService.getForCurrentLocation('shippingTestOrder') || [];\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'settings.test-address' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <form [formGroup]=\"form\">\r\n <clr-input-container>\r\n <label>{{ 'customer.city' | translate }}</label>\r\n <input formControlName=\"city\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n <clr-input-container>\r\n <label>{{ 'customer.province' | translate }}</label>\r\n <input formControlName=\"province\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n <clr-input-container>\r\n <label>{{ 'customer.postal-code' | translate }}</label>\r\n <input formControlName=\"postalCode\" type=\"text\" clrInput />\r\n </clr-input-container>\r\n <clr-input-container>\r\n <label>{{ 'customer.country' | translate }}</label>\r\n <select name=\"countryCode\" formControlName=\"countryCode\" clrInput clrSelect>\r\n <option *ngFor=\"let country of availableCountries$ | async\" [value]=\"country.code\">\r\n {{ country.name }}\r\n </option>\r\n </select>\r\n </clr-input-container>\r\n </form>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { DataService, GetAvailableCountriesQuery, ItemOf, LocalStorageService } from '@vendure/admin-ui/core';\r\nimport { Observable, Subscription } from 'rxjs';\r\n\r\nexport interface TestAddress {\r\n city: string;\r\n province: string;\r\n postalCode: string;\r\n countryCode: string;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-test-address-form',\r\n templateUrl: './test-address-form.component.html',\r\n styleUrls: ['./test-address-form.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TestAddressFormComponent implements OnInit, OnDestroy {\r\n @Output() addressChange = new EventEmitter<TestAddress>();\r\n availableCountries$: Observable<Array<ItemOf<GetAvailableCountriesQuery, 'countries'>>>;\r\n form: FormGroup;\r\n private subscription: Subscription;\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private dataService: DataService,\r\n private localStorageService: LocalStorageService,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.availableCountries$ = this.dataService.settings\r\n .getAvailableCountries()\r\n .mapSingle(result => result.countries.items);\r\n const storedValue = this.localStorageService.getForCurrentLocation('shippingTestAddress');\r\n const initialValue: TestAddress = storedValue\r\n ? storedValue\r\n : {\r\n city: '',\r\n countryCode: '',\r\n postalCode: '',\r\n province: '',\r\n };\r\n this.addressChange.emit(initialValue);\r\n\r\n this.form = this.formBuilder.group(initialValue);\r\n this.subscription = this.form.valueChanges.subscribe(value => {\r\n this.localStorageService.setForCurrentLocation('shippingTestAddress', value);\r\n this.addressChange.emit(value);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"test-result card\"\r\n [ngClass]=\"{\r\n success: testResult?.eligible === true,\r\n error: testResult?.eligible === false,\r\n unknown: !testResult\r\n }\"\r\n>\r\n <div class=\"card-header\">\r\n {{ 'settings.test-result' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"result-details\" [class.stale]=\"testDataUpdated\">\r\n <vdr-labeled-data [label]=\"'settings.eligible' | translate\">\r\n <div class=\"eligible-icon\">\r\n <clr-icon\r\n shape=\"success-standard\"\r\n class=\"is-solid success\"\r\n *ngIf=\"testResult?.eligible\"\r\n ></clr-icon>\r\n <clr-icon\r\n shape=\"ban\"\r\n class=\"is-solid error\"\r\n *ngIf=\"testResult?.eligible === false\"\r\n ></clr-icon>\r\n <clr-icon shape=\"unknown-status\" *ngIf=\"!testResult\"></clr-icon>\r\n </div>\r\n {{ testResult?.eligible }}\r\n </vdr-labeled-data>\r\n <div class=\"price-row\">\r\n <vdr-labeled-data\r\n [label]=\"'common.price' | translate\"\r\n *ngIf=\"testResult?.quote?.price != null\"\r\n >\r\n {{ testResult.quote?.price | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data\r\n [label]=\"'common.price-with-tax' | translate\"\r\n *ngIf=\"testResult?.quote?.priceWithTax != null\"\r\n >\r\n {{ testResult.quote?.priceWithTax | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n </div>\r\n <vdr-object-tree\r\n *ngIf=\"testResult?.quote?.metadata\"\r\n [value]=\"testResult?.quote?.metadata\"\r\n ></vdr-object-tree>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-secondary\" (click)=\"runTest.emit()\" [disabled]=\"!okToRun\">\r\n {{ 'settings.test-shipping-method' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { CurrencyCode, TestShippingMethodResult } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-shipping-method-test-result',\r\n templateUrl: './shipping-method-test-result.component.html',\r\n styleUrls: ['./shipping-method-test-result.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ShippingMethodTestResultComponent {\r\n @Input() testResult: TestShippingMethodResult;\r\n @Input() okToRun = false;\r\n @Input() testDataUpdated = false;\r\n @Input() currencyCode: CurrencyCode;\r\n @Output() runTest = new EventEmitter<void>();\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"shipping-method-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]=\"detailForm.pristine || detailForm.invalid || !selectedChecker || !selectedCalculator\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n *vdrIfPermissions=\"updatePermission\"\r\n [disabled]=\"\r\n detailForm.pristine || detailForm.invalid || !selectedChecker || !selectedCalculator\r\n \"\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\" *ngIf=\"entity$ | async as shippingMethod\">\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]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateCode(shippingMethod.code, $event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n [readOnlyToggle]=\"updatePermission | hasPermission\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [label]=\"'common.description' | translate\"\r\n ></vdr-rich-text-editor>\r\n <vdr-form-field [label]=\"'settings.fulfillment-handler' | translate\" for=\"fulfillmentHandler\" class=\"mb2\">\r\n <select\r\n name=\"fulfillmentHandler\"\r\n formControlName=\"fulfillmentHandler\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option *ngFor=\"let handler of fulfillmentHandlers\" [value]=\"handler.code\">\r\n {{ handler.code }}: {{ handler.description }}\r\n </option>\r\n </select>\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=\"ShippingMethod\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n\r\n <vdr-custom-detail-component-host\r\n locationId=\"shipping-method-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n\r\n <div class=\"clr-row mt4\">\r\n <div class=\"clr-col\">\r\n <label class=\"clr-control-label\">{{ 'settings.shipping-eligibility-checker' | translate }}</label>\r\n <vdr-configurable-input\r\n *ngIf=\"selectedChecker && selectedCheckerDefinition\"\r\n [operation]=\"selectedChecker\"\r\n [operationDefinition]=\"selectedCheckerDefinition\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (remove)=\"selectedChecker = null\"\r\n formControlName=\"checker\"\r\n ></vdr-configurable-input>\r\n <div *ngIf=\"!selectedChecker || !selectedCheckerDefinition\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'common.select' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let checker of checkers\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectChecker(checker)\"\r\n >\r\n {{ checker.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n <div class=\"clr-col\">\r\n <label class=\"clr-control-label\">{{ 'settings.shipping-calculator' | translate }}</label>\r\n <vdr-configurable-input\r\n *ngIf=\"selectedCalculator && selectedCalculatorDefinition\"\r\n [operation]=\"selectedCalculator\"\r\n [operationDefinition]=\"selectedCalculatorDefinition\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (remove)=\"selectedCalculator = null\"\r\n formControlName=\"calculator\"\r\n ></vdr-configurable-input>\r\n <div *ngIf=\"!selectedCalculator || !selectedCalculatorDefinition\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'common.select' | translate }}\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let calculator of calculators\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"selectCalculator(calculator)\"\r\n >\r\n {{ calculator.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n<div class=\"testing-tool\">\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'settings.test-shipping-method' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <vdr-test-order-builder\r\n (orderLinesChange)=\"setTestOrderLines($event)\"\r\n ></vdr-test-order-builder>\r\n </div>\r\n <div class=\"clr-col\">\r\n <vdr-test-address-form\r\n (addressChange)=\"setTestAddress($event)\"\r\n ></vdr-test-address-form>\r\n <vdr-shipping-method-test-result\r\n [currencyCode]=\"(activeChannel$ | async)?.currencyCode\"\r\n [okToRun]=\"allTestDataPresent() && testDataUpdated && detailForm.valid\"\r\n [testDataUpdated]=\"testDataUpdated\"\r\n [testResult]=\"testResult$ | async\"\r\n (runTest)=\"runTest()\"\r\n ></vdr-shipping-method-test-result>\r\n </div>\r\n </div>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 configurableDefinitionToInstance,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n CreateShippingMethodInput,\r\n createUpdatedTranslatable,\r\n CustomFieldConfig,\r\n DataService,\r\n findTranslation,\r\n GetActiveChannelQuery,\r\n getConfigArgValue,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n ShippingMethod,\r\n ShippingMethodFragment,\r\n TestShippingMethodInput,\r\n TestShippingMethodResult,\r\n toConfigurableOperationInput,\r\n UpdateShippingMethodInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { combineLatest, merge, Observable, of, Subject } from 'rxjs';\r\nimport { mergeMap, switchMap, take, takeUntil } from 'rxjs/operators';\r\n\r\nimport { TestAddress } from '../test-address-form/test-address-form.component';\r\nimport { TestOrderLine } from '../test-order-builder/test-order-builder.component';\r\n\r\n@Component({\r\n selector: 'vdr-shipping-method-detail',\r\n templateUrl: './shipping-method-detail.component.html',\r\n styleUrls: ['./shipping-method-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ShippingMethodDetailComponent\r\n extends BaseDetailComponent<ShippingMethodFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm: FormGroup;\r\n checkers: ConfigurableOperationDefinition[] = [];\r\n calculators: ConfigurableOperationDefinition[] = [];\r\n fulfillmentHandlers: ConfigurableOperationDefinition[] = [];\r\n selectedChecker?: ConfigurableOperation | null;\r\n selectedCheckerDefinition?: ConfigurableOperationDefinition;\r\n selectedCalculator?: ConfigurableOperation | null;\r\n selectedCalculatorDefinition?: ConfigurableOperationDefinition;\r\n activeChannel$: Observable<GetActiveChannelQuery['activeChannel']>;\r\n testAddress: TestAddress;\r\n testOrderLines: TestOrderLine[];\r\n testDataUpdated = false;\r\n testResult$: Observable<TestShippingMethodResult | undefined>;\r\n customFields: CustomFieldConfig[];\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateShippingMethod];\r\n private fetchTestResult$ = new Subject<[TestAddress, TestOrderLine[]]>();\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('ShippingMethod');\r\n this.detailForm = this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: ['', Validators.required],\r\n description: '',\r\n fulfillmentHandler: ['', Validators.required],\r\n checker: {},\r\n calculator: {},\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n combineLatest([\r\n this.dataService.shippingMethod.getShippingMethodOperations().single$,\r\n this.entity$.pipe(take(1)),\r\n ]).subscribe(([data, entity]) => {\r\n this.checkers = data.shippingEligibilityCheckers;\r\n this.calculators = data.shippingCalculators;\r\n this.fulfillmentHandlers = data.fulfillmentHandlers;\r\n this.changeDetector.markForCheck();\r\n this.selectedCheckerDefinition = data.shippingEligibilityCheckers.find(\r\n c => c.code === (entity.checker && entity.checker.code),\r\n );\r\n this.selectedCalculatorDefinition = data.shippingCalculators.find(\r\n c => c.code === (entity.calculator && entity.calculator.code),\r\n );\r\n });\r\n\r\n this.activeChannel$ = this.dataService.settings\r\n .getActiveChannel()\r\n .mapStream(data => data.activeChannel);\r\n\r\n this.testResult$ = this.fetchTestResult$.pipe(\r\n switchMap(([address, lines]) => {\r\n if (!this.selectedChecker || !this.selectedCalculator) {\r\n return of(undefined);\r\n }\r\n const formValue = this.detailForm.value;\r\n const input: TestShippingMethodInput = {\r\n shippingAddress: { ...address, streetLine1: 'test' },\r\n lines: lines.map(l => ({ productVariantId: l.id, quantity: l.quantity })),\r\n checker: toConfigurableOperationInput(this.selectedChecker, formValue.checker),\r\n calculator: toConfigurableOperationInput(this.selectedCalculator, formValue.calculator),\r\n };\r\n return this.dataService.shippingMethod\r\n .testShippingMethod(input)\r\n .mapSingle(result => result.testShippingMethod);\r\n }),\r\n );\r\n\r\n // tslint:disable:no-non-null-assertion\r\n merge(\r\n this.detailForm.get(['checker'])!.valueChanges,\r\n this.detailForm.get(['calculator'])!.valueChanges,\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => (this.testDataUpdated = true));\r\n // tslint:enable:no-non-null-assertion\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n updateCode(currentCode: string, nameValue: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n selectChecker(checker: ConfigurableOperationDefinition) {\r\n this.selectedCheckerDefinition = checker;\r\n this.selectedChecker = configurableDefinitionToInstance(checker);\r\n const formControl = this.detailForm.get('checker');\r\n if (formControl) {\r\n formControl.clearValidators();\r\n formControl.updateValueAndValidity({ onlySelf: true });\r\n formControl.patchValue(this.selectedChecker);\r\n }\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n selectCalculator(calculator: ConfigurableOperationDefinition) {\r\n this.selectedCalculatorDefinition = calculator;\r\n this.selectedCalculator = configurableDefinitionToInstance(calculator);\r\n const formControl = this.detailForm.get('calculator');\r\n if (formControl) {\r\n formControl.clearValidators();\r\n formControl.updateValueAndValidity({ onlySelf: true });\r\n formControl.patchValue(this.selectedCalculator);\r\n }\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n create() {\r\n const selectedChecker = this.selectedChecker;\r\n const selectedCalculator = this.selectedCalculator;\r\n if (!selectedChecker || !selectedCalculator) {\r\n return;\r\n }\r\n combineLatest([this.entity$, this.languageCode$])\r\n .pipe(\r\n take(1),\r\n mergeMap(([shippingMethod, languageCode]) => {\r\n const formValue = this.detailForm.value;\r\n const input = {\r\n ...(this.getUpdatedShippingMethod(\r\n shippingMethod,\r\n this.detailForm,\r\n languageCode,\r\n ) as CreateShippingMethodInput),\r\n checker: toConfigurableOperationInput(selectedChecker, formValue.checker),\r\n calculator: toConfigurableOperationInput(selectedCalculator, formValue.calculator),\r\n };\r\n return this.dataService.shippingMethod.createShippingMethod(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ShippingMethod',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createShippingMethod.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'ShippingMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n const selectedChecker = this.selectedChecker;\r\n const selectedCalculator = this.selectedCalculator;\r\n if (!selectedChecker || !selectedCalculator) {\r\n return;\r\n }\r\n combineLatest([this.entity$, this.languageCode$])\r\n .pipe(\r\n take(1),\r\n mergeMap(([shippingMethod, languageCode]) => {\r\n const formValue = this.detailForm.value;\r\n const input = {\r\n ...(this.getUpdatedShippingMethod(\r\n shippingMethod,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateShippingMethodInput),\r\n checker: toConfigurableOperationInput(selectedChecker, formValue.checker),\r\n calculator: toConfigurableOperationInput(selectedCalculator, formValue.calculator),\r\n };\r\n return this.dataService.shippingMethod.updateShippingMethod(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ShippingMethod',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n // tslint:disable-next-line:no-console\r\n console.error(err);\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ShippingMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setTestOrderLines(event: TestOrderLine[]) {\r\n this.testOrderLines = event;\r\n this.testDataUpdated = true;\r\n }\r\n\r\n setTestAddress(event: TestAddress) {\r\n this.testAddress = event;\r\n this.testDataUpdated = true;\r\n }\r\n\r\n allTestDataPresent(): boolean {\r\n return !!(\r\n this.testAddress &&\r\n this.testOrderLines &&\r\n this.testOrderLines.length &&\r\n this.selectedChecker &&\r\n this.selectedCalculator\r\n );\r\n }\r\n\r\n runTest() {\r\n this.fetchTestResult$.next([this.testAddress, this.testOrderLines]);\r\n this.testDataUpdated = false;\r\n }\r\n\r\n /**\r\n * Given a ShippingMethod and the value of the detailForm, this method creates an updated copy which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedShippingMethod(\r\n shippingMethod: ShippingMethodFragment,\r\n formGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): Omit<CreateShippingMethodInput | UpdateShippingMethodInput, 'checker' | 'calculator'> {\r\n const formValue = formGroup.value;\r\n const input = createUpdatedTranslatable({\r\n translatable: shippingMethod,\r\n updatedFields: formValue,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: shippingMethod.name || '',\r\n description: shippingMethod.description || '',\r\n },\r\n });\r\n return { ...input, fulfillmentHandler: formValue.fulfillmentHandler };\r\n }\r\n\r\n protected setFormValues(shippingMethod: ShippingMethodFragment, languageCode: LanguageCode): void {\r\n const currentTranslation = findTranslation(shippingMethod, languageCode);\r\n this.detailForm.patchValue({\r\n name: currentTranslation?.name ?? '',\r\n description: currentTranslation?.description ?? '',\r\n code: shippingMethod.code,\r\n fulfillmentHandler: shippingMethod.fulfillmentHandlerCode,\r\n checker: shippingMethod.checker || {},\r\n calculator: shippingMethod.calculator || {},\r\n });\r\n if (!this.selectedChecker) {\r\n this.selectedChecker = shippingMethod.checker && {\r\n code: shippingMethod.checker.code,\r\n args: shippingMethod.checker.args.map(a => ({ ...a, value: getConfigArgValue(a.value) })),\r\n };\r\n }\r\n if (!this.selectedCalculator) {\r\n this.selectedCalculator = shippingMethod.calculator && {\r\n code: shippingMethod.calculator?.code,\r\n args: shippingMethod.calculator?.args.map(a => ({ ...a, value: getConfigArgValue(a.value) })),\r\n };\r\n }\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n shippingMethod,\r\n currentTranslation,\r\n );\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"shipping-method-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateSettings', 'CreateShippingMethod']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-shipping-method' | 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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.name' | 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-shippingMethod=\"item\">\r\n <td class=\"left align-middle\">{{ shippingMethod.code }}</td>\r\n <td class=\"left align-middle\">{{ shippingMethod.name }}</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]=\"['./', shippingMethod.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right 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 type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteShippingMethod(shippingMethod.id)\"\r\n [disabled]=\"!(['DeleteSettings', 'DeleteShippingMethod'] | 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\r\n<div class=\"testing-tool\">\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'settings.test-shipping-methods' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col\">\r\n <vdr-test-order-builder\r\n (orderLinesChange)=\"setTestOrderLines($event)\"\r\n ></vdr-test-order-builder>\r\n </div>\r\n <div class=\"clr-col\">\r\n <vdr-test-address-form\r\n (addressChange)=\"setTestAddress($event)\"\r\n ></vdr-test-address-form>\r\n <vdr-shipping-eligibility-test-result\r\n [currencyCode]=\"(activeChannel$ | async)?.currencyCode\"\r\n [okToRun]=\"allTestDataPresent()\"\r\n [testDataUpdated]=\"testDataUpdated\"\r\n [testResult]=\"testResult$ | async\"\r\n (runTest)=\"runTest()\"\r\n ></vdr-shipping-eligibility-test-result>\r\n </div>\r\n </div>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\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 BaseListComponent,\r\n DataService,\r\n GetActiveChannelQuery,\r\n GetShippingMethodListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n ShippingMethodQuote,\r\n TestEligibleShippingMethodsInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { switchMap, tap } from 'rxjs/operators';\r\n\r\nimport { TestAddress } from '../test-address-form/test-address-form.component';\r\nimport { TestOrderLine } from '../test-order-builder/test-order-builder.component';\r\n\r\n@Component({\r\n selector: 'vdr-shipping-method-list',\r\n templateUrl: './shipping-method-list.component.html',\r\n styleUrls: ['./shipping-method-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ShippingMethodListComponent\r\n extends BaseListComponent<\r\n GetShippingMethodListQuery,\r\n ItemOf<GetShippingMethodListQuery, 'shippingMethods'>\r\n >\r\n implements OnInit\r\n{\r\n activeChannel$: Observable<GetActiveChannelQuery['activeChannel']>;\r\n testAddress: TestAddress;\r\n testOrderLines: TestOrderLine[];\r\n testDataUpdated = false;\r\n testResult$: Observable<ShippingMethodQuote[] | undefined>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n private fetchTestResult$ = new Subject<[TestAddress, TestOrderLine[]]>();\r\n\r\n constructor(\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private dataService: DataService,\r\n private serverConfigService: ServerConfigService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) =>\r\n this.dataService.shippingMethod.getShippingMethods(...args).refetchOnChannelChange(),\r\n data => data.shippingMethods,\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.testResult$ = this.fetchTestResult$.pipe(\r\n switchMap(([address, lines]) => {\r\n const input: TestEligibleShippingMethodsInput = {\r\n shippingAddress: { ...address, streetLine1: 'test' },\r\n lines: lines.map(l => ({ productVariantId: l.id, quantity: l.quantity })),\r\n };\r\n return this.dataService.shippingMethod\r\n .testEligibleShippingMethods(input)\r\n .mapSingle(result => result.testEligibleShippingMethods);\r\n }),\r\n );\r\n this.activeChannel$ = this.dataService.settings\r\n .getActiveChannel()\r\n .mapStream(data => data.activeChannel);\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => this.refresh()));\r\n }\r\n\r\n deleteShippingMethod(id: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-shipping-method'),\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.shippingMethod.deleteShippingMethod(id) : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ShippingMethod',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'ShippingMethod',\r\n });\r\n },\r\n );\r\n }\r\n\r\n setTestOrderLines(event: TestOrderLine[]) {\r\n this.testOrderLines = event;\r\n this.testDataUpdated = true;\r\n }\r\n\r\n setTestAddress(event: TestAddress) {\r\n this.testAddress = event;\r\n this.testDataUpdated = true;\r\n }\r\n\r\n allTestDataPresent(): boolean {\r\n return !!(this.testAddress && this.testOrderLines && this.testOrderLines.length);\r\n }\r\n\r\n runTest() {\r\n this.fetchTestResult$.next([this.testAddress, this.testOrderLines]);\r\n this.testDataUpdated = false;\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"tax-category-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]=\"!saveButtonEnabled()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!saveButtonEnabled()\"\r\n *vdrIfPermissions=\"updatePermission\"\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\">\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]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.default-tax-category' | translate\" for=\"isDefault\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n id=\"isDefault\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"isDefault\"\r\n />\r\n </clr-toggle-wrapper>\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=\"TaxCategory\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"tax-category-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 ConfigurableOperation,\r\n CreateTaxCategoryInput,\r\n CustomFieldConfig,\r\n DataService,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n TaxCategoryFragment,\r\n UpdateTaxCategoryInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-tax-detail',\r\n templateUrl: './tax-category-detail.component.html',\r\n styleUrls: ['./tax-category-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TaxCategoryDetailComponent\r\n extends BaseDetailComponent<TaxCategoryFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n taxCategory$: Observable<TaxCategoryFragment>;\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateTaxCategory];\r\n\r\n private taxCondition: ConfigurableOperation;\r\n private taxAction: ConfigurableOperation;\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('TaxCategory');\r\n this.detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n isDefault: false,\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.taxCategory$ = this.entity$;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n saveButtonEnabled(): boolean {\r\n return this.detailForm.dirty && this.detailForm.valid;\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n const input = {\r\n name: formValue.name,\r\n isDefault: formValue.isDefault,\r\n customFields: formValue.customFields,\r\n } as CreateTaxCategoryInput;\r\n this.dataService.settings.createTaxCategory(input).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'TaxCategory',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createTaxCategory.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'TaxCategory',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n this.taxCategory$\r\n .pipe(\r\n take(1),\r\n mergeMap(taxCategory => {\r\n const input = {\r\n id: taxCategory.id,\r\n name: formValue.name,\r\n isDefault: formValue.isDefault,\r\n customFields: formValue.customFields,\r\n } as UpdateTaxCategoryInput;\r\n return this.dataService.settings.updateTaxCategory(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'TaxCategory',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'TaxCategory',\r\n });\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Update the form values when the entity changes.\r\n */\r\n protected setFormValues(entity: TaxCategoryFragment, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n name: entity.name,\r\n isDefault: entity.isDefault,\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get('customFields'), entity);\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"tax-category-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"['CreateSettings', 'CreateTaxCategory']\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-tax-category' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table [items]=\"taxCategories$ | async\">\r\n <vdr-dt-column>{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-taxCategory=\"item\">\r\n <td class=\"left align-middle\">{{ taxCategory.name }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-chip *ngIf=\"taxCategory.isDefault\">{{ 'common.default-tax-category' | translate }}</vdr-chip>\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]=\"['./', taxCategory.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right 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 type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteTaxCategory(taxCategory)\"\r\n [disabled]=\"!(['DeleteSettings', 'DeleteTaxCategory'] | 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 { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n DeletionResult,\r\n GetTaxCategoriesQuery,\r\n ModalService,\r\n NotificationService,\r\n QueryResult,\r\n TaxCategoryFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, Observable } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-tax-list',\r\n templateUrl: './tax-category-list.component.html',\r\n styleUrls: ['./tax-category-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TaxCategoryListComponent {\r\n taxCategories$: Observable<TaxCategoryFragment[]>;\r\n private queryResult: QueryResult<GetTaxCategoriesQuery>;\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {\r\n this.queryResult = this.dataService.settings.getTaxCategories();\r\n this.taxCategories$ = this.queryResult.mapStream(data => data.taxCategories);\r\n }\r\n\r\n deleteTaxCategory(taxCategory: TaxCategoryFragment) {\r\n return this.modalService\r\n .dialog({\r\n title: _('settings.confirm-delete-tax-category'),\r\n body: taxCategory.name,\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(res => (res ? this.dataService.settings.deleteTaxCategory(taxCategory.id) : EMPTY)),\r\n map(res => res.deleteTaxCategory),\r\n )\r\n .subscribe(\r\n res => {\r\n if (res.result === DeletionResult.DELETED) {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'TaxRate',\r\n });\r\n this.queryResult.ref.refetch();\r\n } else {\r\n this.notificationService.error(res.message || _('common.notify-delete-error'), {\r\n entity: 'TaxRate',\r\n });\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'TaxRate',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"tax-rate-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]=\"!saveButtonEnabled()\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!saveButtonEnabled()\"\r\n *vdrIfPermissions=\"updatePermission\"\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\">\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]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.enabled' | translate\" for=\"enabled\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n id=\"enabled\"\r\n formControlName=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.rate' | translate\" for=\"value\">\r\n <vdr-affixed-input suffix=\"%\">\r\n <input\r\n id=\"value\"\r\n type=\"number\"\r\n step=\"0.1\"\r\n formControlName=\"value\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-affixed-input>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.tax-category' | translate\" for=\"taxCategoryId\">\r\n <select\r\n clrSelect\r\n name=\"taxCategoryId\"\r\n formControlName=\"taxCategoryId\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option *ngFor=\"let taxCategory of taxCategories$ | async\" [value]=\"taxCategory.id\">\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'settings.zone' | translate\" for=\"zoneId\">\r\n <select\r\n clrSelect\r\n name=\"zoneId\"\r\n formControlName=\"zoneId\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option *ngFor=\"let zone of zones$ | async\" [value]=\"zone.id\">{{ zone.name }}</option>\r\n </select>\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=\"TaxRate\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"tax-rate-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, 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 CreateTaxRateInput,\r\n CustomerGroup,\r\n CustomFieldConfig,\r\n DataService,\r\n GetZonesQuery,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n ServerConfigService,\r\n TaxCategoryFragment,\r\n TaxRate,\r\n TaxRateFragment,\r\n UpdateTaxRateInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-tax-rate-detail',\r\n templateUrl: './tax-rate-detail.component.html',\r\n styleUrls: ['./tax-rate-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TaxRateDetailComponent\r\n extends BaseDetailComponent<TaxRateFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n taxCategories$: Observable<TaxCategoryFragment[]>;\r\n zones$: Observable<GetZonesQuery['zones']>;\r\n groups$: Observable<CustomerGroup[]>;\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateTaxRate];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n this.customFields = this.getCustomFieldConfig('TaxRate');\r\n this.detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n enabled: [true],\r\n value: [0, Validators.required],\r\n taxCategoryId: [''],\r\n zoneId: [''],\r\n customerGroupId: [''],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.taxCategories$ = this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories);\r\n this.zones$ = this.dataService.settings.getZones().mapSingle(data => data.zones);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n saveButtonEnabled(): boolean {\r\n return this.detailForm.dirty && this.detailForm.valid;\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n const input = {\r\n name: formValue.name,\r\n enabled: formValue.enabled,\r\n value: formValue.value,\r\n categoryId: formValue.taxCategoryId,\r\n zoneId: formValue.zoneId,\r\n customerGroupId: formValue.customerGroupId,\r\n customFields: formValue.customFields,\r\n } as CreateTaxRateInput;\r\n this.dataService.settings.createTaxRate(input).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'TaxRate',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createTaxRate.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'TaxRate',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(taxRate => {\r\n const input = {\r\n id: taxRate.id,\r\n name: formValue.name,\r\n enabled: formValue.enabled,\r\n value: formValue.value,\r\n categoryId: formValue.taxCategoryId,\r\n zoneId: formValue.zoneId,\r\n customerGroupId: formValue.customerGroupId,\r\n customFields: formValue.customFields,\r\n } as UpdateTaxRateInput;\r\n return this.dataService.settings.updateTaxRate(input);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'TaxRate',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'TaxRate',\r\n });\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Update the form values when the entity changes.\r\n */\r\n protected setFormValues(entity: TaxRateFragment, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n name: entity.name,\r\n enabled: entity.enabled,\r\n value: entity.value,\r\n taxCategoryId: entity.category ? entity.category.id : '',\r\n zoneId: entity.zone ? entity.zone.id : '',\r\n customerGroupId: entity.customerGroup ? entity.customerGroup.id : '',\r\n });\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get('customFields'), entity);\r\n }\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"tax-rate-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"['CreateSettings', 'CreateTaxRate']\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-tax-rate' | 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>{{ 'common.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.tax-category' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.zone' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'settings.tax-rate' | 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-taxRate=\"item\">\r\n <td class=\"left align-middle\">{{ taxRate.name }}</td>\r\n <td class=\"left align-middle\">{{ taxRate.category.name }}</td>\r\n <td class=\"left align-middle\">{{ taxRate.zone.name }}</td>\r\n <td class=\"left align-middle\">{{ taxRate.value }}%</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]=\"['./', taxRate.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td class=\"right 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 type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteTaxRate(taxRate)\"\r\n [disabled]=\"!(['DeleteSettings', 'DeleteTaxRate'] | 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 { ChangeDetectionStrategy, Component } from '@angular/core';\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 DeletionResult,\r\n GetTaxRateListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-tax-rate-list',\r\n templateUrl: './tax-rate-list.component.html',\r\n styleUrls: ['./tax-rate-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TaxRateListComponent extends BaseListComponent<\r\n GetTaxRateListQuery,\r\n ItemOf<GetTaxRateListQuery, 'taxRates'>\r\n> {\r\n constructor(\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.settings.getTaxRates(...args),\r\n data => data.taxRates,\r\n );\r\n }\r\n\r\n deleteTaxRate(taxRate: ItemOf<GetTaxRateListQuery, 'taxRates'>) {\r\n return this.modalService\r\n .dialog({\r\n title: _('settings.confirm-delete-tax-rate'),\r\n body: taxRate.name,\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(res => (res ? this.dataService.settings.deleteTaxRate(taxRate.id) : EMPTY)),\r\n map(res => res.deleteTaxRate),\r\n )\r\n .subscribe(\r\n res => {\r\n if (res.result === DeletionResult.DELETED) {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'TaxRate',\r\n });\r\n this.refresh();\r\n } else {\r\n this.notificationService.error(res.message || _('common.notify-delete-error'), {\r\n entity: 'TaxRate',\r\n });\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'TaxRate',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <span *ngIf=\"zone.id\">{{ 'settings.update-zone' | translate }}</span>\r\n <span *ngIf=\"!zone.id\">{{ 'settings.create-zone' | 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]=\"!(['UpdateSettings', 'UpdateZone'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Zone\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"form.get('customFields')\"\r\n [readonly]=\"!(['UpdateSettings', 'UpdateZone'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n</form>\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)=\"save()\" [disabled]=\"form.invalid\" class=\"btn btn-primary\">\r\n <span *ngIf=\"zone.id\">{{ 'settings.update-zone' | translate }}</span>\r\n <span *ngIf=\"!zone.id\">{{ 'settings.create-zone' | translate }}</span>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { CreateZoneInput, CustomFieldConfig, Dialog, ServerConfigService } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-zone-detail-dialog',\r\n templateUrl: './zone-detail-dialog.component.html',\r\n styleUrls: ['./zone-detail-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ZoneDetailDialogComponent implements Dialog<CreateZoneInput>, OnInit {\r\n zone: { id?: string; name: string; customFields?: { [name: string]: any } };\r\n resolveWith: (result?: CreateZoneInput) => void;\r\n\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('Zone');\r\n }\r\n\r\n ngOnInit() {\r\n this.form = this.formBuilder.group({\r\n name: [this.zone.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.zone.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>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"zone-list\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateSettings', 'CreateZone']\"\r\n (click)=\"create()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-zone' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<div class=\"zone-wrapper\">\r\n <div class=\"zone-list\">\r\n <table class=\"table mt0\">\r\n <tbody>\r\n <tr\r\n *ngFor=\"let zone of zones$ | async\"\r\n [class.active]=\"zone.id === (activeZone$ | async)?.id\"\r\n >\r\n <td class=\"left align-middle\"><vdr-entity-info [entity]=\"zone\"></vdr-entity-info></td>\r\n <td class=\"left align-middle\">\r\n <vdr-chip [colorFrom]=\"zone.name\">{{ zone.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: zone.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'settings.view-zone-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(zone)\">\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(zone.id)\"\r\n [disabled]=\"!(['DeleteSettings', 'DeleteZone'] | 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 <div class=\"zone-members\" [class.expanded]=\"activeZone$ | async\">\r\n <ng-container *ngIf=\"activeZone$ | async as activeZone\">\r\n <vdr-zone-member-list\r\n [members]=\"activeZone.members\"\r\n [selectedMemberIds]=\"selectedMemberIds\"\r\n (selectionChange)=\"selectedMemberIds = $event\"\r\n >\r\n <div *vdrZoneMemberListHeader>\r\n <div class=\"flex\">\r\n <div class=\"header-title-row\">\r\n {{ activeZone.name }} ({{ activeZone.members.length }})\r\n </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]=\"selectedMemberIds.length === 0\"\r\n >\r\n {{ 'common.with-selected' | translate: { count: selectedMemberIds.length } }}\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)=\"removeFromZone(activeZone, selectedMemberIds)\"\r\n vdrDropdownItem\r\n [disabled]=\"!(['UpdateSettings', 'UpdateZone'] | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'settings.remove-from-zone' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n <button class=\"btn btn-secondary btn-sm\" (click)=\"addToZone(activeZone)\">\r\n {{ 'settings.add-countries-to-zone' | translate: { zoneName: activeZone.name } }}\r\n </button>\r\n </div>\r\n </div>\r\n <div *vdrZoneMemberControls=\"let member = member\">\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 <a\r\n type=\"button\"\r\n [routerLink]=\"['/settings', 'countries', member.id]\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </a>\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"removeFromZone(activeZone, [member.id])\"\r\n vdrDropdownItem\r\n [disabled]=\"!(['UpdateSettings', 'UpdateZone'] | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'settings.remove-from-zone' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </vdr-zone-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 GetZonesQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, EMPTY, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, mapTo, switchMap, tap } from 'rxjs/operators';\r\n\r\nimport { AddCountryToZoneDialogComponent } from '../add-country-to-zone-dialog/add-country-to-zone-dialog.component';\r\nimport { ZoneDetailDialogComponent } from '../zone-detail-dialog/zone-detail-dialog.component';\r\n\r\n@Component({\r\n selector: 'vdr-zone-list',\r\n templateUrl: './zone-list.component.html',\r\n styleUrls: ['./zone-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ZoneListComponent implements OnInit {\r\n activeZone$: Observable<GetZonesQuery['zones'][number] | undefined>;\r\n zones$: Observable<GetZonesQuery['zones']>;\r\n members$: Observable<GetZonesQuery['zones'][number]['members']>;\r\n availableLanguages$: Observable<LanguageCode[]>;\r\n contentLanguage$: Observable<LanguageCode>;\r\n selectedMemberIds: string[] = [];\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private serverConfigService: ServerConfigService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n const zonesQueryRef = this.dataService.settings.getZones().ref;\r\n this.zones$ = zonesQueryRef.valueChanges.pipe(map(data => data.data.zones));\r\n const activeZoneId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n tap(() => (this.selectedMemberIds = [])),\r\n );\r\n this.activeZone$ = combineLatest(this.zones$, activeZoneId$).pipe(\r\n map(([zones, activeZoneId]) => {\r\n if (activeZoneId) {\r\n return zones.find(z => z.id === activeZoneId);\r\n }\r\n }),\r\n );\r\n this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();\r\n this.contentLanguage$ = this.dataService.client\r\n .uiState()\r\n .mapStream(({ uiState }) => uiState.contentLanguage)\r\n .pipe(tap(() => zonesQueryRef.refetch()));\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n create() {\r\n this.modalService\r\n .fromComponent(ZoneDetailDialogComponent, { locals: { zone: { name: '' } } })\r\n .pipe(\r\n switchMap(result =>\r\n result ? this.dataService.settings.createZone({ ...result, memberIds: [] }) : EMPTY,\r\n ),\r\n // refresh list\r\n switchMap(() => this.dataService.settings.getZones().single$),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Zone',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Zone',\r\n });\r\n },\r\n );\r\n }\r\n\r\n delete(zoneId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-zone'),\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 => (response ? this.dataService.settings.deleteZone(zoneId) : EMPTY)),\r\n\r\n switchMap(result => {\r\n if (result.deleteZone.result === DeletionResult.DELETED) {\r\n // refresh list\r\n return this.dataService.settings\r\n .getZones()\r\n .mapSingle(() => ({ errorMessage: false }));\r\n } else {\r\n return of({ errorMessage: result.deleteZone.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: 'Zone',\r\n });\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Zone',\r\n });\r\n },\r\n );\r\n }\r\n\r\n update(zone: GetZonesQuery['zones'][number]) {\r\n this.modalService\r\n .fromComponent(ZoneDetailDialogComponent, { locals: { zone } })\r\n .pipe(\r\n switchMap(result =>\r\n result ? this.dataService.settings.updateZone({ id: zone.id, ...result }) : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Zone',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Zone',\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 addToZone(zone: GetZonesQuery['zones'][number]) {\r\n this.modalService\r\n .fromComponent(AddCountryToZoneDialogComponent, {\r\n locals: {\r\n zoneName: zone.name,\r\n currentMembers: zone.members,\r\n },\r\n size: 'md',\r\n })\r\n .pipe(\r\n switchMap(memberIds =>\r\n memberIds\r\n ? this.dataService.settings\r\n .addMembersToZone(zone.id, memberIds)\r\n .pipe(mapTo(memberIds))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe({\r\n next: result => {\r\n this.notificationService.success(_(`settings.add-countries-to-zone-success`), {\r\n countryCount: result.length,\r\n zoneName: zone.name,\r\n });\r\n },\r\n error: err => {\r\n this.notificationService.error(err);\r\n },\r\n });\r\n }\r\n\r\n removeFromZone(zone: GetZonesQuery['zones'][number], memberIds: string[]) {\r\n this.dataService.settings.removeMembersFromZone(zone.id, memberIds).subscribe({\r\n complete: () => {\r\n this.notificationService.success(_(`settings.remove-countries-from-zone-success`), {\r\n countryCount: memberIds.length,\r\n zoneName: zone.name,\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 { AdministratorFragment, BaseEntityResolver, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AdministratorResolver extends BaseEntityResolver<AdministratorFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Administrator' as 'Administrator',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n emailAddress: '',\r\n firstName: '',\r\n lastName: '',\r\n user: { roles: [] } as any,\r\n },\r\n id => dataService.administrator.getAdministrator(id).mapStream(data => data.administrator),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n BaseEntityResolver,\r\n ChannelFragment,\r\n CurrencyCode,\r\n DataService,\r\n getDefaultUiLanguage,\r\n} from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChannelResolver extends BaseEntityResolver<ChannelFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Channel',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n code: '',\r\n token: '',\r\n pricesIncludeTax: false,\r\n currencyCode: CurrencyCode.USD,\r\n defaultLanguageCode: getDefaultUiLanguage(),\r\n defaultShippingZone: {} as any,\r\n defaultTaxZone: {} as any,\r\n },\r\n id => dataService.settings.getChannel(id).mapStream(data => data.channel),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, CountryFragment, DataService } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CountryResolver extends BaseEntityResolver<CountryFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Country',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n code: '',\r\n name: '',\r\n enabled: false,\r\n translations: [],\r\n },\r\n id => dataService.settings.getCountry(id).mapStream(data => data.country),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, GetGlobalSettingsQuery } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the global settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GlobalSettingsResolver extends BaseEntityResolver<GetGlobalSettingsQuery['globalSettings']> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n // we will never be creating a new GlobalSettings entity, so this part is not used.\r\n {} as any,\r\n () => dataService.settings.getGlobalSettings().mapStream(data => data.globalSettings),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, PaymentMethodFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PaymentMethodResolver extends BaseEntityResolver<PaymentMethodFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'PaymentMethod',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n code: '',\r\n description: '',\r\n enabled: true,\r\n checker: undefined as any,\r\n handler: undefined as any,\r\n },\r\n id => dataService.settings.getPaymentMethod(id).mapStream(data => data.paymentMethod),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AdministratorFragment, BaseEntityResolver, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProfileResolver extends BaseEntityResolver<AdministratorFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Administrator' as 'Administrator',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n emailAddress: '',\r\n firstName: '',\r\n lastName: '',\r\n user: { roles: [] } as any,\r\n },\r\n id =>\r\n dataService.administrator\r\n .getActiveAdministrator()\r\n .mapStream(data => data.activeAdministrator),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, RoleFragment } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RoleResolver extends BaseEntityResolver<RoleFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Role' as 'Role',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n code: '',\r\n description: '',\r\n permissions: [],\r\n channels: [],\r\n },\r\n id => dataService.administrator.getRole(id).mapStream(data => data.role),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, ShippingMethodFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ShippingMethodResolver extends BaseEntityResolver<ShippingMethodFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'ShippingMethod',\r\n createdAt: '',\r\n updatedAt: '',\r\n id: '',\r\n code: '',\r\n name: '',\r\n description: '',\r\n fulfillmentHandlerCode: undefined as any,\r\n checker: undefined as any,\r\n calculator: undefined as any,\r\n translations: [],\r\n },\r\n id => dataService.shippingMethod.getShippingMethod(id).mapStream(data => data.shippingMethod),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, TaxCategoryFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TaxCategoryResolver extends BaseEntityResolver<TaxCategoryFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'TaxCategory',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n isDefault: false,\r\n },\r\n id => dataService.settings.getTaxCategory(id).mapStream(data => data.taxCategory),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, TaxRateFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TaxRateResolver extends BaseEntityResolver<TaxRateFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'TaxRate',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n value: 0,\r\n enabled: true,\r\n category: {} as any,\r\n zone: {} as any,\r\n customerGroup: null,\r\n },\r\n id => dataService.settings.getTaxRate(id).mapStream(data => data.taxRate),\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 Administrator,\r\n CanDeactivateDetailGuard,\r\n Channel,\r\n CountryFragment,\r\n createResolveData,\r\n detailBreadcrumb,\r\n PaymentMethodFragment,\r\n Role,\r\n ShippingMethodFragment,\r\n TaxCategoryFragment,\r\n TaxRateFragment,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { AdminDetailComponent } from './components/admin-detail/admin-detail.component';\r\nimport { AdministratorListComponent } from './components/administrator-list/administrator-list.component';\r\nimport { ChannelDetailComponent } from './components/channel-detail/channel-detail.component';\r\nimport { ChannelListComponent } from './components/channel-list/channel-list.component';\r\nimport { CountryDetailComponent } from './components/country-detail/country-detail.component';\r\nimport { CountryListComponent } from './components/country-list/country-list.component';\r\nimport { GlobalSettingsComponent } from './components/global-settings/global-settings.component';\r\nimport { PaymentMethodDetailComponent } from './components/payment-method-detail/payment-method-detail.component';\r\nimport { PaymentMethodListComponent } from './components/payment-method-list/payment-method-list.component';\r\nimport { ProfileComponent } from './components/profile/profile.component';\r\nimport { RoleDetailComponent } from './components/role-detail/role-detail.component';\r\nimport { RoleListComponent } from './components/role-list/role-list.component';\r\nimport { ShippingMethodDetailComponent } from './components/shipping-method-detail/shipping-method-detail.component';\r\nimport { ShippingMethodListComponent } from './components/shipping-method-list/shipping-method-list.component';\r\nimport { TaxCategoryDetailComponent } from './components/tax-category-detail/tax-category-detail.component';\r\nimport { TaxCategoryListComponent } from './components/tax-category-list/tax-category-list.component';\r\nimport { TaxRateDetailComponent } from './components/tax-rate-detail/tax-rate-detail.component';\r\nimport { TaxRateListComponent } from './components/tax-rate-list/tax-rate-list.component';\r\nimport { ZoneListComponent } from './components/zone-list/zone-list.component';\r\nimport { AdministratorResolver } from './providers/routing/administrator-resolver';\r\nimport { ChannelResolver } from './providers/routing/channel-resolver';\r\nimport { CountryResolver } from './providers/routing/country-resolver';\r\nimport { GlobalSettingsResolver } from './providers/routing/global-settings-resolver';\r\nimport { PaymentMethodResolver } from './providers/routing/payment-method-resolver';\r\nimport { ProfileResolver } from './providers/routing/profile-resolver';\r\nimport { RoleResolver } from './providers/routing/role-resolver';\r\nimport { ShippingMethodResolver } from './providers/routing/shipping-method-resolver';\r\nimport { TaxCategoryResolver } from './providers/routing/tax-category-resolver';\r\nimport { TaxRateResolver } from './providers/routing/tax-rate-resolver';\r\n\r\nexport const settingsRoutes: Route[] = [\r\n {\r\n path: 'profile',\r\n component: ProfileComponent,\r\n resolve: createResolveData(ProfileResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: _('breadcrumb.profile'),\r\n },\r\n },\r\n {\r\n path: 'administrators',\r\n component: AdministratorListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.administrators'),\r\n },\r\n },\r\n {\r\n path: 'administrators/:id',\r\n component: AdminDetailComponent,\r\n resolve: createResolveData(AdministratorResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: { breadcrumb: administratorBreadcrumb },\r\n },\r\n {\r\n path: 'channels',\r\n component: ChannelListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.channels'),\r\n },\r\n },\r\n {\r\n path: 'channels/:id',\r\n component: ChannelDetailComponent,\r\n resolve: createResolveData(ChannelResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: { breadcrumb: channelBreadcrumb },\r\n },\r\n {\r\n path: 'roles',\r\n component: RoleListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.roles'),\r\n },\r\n },\r\n {\r\n path: 'roles/:id',\r\n component: RoleDetailComponent,\r\n resolve: createResolveData(RoleResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: { breadcrumb: roleBreadcrumb },\r\n },\r\n {\r\n path: 'tax-categories',\r\n component: TaxCategoryListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.tax-categories'),\r\n },\r\n },\r\n {\r\n path: 'tax-categories/:id',\r\n component: TaxCategoryDetailComponent,\r\n resolve: createResolveData(TaxCategoryResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: taxCategoryBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'tax-rates',\r\n component: TaxRateListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.tax-rates'),\r\n },\r\n },\r\n {\r\n path: 'tax-rates/:id',\r\n component: TaxRateDetailComponent,\r\n resolve: createResolveData(TaxRateResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: taxRateBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'countries',\r\n component: CountryListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.countries'),\r\n },\r\n },\r\n {\r\n path: 'countries/:id',\r\n component: CountryDetailComponent,\r\n resolve: createResolveData(CountryResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: countryBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'zones',\r\n component: ZoneListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.zones'),\r\n },\r\n },\r\n {\r\n path: 'shipping-methods',\r\n component: ShippingMethodListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.shipping-methods'),\r\n },\r\n },\r\n {\r\n path: 'shipping-methods/:id',\r\n component: ShippingMethodDetailComponent,\r\n resolve: createResolveData(ShippingMethodResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: shippingMethodBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'payment-methods',\r\n component: PaymentMethodListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.payment-methods'),\r\n },\r\n },\r\n {\r\n path: 'payment-methods/:id',\r\n component: PaymentMethodDetailComponent,\r\n resolve: createResolveData(PaymentMethodResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: paymentMethodBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'global-settings',\r\n component: GlobalSettingsComponent,\r\n resolve: createResolveData(GlobalSettingsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: _('breadcrumb.global-settings'),\r\n },\r\n },\r\n];\r\n\r\nexport function administratorBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<Administrator>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.administrators',\r\n getName: admin => `${admin.firstName} ${admin.lastName}`,\r\n route: 'administrators',\r\n });\r\n}\r\n\r\nexport function channelBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<Channel>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.channels',\r\n getName: channel => channel.code,\r\n route: 'channels',\r\n });\r\n}\r\n\r\nexport function roleBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<Role>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.roles',\r\n getName: role => role.description,\r\n route: 'roles',\r\n });\r\n}\r\n\r\nexport function taxCategoryBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<TaxCategoryFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.tax-categories',\r\n getName: category => category.name,\r\n route: 'tax-categories',\r\n });\r\n}\r\n\r\nexport function taxRateBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<TaxRateFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.tax-rates',\r\n getName: category => category.name,\r\n route: 'tax-rates',\r\n });\r\n}\r\n\r\nexport function countryBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<CountryFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.countries',\r\n getName: promotion => promotion.name,\r\n route: 'countries',\r\n });\r\n}\r\n\r\nexport function shippingMethodBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<ShippingMethodFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.shipping-methods',\r\n getName: method => method.name,\r\n route: 'shipping-methods',\r\n });\r\n}\r\n\r\nexport function paymentMethodBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<PaymentMethodFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.payment-methods',\r\n getName: method => method.code,\r\n route: 'payment-methods',\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 { AddCountryToZoneDialogComponent } from './components/add-country-to-zone-dialog/add-country-to-zone-dialog.component';\r\nimport { AdminDetailComponent } from './components/admin-detail/admin-detail.component';\r\nimport { AdministratorListComponent } from './components/administrator-list/administrator-list.component';\r\nimport { ChannelDetailComponent } from './components/channel-detail/channel-detail.component';\r\nimport { ChannelListComponent } from './components/channel-list/channel-list.component';\r\nimport { CountryDetailComponent } from './components/country-detail/country-detail.component';\r\nimport { CountryListComponent } from './components/country-list/country-list.component';\r\nimport { GlobalSettingsComponent } from './components/global-settings/global-settings.component';\r\nimport { PaymentMethodDetailComponent } from './components/payment-method-detail/payment-method-detail.component';\r\nimport { PaymentMethodListComponent } from './components/payment-method-list/payment-method-list.component';\r\nimport { PermissionGridComponent } from './components/permission-grid/permission-grid.component';\r\nimport { ProfileComponent } from './components/profile/profile.component';\r\nimport { RoleDetailComponent } from './components/role-detail/role-detail.component';\r\nimport { RoleListComponent } from './components/role-list/role-list.component';\r\nimport { ShippingEligibilityTestResultComponent } from './components/shipping-eligibility-test-result/shipping-eligibility-test-result.component';\r\nimport { ShippingMethodDetailComponent } from './components/shipping-method-detail/shipping-method-detail.component';\r\nimport { ShippingMethodListComponent } from './components/shipping-method-list/shipping-method-list.component';\r\nimport { ShippingMethodTestResultComponent } from './components/shipping-method-test-result/shipping-method-test-result.component';\r\nimport { TaxCategoryDetailComponent } from './components/tax-category-detail/tax-category-detail.component';\r\nimport { TaxCategoryListComponent } from './components/tax-category-list/tax-category-list.component';\r\nimport { TaxRateDetailComponent } from './components/tax-rate-detail/tax-rate-detail.component';\r\nimport { TaxRateListComponent } from './components/tax-rate-list/tax-rate-list.component';\r\nimport { TestAddressFormComponent } from './components/test-address-form/test-address-form.component';\r\nimport { TestOrderBuilderComponent } from './components/test-order-builder/test-order-builder.component';\r\nimport { ZoneDetailDialogComponent } from './components/zone-detail-dialog/zone-detail-dialog.component';\r\nimport { ZoneListComponent } from './components/zone-list/zone-list.component';\r\nimport { ZoneMemberControlsDirective } from './components/zone-member-list/zone-member-controls.directive';\r\nimport { ZoneMemberListHeaderDirective } from './components/zone-member-list/zone-member-list-header.directive';\r\nimport { ZoneMemberListComponent } from './components/zone-member-list/zone-member-list.component';\r\nimport { settingsRoutes } from './settings.routes';\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild(settingsRoutes)],\r\n declarations: [\r\n TaxCategoryListComponent,\r\n TaxCategoryDetailComponent,\r\n AdministratorListComponent,\r\n RoleListComponent,\r\n RoleDetailComponent,\r\n AdminDetailComponent,\r\n PermissionGridComponent,\r\n CountryListComponent,\r\n CountryDetailComponent,\r\n TaxRateListComponent,\r\n TaxRateDetailComponent,\r\n ChannelListComponent,\r\n ChannelDetailComponent,\r\n ShippingMethodListComponent,\r\n ShippingMethodDetailComponent,\r\n PaymentMethodListComponent,\r\n PaymentMethodDetailComponent,\r\n GlobalSettingsComponent,\r\n TestOrderBuilderComponent,\r\n TestAddressFormComponent,\r\n ShippingMethodTestResultComponent,\r\n ShippingEligibilityTestResultComponent,\r\n ZoneListComponent,\r\n AddCountryToZoneDialogComponent,\r\n ZoneMemberListComponent,\r\n ZoneMemberListHeaderDirective,\r\n ZoneMemberControlsDirective,\r\n ZoneDetailDialogComponent,\r\n ProfileComponent,\r\n ],\r\n})\r\nexport class SettingsModule {}\r\n"],"sourceRoot":"webpack:///","file":"26.5cc3bfffe8943e16.js"}
|