Browse Source

feat(admin-ui): Add ability to delete administrator from admin list

Relates to #384
Michael Bromley 5 years ago
parent
commit
e217ce0b9e

+ 12 - 12
packages/admin-ui/i18n-coverage.json

@@ -1,34 +1,34 @@
 {
-  "generatedOn": "2020-06-30T08:09:29.407Z",
-  "lastCommit": "83347b27acf895b746b7b3288593d6c60d1a14dc",
+  "generatedOn": "2020-06-30T13:29:58.358Z",
+  "lastCommit": "dc82b2c2392004d08f4a1aea4b126360f733b296",
   "translationStatus": {
     "de": {
-      "tokenCount": 651,
+      "tokenCount": 656,
       "translatedCount": 609,
-      "percentage": 94
+      "percentage": 93
     },
     "en": {
-      "tokenCount": 651,
-      "translatedCount": 650,
+      "tokenCount": 656,
+      "translatedCount": 656,
       "percentage": 100
     },
     "es": {
-      "tokenCount": 651,
+      "tokenCount": 656,
       "translatedCount": 467,
-      "percentage": 72
+      "percentage": 71
     },
     "pl": {
-      "tokenCount": 651,
+      "tokenCount": 656,
       "translatedCount": 566,
-      "percentage": 87
+      "percentage": 86
     },
     "zh_Hans": {
-      "tokenCount": 651,
+      "tokenCount": 656,
       "translatedCount": 550,
       "percentage": 84
     },
     "zh_Hant": {
-      "tokenCount": 651,
+      "tokenCount": 656,
       "translatedCount": 550,
       "percentage": 84
     }

+ 19 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -3899,6 +3899,19 @@ export type UpdateAdministratorMutation = (
   ) }
 );
 
+export type DeleteAdministratorMutationVariables = {
+  id: Scalars['ID'];
+};
+
+
+export type DeleteAdministratorMutation = (
+  { __typename?: 'Mutation' }
+  & { deleteAdministrator: (
+    { __typename?: 'DeletionResponse' }
+    & Pick<DeletionResponse, 'result' | 'message'>
+  ) }
+);
+
 export type GetRolesQueryVariables = {
   options?: Maybe<RoleListOptions>;
 };
@@ -6775,6 +6788,12 @@ export namespace UpdateAdministrator {
   export type UpdateAdministrator = AdministratorFragment;
 }
 
