From 829f83145c6c3901550fe7c8dfd61175671b3e91 Mon Sep 17 00:00:00 2001 From: mertmit Date: Sat, 25 Mar 2023 15:40:51 +0300 Subject: [PATCH] feat: undo/redo for cover image change Signed-off-by: mertmit --- .../smartsheet/toolbar/FieldsMenu.vue | 51 ++++++++++++------- packages/nocodb-sdk/src/lib/Api.ts | 4 +- packages/nocodb/src/schema/swagger.json | 4 +- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue b/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue index 9c6670a33b..0e2fd63cbd 100644 --- a/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue +++ b/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue @@ -146,6 +146,27 @@ const coverOptions = computed(() => { return [{ value: null, label: 'No Image' }, ...filterFields] }) +const updateCoverImage = async (val?: string | null) => { + if ( + (activeView.value?.type === ViewTypes.GALLERY || activeView.value?.type === ViewTypes.KANBAN) && + activeView.value?.id && + activeView.value?.view + ) { + if (activeView.value?.type === ViewTypes.GALLERY) { + await $api.dbView.galleryUpdate(activeView.value?.id, { + fk_cover_image_col_id: val, + }) + ;(activeView.value.view as GalleryType).fk_cover_image_col_id = val + } else if (activeView.value?.type === ViewTypes.KANBAN) { + await $api.dbView.kanbanUpdate(activeView.value?.id, { + fk_cover_image_col_id: val, + }) + ;(activeView.value.view as KanbanType).fk_cover_image_col_id = val + } + reloadViewMetaHook?.trigger() + } +} + const coverImageColumnId = computed({ get: () => { const fk_cover_image_col_id = @@ -159,23 +180,19 @@ const coverImageColumnId = computed({ return null }, set: async (val) => { - if ( - (activeView.value?.type === ViewTypes.GALLERY || activeView.value?.type === ViewTypes.KANBAN) && - activeView.value?.id && - activeView.value?.view - ) { - if (activeView.value?.type === ViewTypes.GALLERY) { - await $api.dbView.galleryUpdate(activeView.value?.id, { - fk_cover_image_col_id: val, - }) - ;(activeView.value.view as GalleryType).fk_cover_image_col_id = val - } else if (activeView.value?.type === ViewTypes.KANBAN) { - await $api.dbView.kanbanUpdate(activeView.value?.id, { - fk_cover_image_col_id: val, - }) - ;(activeView.value.view as KanbanType).fk_cover_image_col_id = val - } - reloadViewMetaHook?.trigger() + if (val !== coverImageColumnId.value) { + addUndo({ + undo: { + fn: await updateCoverImage, + args: [coverImageColumnId.value], + }, + redo: { + fn: await updateCoverImage, + args: [val], + }, + }) + + await updateCoverImage(val) } }, }) diff --git a/packages/nocodb-sdk/src/lib/Api.ts b/packages/nocodb-sdk/src/lib/Api.ts index 3069409962..ec3a596669 100644 --- a/packages/nocodb-sdk/src/lib/Api.ts +++ b/packages/nocodb-sdk/src/lib/Api.ts @@ -902,7 +902,7 @@ export interface GalleryType { /** Model for Bool */ deleted?: BoolType; /** Foreign Key to Cover Image Column */ - fk_cover_image_col_id?: string; + fk_cover_image_col_id?: StringOrNullType; /** Foreign Key to Model */ fk_model_id?: string; /** Foreign Key to View */ @@ -1229,7 +1229,7 @@ export interface KanbanType { /** View ID */ fk_view_id?: IdType; /** Cover Image Column ID */ - fk_cover_image_col_id?: IdType; + fk_cover_image_col_id?: StringOrNullType; /** Kanban Columns */ columns?: KanbanColumnType[]; /** Meta Info for Kanban */ diff --git a/packages/nocodb/src/schema/swagger.json b/packages/nocodb/src/schema/swagger.json index 57bf94c867..a2e22b0477 100644 --- a/packages/nocodb/src/schema/swagger.json +++ b/packages/nocodb/src/schema/swagger.json @@ -15629,7 +15629,7 @@ "$ref": "#/components/schemas/Bool" }, "fk_cover_image_col_id": { - "type": "string", + "$ref": "#/components/schemas/StringOrNull", "description": "Foreign Key to Cover Image Column" }, "fk_model_id": { @@ -16498,7 +16498,7 @@ "description": "View ID" }, "fk_cover_image_col_id": { - "$ref": "#/components/schemas/Id", + "$ref": "#/components/schemas/StringOrNull", "description": "Cover Image Column ID" }, "columns": {