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