From bd153debe2273e64e8e47a05690caf659c049c62 Mon Sep 17 00:00:00 2001 From: DarkPhoenix2704 Date: Tue, 20 Feb 2024 07:16:07 +0000 Subject: [PATCH] feat(nc-gui): support undo redo --- .../composables/useCalendarViewStore.ts | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/composables/useCalendarViewStore.ts b/packages/nc-gui/composables/useCalendarViewStore.ts index 452b47b247..bb898a04d4 100644 --- a/packages/nc-gui/composables/useCalendarViewStore.ts +++ b/packages/nc-gui/composables/useCalendarViewStore.ts @@ -9,7 +9,7 @@ import { type ViewType, } from 'nocodb-sdk' import dayjs from 'dayjs' -import { addDays, addMonths, addYears, extractPkFromRow, extractSdkResponseErrorMsg } from '~/utils' +import { addDays, addMonths, addYears, extractPkFromRow, extractSdkResponseErrorMsg, rowPkData } from '~/utils' import { IsPublicInj, type Row, ref, storeToRefs, useBase, useInjectionState, useUndoRedo } from '#imports' const formatData = (list: Record[]) => @@ -541,6 +541,15 @@ const [useProvideCalendarViewStore, useCalendarViewStore] = useInjectionState( } } + function findRowInState(rowData: Record) { + const pk: Record = rowPkData(rowData, meta?.value?.columns as ColumnType[]) + for (const row of formattedData.value) { + if (Object.keys(pk).every((k) => pk[k] === row.row[k])) { + return row + } + } + } + const paginateCalendarView = async (action: 'next' | 'prev') => { switch (activeCalendarView.value) { case 'month': @@ -614,7 +623,7 @@ const [useProvideCalendarViewStore, useCalendarViewStore] = useInjectionState( {}, ) - return await $api.dbViewRow.update( + const updatedRowData = await $api.dbViewRow.update( NOCO, base?.value.id as string, meta.value?.id as string, @@ -629,6 +638,41 @@ const [useProvideCalendarViewStore, useCalendarViewStore] = useInjectionState( // query: { ignoreWebhook: !saved } // } ) + + if (!undo) { + addUndo({ + redo: { + fn: async (toUpdate: Row, property: string[]) => { + const updatedRow = await updateRowProperty(toUpdate, property, true) + const row = findRowInState(toUpdate.row) + if (row) { + Object.assign(row.row, updatedRow) + } + Object.assign(row.oldRow, updatedRow) + }, + args: [clone(toUpdate), property], + }, + undo: { + fn: async (toUpdate: Row, property: string[]) => { + const updatedData = await updateRowProperty( + { row: toUpdate.oldRow, oldRow: toUpdate.row, rowMeta: toUpdate.rowMeta }, + property, + true, + ) + const row = findRowInState(toUpdate.row) + if (row) { + Object.assign(row.row, updatedData) + } + Object.assign(row.oldRow, updatedData) + }, + args: [clone(toUpdate), property], + }, + scope: defineViewScope({ view: viewMeta.value }), + }) + Object.assign(toUpdate.row, updatedRowData) + Object.assign(toUpdate.oldRow, updatedRowData) + } + return updatedRowData } catch (e: any) { message.error(`${t('msg.error.rowUpdateFailed')} ${await extractSdkResponseErrorMsg(e)}`) }