@vendure/admin-ui-plugin 2.0.0-next.26 → 2.0.0-next.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/lib/admin-ui/165.99858ece18dc120c.js +2 -0
  2. package/lib/admin-ui/165.99858ece18dc120c.js.map +1 -0
  3. package/lib/admin-ui/{239.bc59928cd01c7e91.js → 239.a982ff8d6475746a.js} +2 -2
  4. package/lib/admin-ui/{239.bc59928cd01c7e91.js.map → 239.a982ff8d6475746a.js.map} +1 -1
  5. package/lib/admin-ui/301.202b1b3619eb3f3c.js +34 -0
  6. package/lib/admin-ui/301.202b1b3619eb3f3c.js.map +1 -0
  7. package/lib/admin-ui/{316.d7ad74308299e698.js → 316.88c4a6c9c4175062.js} +2 -2
  8. package/lib/admin-ui/{316.d7ad74308299e698.js.map → 316.88c4a6c9c4175062.js.map} +1 -1
  9. package/lib/admin-ui/{356.35ca041b6f7a6cc0.js → 356.b1ecffed6ff6f23a.js} +2 -2
  10. package/lib/admin-ui/{356.35ca041b6f7a6cc0.js.map → 356.b1ecffed6ff6f23a.js.map} +1 -1
  11. package/lib/admin-ui/{430.4469edebdd7335b3.js → 430.5a4460b29406b96c.js} +2 -2
  12. package/lib/admin-ui/{430.4469edebdd7335b3.js.map → 430.5a4460b29406b96c.js.map} +1 -1
  13. package/lib/admin-ui/434.4f08fadf75c20ed8.js +2 -0
  14. package/lib/admin-ui/434.4f08fadf75c20ed8.js.map +1 -0
  15. package/lib/admin-ui/{625.b3ffd6dd39d19338.js → 625.fd3c9435e5d0d84a.js} +2 -2
  16. package/lib/admin-ui/{625.b3ffd6dd39d19338.js.map → 625.fd3c9435e5d0d84a.js.map} +1 -1
  17. package/lib/admin-ui/{654.d4c38af0c765576f.js → 654.428f5962bcdb414b.js} +2 -2
  18. package/lib/admin-ui/{654.d4c38af0c765576f.js.map → 654.428f5962bcdb414b.js.map} +1 -1
  19. package/lib/admin-ui/common.8d822adf80a60465.js.map +1 -1
  20. package/lib/admin-ui/i18n-messages/cs.json +10 -0
  21. package/lib/admin-ui/i18n-messages/de.json +11 -3
  22. package/lib/admin-ui/i18n-messages/en.json +11 -3
  23. package/lib/admin-ui/i18n-messages/es.json +10 -0
  24. package/lib/admin-ui/i18n-messages/fr.json +10 -0
  25. package/lib/admin-ui/i18n-messages/it.json +10 -0
  26. package/lib/admin-ui/i18n-messages/pl.json +10 -0
  27. package/lib/admin-ui/i18n-messages/pt_BR.json +10 -0
  28. package/lib/admin-ui/i18n-messages/pt_PT.json +10 -0
  29. package/lib/admin-ui/i18n-messages/ru.json +10 -0
  30. package/lib/admin-ui/i18n-messages/uk.json +10 -0
  31. package/lib/admin-ui/i18n-messages/zh_Hans.json +10 -0
  32. package/lib/admin-ui/i18n-messages/zh_Hant.json +10 -0
  33. package/lib/admin-ui/index.html +1 -1
  34. package/lib/admin-ui/main.dc4537f6f7a80566.js +3020 -0
  35. package/lib/admin-ui/main.dc4537f6f7a80566.js.map +1 -0
  36. package/lib/admin-ui/runtime.4a85fe701293609b.js +2 -0
  37. package/lib/admin-ui/runtime.4a85fe701293609b.js.map +1 -0
  38. package/package.json +4 -4
  39. package/lib/admin-ui/165.6aeb6ecf722558ee.js +0 -2
  40. package/lib/admin-ui/165.6aeb6ecf722558ee.js.map +0 -1
  41. package/lib/admin-ui/26.6407e52b6e31b210.js +0 -2
  42. package/lib/admin-ui/26.6407e52b6e31b210.js.map +0 -1
  43. package/lib/admin-ui/496.e4c426e8cc0f3034.js +0 -12
  44. package/lib/admin-ui/496.e4c426e8cc0f3034.js.map +0 -1
  45. package/lib/admin-ui/main.d521c77cc07c4f33.js +0 -2954
  46. package/lib/admin-ui/main.d521c77cc07c4f33.js.map +0 -1
  47. package/lib/admin-ui/runtime.bb59058c40cd3ad0.js +0 -2
  48. package/lib/admin-ui/runtime.bb59058c40cd3ad0.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","F","i","resolveWith","se","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","v","Object","getAvailableChannels","values","selectedRolePermissions","init","administrator$","entity$","allRoles$","administrator","getRoles","ae","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","L","updateAdministrator","setFormValues","patchValue","user","setCustomFieldFormValues","setValidators","channels","Set","forEach","keys","has","channelCode","le","deleteAdministrator","setQueryFn","getAdministrators","administrators","modalService","dialog","title","c","body","buttons","type","returnValue","J","refresh","ce","token","pricesIncludeTax","currencyCode","defaultShippingZoneId","defaultLanguageCode","defaultTaxZoneId","sellerId","zones$","getZones","mapSingle","zones","sellers$","getSellers","sellers","availableLanguageCodes$","getAvailableLanguages","saveButtonEnabled","dirty","valid","createChannel","auth","currentUser","me","T","updateUserChannels","__typename","message","updateChannel","generateToken","defaultShippingZone","defaultTaxZone","seller","Math","random","toString","substr","de","deleteChannel","channels$","refresh$","Z","getChannels","isDefaultChannel","next","ue","enabled","country$","Q","languageCode$","translatable","updatedFields","customFieldConfig","languageCode","defaultTranslation","createCountry","updateCountry","pe","deleteCountry","contentLanguage$","uiState","contentLanguage","searchTerm","valueChanges","countriesWithZones$","find","availableLanguages$","destroy$","complete","setLanguage","setContentLanguage","result","isZone","hasOwnProperty","ge","clear","call","availableLanguages","trackInventory","outOfStockThreshold","updateGlobalSettings","refreshGlobalSettings","globalSettings","_e","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","he","deletePaymentMethod","getPaymentMethods","refetchOnChannelChange","paymentMethods","showModalAndDelete","fe","updateActiveAdministrator","be","channelIds","role$","On","createRole","updateRole","detectChanges","ve","toggleDisplayLimit","deleteRole","visibleRoles$","items$","displayLimit","initialLimit","isDefaultRole","Ze","createSeller","updateSeller","Ce","deleteSeller","ye","xe","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","G","selectCalculator","setTestOrderLines","setTestAddress","runTest","Te","fulfillmentHandler","calculator","shippingMethod","getShippingMethodOperations","shippingEligibilityCheckers","calculators","shippingCalculators","fulfillmentHandlers","selectedCalculatorDefinition","activeChannel$","testResult$","fetchTestResult$","selectedCalculator","We","shippingAddress","streetLine1","testShippingMethod","bo","vo","testDataUpdated","getUpdatedShippingMethod","createShippingMethod","updateShippingMethod","console","testOrderLines","testAddress","allTestDataPresent","fulfillmentHandlerCode","Ae","deleteShippingMethod","getShippingMethods","shippingMethods","testEligibleShippingMethods","Le","isDefault","taxCategory$","createTaxCategory","updateTaxCategory","Fe","deleteTaxCategory","queryResult","getTaxCategories","taxCategories$","taxCategories","ref","refetch","Je","taxCategoryId","zoneId","customerGroupId","categoryId","createTaxRate","updateTaxRate","category","zone","customerGroup","Se","deleteTaxRate","getTaxRates","taxRates","qe","getCustomFieldsFor","H","update","delete","closeMembers","addToZone","removeFromZone","data","paramMap","Si","activeZone$","fromComponent","locals","createZone","memberIds","deleteZone","errorMessage","updateZone","snapshot","params","contents","queryParamsHandling","zoneName","size","addMembersToZone","countryCount","removeMembersFromZone","De","createdAt","updatedAt","getAdministrator","V","factory","getChannel","channel","B","translations","getCountry","country","K","getGlobalSettings","W","getPaymentMethod","paymentMethod","X","getActiveAdministrator","activeAdministrator","ee","getRole","role","te","getSeller","ne","getShippingMethod","oe","getTaxCategory","taxCategory","ie","getTaxRate","taxRate","re","tt","path","component","resolve","canDeactivate","breadcrumb","nt","ot","it","rt","st","at","lt","ct","dt","o","breadcrumbKey","getName","ke","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/seller-detail/seller-detail.component.html","./src/lib/settings/src/components/seller-detail/seller-detail.component.ts","./src/lib/settings/src/components/seller-list/seller-list.component.html","./src/lib/settings/src/components/seller-list/seller-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/seller-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]=\"!(['CreateAdministrator', '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]=\"!(['CreateAdministrator', '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]=\"!(['CreateAdministrator', '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) && (['CreateAdministrator', '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]=\"!(['CreateAdministrator', '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 (\r\n !userStatus.permissions.includes(Permission.CreateAdministrator) &&\r\n !userStatus.permissions.includes(Permission.UpdateAdministrator)\r\n ) {\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 <vdr-form-field [label]=\"'common.seller' | translate\" for=\"sellerId\">\r\n <select\r\n clrSelect\r\n name=\"sellerId\"\r\n formControlName=\"sellerId\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n >\r\n <option selected value style=\"display: none\"></option>\r\n <option *ngFor=\"let seller of sellers$ | async\" [value]=\"seller.id\">{{ seller.name }}</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=\"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 GetSellersQuery,\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 sellers$: Observable<GetSellersQuery['sellers']['items']>;\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 sellerId: ['', 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 // TODO: make this lazy-loaded autocomplete\r\n this.sellers$ = this.dataService.settings.getSellers().mapSingle(data => data.sellers.items);\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 sellerId: formValue.sellerId,\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 sellerId: formValue.sellerId,\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?.id ?? '',\r\n defaultLanguageCode: entity.defaultLanguageCode,\r\n defaultTaxZoneId: entity.defaultTaxZone?.id ?? '',\r\n sellerId: entity.seller?.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","<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=\"seller-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', 'UpdateSeller']\"\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.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"name\"\r\n />\r\n </vdr-form-field>\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Seller\"\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=\"seller-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 CreateSellerInput,\r\n CurrencyCode,\r\n CustomFieldConfig,\r\n DataService,\r\n GetZonesQuery,\r\n LanguageCode,\r\n NotificationService,\r\n Permission,\r\n SellerFragment,\r\n ServerConfigService,\r\n UpdateSellerInput,\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-seller-detail',\r\n templateUrl: './seller-detail.component.html',\r\n styleUrls: ['./seller-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SellerDetailComponent extends BaseDetailComponent<SellerFragment> implements OnInit, OnDestroy {\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.UpdateSeller, Permission.CreateSeller];\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('Seller');\r\n this.detailForm = this.formBuilder.group({\r\n 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 }\r\n\r\n ngOnInit() {\r\n this.init();\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: CreateSellerInput = {\r\n name: formValue.name,\r\n customFields: formValue.customFields,\r\n };\r\n this.dataService.settings.createSeller(input).subscribe(data => {\r\n switch (data.createSeller.__typename) {\r\n case 'Seller':\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Seller',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createSeller.id], { relativeTo: this.route });\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(seller => {\r\n const input = {\r\n id: seller.id,\r\n name: formValue.name,\r\n customFields: formValue.customFields,\r\n } as UpdateSellerInput;\r\n return this.dataService.settings.updateSeller(input);\r\n }),\r\n )\r\n .subscribe(({ updateSeller }) => {\r\n switch (updateSeller.__typename) {\r\n case 'Seller':\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Seller',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n break;\r\n // case 'LanguageNotAvailableError':\r\n // this.notificationService.error(updateSeller.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: SellerFragment, languageCode: LanguageCode): void {\r\n this.detailForm.patchValue({\r\n name: entity.name,\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=\"seller-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"['SuperAdmin', 'CreateSeller']\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'settings.create-new-seller' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table [items]=\"sellers$ | async\">\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-seller=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ seller.name }}\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]=\"['./', seller.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)=\"deleteSeller(seller.id)\"\r\n [disabled]=\"!(['SuperAdmin', 'DeleteSeller'] | 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 { DataService, ModalService, NotificationService, SellerFragment } from '@vendure/admin-ui/core';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { mergeMap, startWith, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-seller-list',\r\n templateUrl: './seller-list.component.html',\r\n styleUrls: ['./seller-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SellerListComponent {\r\n sellers$: Observable<SellerFragment[]>;\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.sellers$ = this.refresh$.pipe(\r\n startWith(1),\r\n switchMap(() => this.dataService.settings.getSellers().mapStream(data => data.sellers.items)),\r\n );\r\n }\r\n\r\n deleteSeller(id: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-seller'),\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.settings.deleteSeller(id) : EMPTY)))\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Seller',\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: 'Seller',\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 seller: {} 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, SellerFragment } 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 SellerResolver extends BaseEntityResolver<SellerFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Seller',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n },\r\n id => dataService.settings.getSeller(id).mapStream(data => data.seller),\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 Seller,\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 { SellerDetailComponent } from './components/seller-detail/seller-detail.component';\r\nimport { SellerListComponent } from './components/seller-list/seller-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 { SellerResolver } from './providers/routing/seller-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: 'sellers',\r\n component: SellerListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.sellers'),\r\n },\r\n },\r\n {\r\n path: 'sellers/:id',\r\n component: SellerDetailComponent,\r\n resolve: createResolveData(SellerResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: { breadcrumb: sellerBreadcrumb },\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 sellerBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<Seller>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.sellers',\r\n getName: seller => seller.name,\r\n route: 'sellers',\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 { SellerDetailComponent } from './components/seller-detail/seller-detail.component';\r\nimport { SellerListComponent } from './components/seller-list/seller-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 SellerDetailComponent,\r\n SellerListComponent,\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":"434.4f08fadf75c20ed8.js"}