Просмотр исходного кода

feat(admin-ui): Implement delete for Countries

Relates to #21
Michael Bromley 7 лет назад
Родитель
Сommit
3bdc1f3d63

+ 9 - 0
admin-ui/src/app/data/definitions/settings-definitions.ts

@@ -66,6 +66,15 @@ export const UPDATE_COUNTRY = gql`
     ${COUNTRY_FRAGMENT}
 `;
 
+export const DELETE_COUNTRY = gql`
+    mutation DeleteCountry($id: ID!) {
+        deleteCountry(id: $id) {
+            result
+            message
+        }
+    }
+`;
+
 export const ZONE_FRAGMENT = gql`
     fragment Zone on Zone {
         id

+ 8 - 0
admin-ui/src/app/data/providers/settings-data.service.ts

@@ -10,6 +10,7 @@ import {
     CreateTaxRateInput,
     CreateZone,
     CreateZoneInput,
+    DeleteCountry,
     GetActiveChannel,
     GetAvailableCountries,
     GetChannel,
@@ -50,6 +51,7 @@ import {
     CREATE_TAX_CATEGORY,
     CREATE_TAX_RATE,
     CREATE_ZONE,
+    DELETE_COUNTRY,
     GET_ACTIVE_CHANNEL,
     GET_AVAILABLE_COUNTRIES,
     GET_CHANNEL,
@@ -108,6 +110,12 @@ export class SettingsDataService {
         });
     }
 
+    deleteCountry(id: string) {
+        return this.baseDataService.mutate<DeleteCountry.Mutation, DeleteCountry.Variables>(DELETE_COUNTRY, {
+            id,
+        });
+    }
+
     getZones() {
         return this.baseDataService.query<GetZones.Query>(GET_ZONES);
     }

+ 19 - 0
admin-ui/src/app/settings/components/country-list/country-list.component.html

@@ -30,6 +30,7 @@
     <vdr-dt-column>{{ 'settings.zone' | translate }}</vdr-dt-column>
     <vdr-dt-column>{{ 'common.enabled' | translate }}</vdr-dt-column>
     <vdr-dt-column></vdr-dt-column>
+    <vdr-dt-column></vdr-dt-column>
     <ng-template let-country="item">
         <td class="left align-middle">{{ country.code }}</td>
         <td class="left align-middle">{{ country.name }}</td>
@@ -49,5 +50,23 @@
                 [linkTo]="['./', country.id]"
             ></vdr-table-row-action>
         </td>
+        <td class="right align-middle">
+            <clr-dropdown>
+                <button type="button" class="btn btn-link btn-sm" clrDropdownTrigger>
+                    {{ 'common.actions' | translate }}
+                    <clr-icon shape="caret down"></clr-icon>
+                </button>
+                <clr-dropdown-menu *clrIfOpen clrPosition="bottom-right">
+                    <button
+                        type="button"
+                        class="delete-button"
+                        (click)="deleteCountry(country.id)"
+                        clrDropdownItem
+                    >
+                        {{ 'common.delete' | translate }}
+                    </button>
+                </clr-dropdown-menu>
+            </clr-dropdown>
+        </td>
     </ng-template>
 </vdr-data-table>

+ 36 - 3
admin-ui/src/app/settings/components/country-list/country-list.component.ts

@@ -1,7 +1,7 @@
 import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';
-import { combineLatest, Observable, of, Subject } from 'rxjs';
-import { map, mergeMap, take, tap } from 'rxjs/operators';
-import { Country, GetCountryList, GetZones, Zone } from 'shared/generated-types';
+import { combineLatest, EMPTY, Observable, of, Subject } from 'rxjs';
+import { map, mergeMap, switchMap, take, tap } from 'rxjs/operators';
+import { Country, DeletionResult, GetCountryList, GetZones, Zone } from 'shared/generated-types';
 
 import { _ } from '../../../core/providers/i18n/mark-for-extraction';
 import { NotificationService } from '../../../core/providers/notification/notification.service';
@@ -148,6 +148,39 @@ export class CountryListComponent implements OnInit, OnDestroy {
             });
     }
 
+    deleteCountry(countryId: string) {
+        this.modalService
+            .dialog({
+                title: _('catalog.confirm-delete-country'),
+                buttons: [
+                    { type: 'seconday', label: _('common.cancel') },
+                    { type: 'danger', label: _('common.delete'), returnValue: true },
+                ],
+            })
+            .pipe(
+                switchMap(response =>
+                    response ? this.dataService.settings.deleteCountry(countryId) : EMPTY,
+                ),
+            )
+            .subscribe(
+                response => {
+                    if (response.deleteCountry.result === DeletionResult.DELETED) {
+                        this.notificationService.success(_('common.notify-delete-success'), {
+                            entity: 'Country',
+                        });
+                        this.dataService.settings.getCountries(9999, 0).single$.subscribe();
+                    } else {
+                        this.notificationService.error(response.deleteCountry.message || '');
+                    }
+                },
+                err => {
+                    this.notificationService.error(_('common.notify-delete-error'), {
+                        entity: 'Country',
+                    });
+                },
+            );
+    }
+
     private isZone(input: Zone.Fragment | { name: string }): input is Zone.Fragment {
         return input.hasOwnProperty('id');
     }

+ 1 - 0
admin-ui/src/i18n-messages/en.json

@@ -28,6 +28,7 @@
     "add-facet-value": "Add facet value",
     "add-facets": "Add facets",
     "assets-selected-count": "{ count } assets selected",
+    "confirm-delete-country": "Delete country?",
     "confirm-delete-facet": "Delete facet?",
     "confirm-delete-facet-value": "Delete facet value?",
     "confirm-delete-product": "Delete product?",

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
schema.json


+ 27 - 0
shared/generated-types.ts

@@ -760,6 +760,8 @@ export interface ImportInfo {
 
 export interface SearchReindexResponse {
     success: boolean;
+    timeTaken: number;
+    indexedItemCount: number;
 }
 
 export interface AdministratorListOptions {
@@ -5269,9 +5271,17 @@ export namespace ImportInfoResolvers {
 export namespace SearchReindexResponseResolvers {
     export interface Resolvers<Context = any> {
         success?: SuccessResolver<boolean, any, Context>;
+        timeTaken?: TimeTakenResolver<number, any, Context>;
+        indexedItemCount?: IndexedItemCountResolver<number, any, Context>;
     }
 
     export type SuccessResolver<R = boolean, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type TimeTakenResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
+    export type IndexedItemCountResolver<R = number, Parent = any, Context = any> = Resolver<
+        R,
+        Parent,
+        Context
+    >;
 }
 
 export namespace GetAdministrators {
@@ -6369,6 +6379,23 @@ export namespace UpdateCountry {
     export type UpdateCountry = Country.Fragment;
 }
 
+export namespace DeleteCountry {
+    export type Variables = {
+        id: string;
+    };
+
+    export type Mutation = {
+        __typename?: 'Mutation';
+        deleteCountry: DeleteCountry;
+    };
+
+    export type DeleteCountry = {
+        __typename?: 'DeletionResponse';
+        result: DeletionResult;
+        message?: string | null;
+    };
+}
+
 export namespace GetZones {
     export type Variables = {};
 

Некоторые файлы не были показаны из-за большого количества измененных файлов