+export namespace DeleteAdministrator {
+  export type Variables = DeleteAdministratorMutationVariables;
+  export type Mutation = DeleteAdministratorMutation;
+  export type DeleteAdministrator = DeleteAdministratorMutation['deleteAdministrator'];
+}
+
 export namespace GetRoles {
   export type Variables = GetRolesQueryVariables;
   export type Query = GetRolesQuery;

+ 9 - 0
packages/admin-ui/src/lib/core/src/data/definitions/administrator-definitions.ts

@@ -75,6 +75,15 @@ export const UPDATE_ADMINISTRATOR = gql`
     ${ADMINISTRATOR_FRAGMENT}
 `;
 
+export const DELETE_ADMINISTRATOR = gql`
+    mutation DeleteAdministrator($id: ID!) {
+        deleteAdministrator(id: $id) {
+            result
+            message
+        }
+    }
+`;
+
 export const GET_ROLES = gql`
     query GetRoles($options: RoleListOptions) {
         roles(options: $options) {

+ 9 - 0
packages/admin-ui/src/lib/core/src/data/providers/administrator-data.service.ts

@@ -3,6 +3,7 @@ import {
     CreateAdministratorInput,
     CreateRole,
     CreateRoleInput,
+    DeleteAdministrator,
     DeleteRole,
     GetAdministrator,
     GetAdministrators,
@@ -16,6 +17,7 @@ import {
 import {
     CREATE_ADMINISTRATOR,
     CREATE_ROLE,
+    DELETE_ADMINISTRATOR,
     DELETE_ROLE,
     GET_ADMINISTRATOR,
     GET_ADMINISTRATORS,
@@ -65,6 +67,13 @@ export class AdministratorDataService {
         );
     }
 
+    deleteAdministrator(id: string) {
+        return this.baseDataService.mutate<DeleteAdministrator.Mutation, DeleteAdministrator.Variables>(
+            DELETE_ADMINISTRATOR,
+            { id },
+        );
+    }
+
     getRoles(take: number = 10, skip: number = 0) {
         return this.baseDataService.query<GetRoles.Query, GetRoles.Variables>(GET_ROLES, {
             options: {

+ 21 - 0
packages/admin-ui/src/lib/settings/src/components/administrator-list/administrator-list.component.html

@@ -20,6 +20,7 @@
     <vdr-dt-column>{{ 'settings.last-name' | translate }}</vdr-dt-column>
     <vdr-dt-column>{{ 'settings.email-address' | translate }}</vdr-dt-column>
     <vdr-dt-column></vdr-dt-column>
+    <vdr-dt-column></vdr-dt-column>
     <ng-template let-administrator="item">
         <td class="left align-middle">{{ administrator.firstName }}</td>
         <td class="left align-middle">{{ administrator.lastName }}</td>
@@ -31,5 +32,25 @@
                 [linkTo]="['./', administrator.id]"
             ></vdr-table-row-action>
         </td>
+        <td>
+            <vdr-dropdown>
+                <button type="button" class="btn btn-link btn-sm" vdrDropdownTrigger>
+                    {{ 'common.actions' | translate }}
+                    <clr-icon shape="caret down"></clr-icon>
+                </button>
+                <vdr-dropdown-menu vdrPosition="bottom-right">
+                    <button
+                        type="button"
+                        class="delete-button"
+                        (click)="deleteAdministrator(administrator)"
+                        [disabled]="!('DeleteAdministrator' | hasPermission)"
+                        vdrDropdownItem
+                    >
+                        <clr-icon shape="trash" class="is-danger"></clr-icon>
+                        {{ 'common.delete' | translate }}
+                    </button>
+                </vdr-dropdown-menu>
+            </vdr-dropdown>
+        </td>
     </ng-template>
 </vdr-data-table>

+ 48 - 6
packages/admin-ui/src/lib/settings/src/components/administrator-list/administrator-list.component.ts

@@ -1,9 +1,15 @@
 import { Component } from '@angular/core';
 import { ActivatedRoute, Router } from '@angular/router';
-
-import { BaseListComponent } from '@vendure/admin-ui/core';
-import { GetAdministrators } from '@vendure/admin-ui/core';
-import { DataService } from '@vendure/admin-ui/core';
+import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import {
+    BaseListComponent,
+    DataService,
+    GetAdministrators,
+    ModalService,
+    NotificationService,
+} from '@vendure/admin-ui/core';
+import { EMPTY } from 'rxjs';
+import { switchMap } from 'rxjs/operators';
 
 @Component({
     selector: 'vdr-administrator-list',
@@ -14,11 +20,47 @@ export class AdministratorListComponent extends BaseListComponent<
     GetAdministrators.Query,
     GetAdministrators.Items
 > {
-    constructor(private dataService: DataService, router: Router, route: ActivatedRoute) {
+    constructor(
+        private dataService: DataService,
+        router: Router,
+        route: ActivatedRoute,
+        private modalService: ModalService,
+        private notificationService: NotificationService,
+    ) {
         super(router, route);
         super.setQueryFn(
             (...args: any[]) => this.dataService.administrator.getAdministrators(...args),
-            data => data.administrators,
+            (data) => data.administrators,
         );
     }
+
+    deleteAdministrator(administrator: GetAdministrators.Items) {
+        return this.modalService
+            .dialog({
+                title: _('catalog.confirm-delete-administrator'),
+                body: `${administrator.firstName} ${administrator.lastName}`,
+                buttons: [
+                    { type: 'secondary', label: _('common.cancel') },
+                    { type: 'danger', label: _('common.delete'), returnValue: true },
+                ],
+            })
+            .pipe(
+                switchMap((res) =>
+                    res ? this.dataService.administrator.deleteAdministrator(administrator.id) : EMPTY,
+                ),
+            )
+            .subscribe(
+                () => {
+                    this.notificationService.success(_('common.notify-delete-success'), {
+                        entity: 'Administrator',
+                    });
+                    this.refresh();
+                },
+                (err) => {
+                    this.notificationService.error(_('common.notify-delete-error'), {
+                        entity: 'Administrator',
+                    });
+                },
+            );
+    }
 }

+ 1 - 0
packages/admin-ui/src/lib/static/i18n-messages/de.json

@@ -60,6 +60,7 @@
     "collection-contents": "Inhalt der Sammlung",
     "confirm-adding-options-delete-default-body": "Das Hinzufügen von Optionen zu diesem Produkt führt dazu, dass die vorhandene Standardvariante gelöscht wird. Möchten Sie fortfahren?",
     "confirm-adding-options-delete-default-title": "Standardvariante löschen?",
+    "confirm-delete-administrator": "",
     "confirm-delete-asset": "Asset löschen?",
     "confirm-delete-channel": "Kanal löschen?",
     "confirm-delete-collection": "Sammlung löschen?",

+ 3 - 2
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -60,6 +60,7 @@
     "collection-contents": "Collection contents",
     "confirm-adding-options-delete-default-body": "Adding options to this product will cause the existing default variant to be deleted. Do you wish to proceed?",
     "confirm-adding-options-delete-default-title": "Delete default variant?",
+    "confirm-delete-administrator": "Delete administrator?",
     "confirm-delete-asset": "Delete asset?",
     "confirm-delete-channel": "Delete channel?",
     "confirm-delete-collection": "Delete collection?",
@@ -272,7 +273,7 @@
     "ago-hours": "{count, plural, one {1 hr} other {{count} hrs}} ago",
     "ago-minutes": "{count, plural, one {1 min} other {{count} mins}} ago",
     "ago-seconds": "{count, plural, =0 {just now} one {1 sec ago} other {{count} secs ago}}",
-    "ago-years": "",
+    "ago-years": "{count, plural, one {1 year} other {{count} years}} ago",
     "duration-milliseconds": "{ms}ms",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-seconds": "{s}s",
@@ -684,4 +685,4 @@
     "job-result": "Job result",
     "job-state": "Job state"
   }
-}
+}

+ 1 - 0
packages/admin-ui/src/lib/static/i18n-messages/es.json

@@ -60,6 +60,7 @@
     "collection-contents": "Contenidos de la colección",
     "confirm-adding-options-delete-default-body": "Añadir optiones a este producto eliminará la variante por defecto. ¿Desea continuar?",
     "confirm-adding-options-delete-default-title": "¿Eliminar la variante por defecto?",
+    "confirm-delete-administrator": "",
     "confirm-delete-asset": "¿Eliminar archivo?",
     "confirm-delete-channel": "¿Eliminar canal de ventas?",
     "confirm-delete-collection": "¿Eliminar colección?",

+ 1 - 0
packages/admin-ui/src/lib/static/i18n-messages/pl.json

@@ -60,6 +60,7 @@
     "collection-contents": "Zawartość kolekcji",
     "confirm-adding-options-delete-default-body": "Dodawanie opcji spowoduje, że obecna domyślna opcja zostanie usunięta. Czy chcesz kontynuować?",
     "confirm-adding-options-delete-default-title": "Usunąć domyślny tytuł?",
+    "confirm-delete-administrator": "",
     "confirm-delete-asset": "",
     "confirm-delete-channel": "Usunąć kanał?",
     "confirm-delete-collection": "Usunąć kolekcje?",

+ 1 - 0
packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json

@@ -60,6 +60,7 @@
     "collection-contents": "系列产品",
     "confirm-adding-options-delete-default-body": "添加新规格到此产品会导致含此规格的产品被删除,确认继续吗?",
     "confirm-adding-options-delete-default-title": "确认删除产品规格么?",
+    "confirm-delete-administrator": "",
     "confirm-delete-asset": "",
     "confirm-delete-channel": "确认删除销售渠道?",
     "confirm-delete-collection": "确认删除商品系列吗?",

+ 1 - 0
packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json

@@ -60,6 +60,7 @@
     "collection-contents": "系列產品",
     "confirm-adding-options-delete-default-body": "新增規格到此產品會引致包含此規格的產品被移除,確認繼續吗?",
     "confirm-adding-options-delete-default-title": "確認移除產品規格嗎?",
+    "confirm-delete-administrator": "",
     "confirm-delete-asset": "",
     "confirm-delete-channel": "確認移除渠道?",
     "confirm-delete-collection": "確認移除商品系列吗?",