mirror of
https://github.com/nocodb/nocodb.git
synced 2026-04-25 00:05:29 +00:00
fix(gui): save row on switching tables
Signed-off-by: Pranav C <pranavxc@gmail.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import {
|
||||
useDebounceFn,
|
||||
useVModel,
|
||||
} from '#imports'
|
||||
import { useSmartsheetRowStoreOrThrow } from '~/composables/useSmartsheetRowStore'
|
||||
import { NavigateDir } from '~/lib'
|
||||
|
||||
interface Props {
|
||||
@@ -57,13 +58,14 @@ const isPublic = inject(IsPublicInj, ref(false))
|
||||
|
||||
const isLocked = inject(IsLockedInj, ref(false))
|
||||
|
||||
let changed = $ref(false)
|
||||
const { currentRow } = useSmartsheetRowStoreOrThrow()
|
||||
|
||||
const syncValue = useDebounceFn(function () {
|
||||
changed = false
|
||||
currentRow.value.rowMeta.changed = false
|
||||
emit('save')
|
||||
}, 1000)
|
||||
|
||||
|
||||
const isAutoSaved = $computed(() => {
|
||||
return [
|
||||
UITypes.SingleLineText,
|
||||
@@ -89,13 +91,13 @@ const vModel = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (val) => {
|
||||
if (val !== props.modelValue) {
|
||||
changed = true
|
||||
currentRow.value.rowMeta.changed = true
|
||||
emit('update:modelValue', val)
|
||||
if (isAutoSaved) {
|
||||
syncValue()
|
||||
} else if (!isManualSaved) {
|
||||
emit('save')
|
||||
changed = true
|
||||
currentRow.value.rowMeta.changed = true
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -129,9 +131,9 @@ const {
|
||||
const syncAndNavigate = (dir: NavigateDir) => {
|
||||
if (isJSON.value) return
|
||||
|
||||
if (changed) {
|
||||
if (currentRow.value.rowMeta.changed) {
|
||||
emit('save')
|
||||
changed = false
|
||||
currentRow.value.rowMeta.changed = false
|
||||
}
|
||||
emit('navigate', dir)
|
||||
}
|
||||
|
||||
@@ -248,36 +248,35 @@ const onKeyDown = async (e: KeyboardEvent) => {
|
||||
e.preventDefault()
|
||||
if (selected.row < data.value.length - 1) selected.row++
|
||||
break
|
||||
default:
|
||||
{
|
||||
const rowObj = data.value[selected.row]
|
||||
const columnObj = fields.value[selected.col]
|
||||
default: {
|
||||
const rowObj = data.value[selected.row]
|
||||
const columnObj = fields.value[selected.col]
|
||||
|
||||
if ((!editEnabled && e.metaKey) || e.ctrlKey) {
|
||||
switch (e.keyCode) {
|
||||
// copy - ctrl/cmd +c
|
||||
case 67:
|
||||
await copy(rowObj.row[columnObj.title] || '')
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (editEnabled || e.ctrlKey || e.altKey || e.metaKey) {
|
||||
return
|
||||
}
|
||||
|
||||
/** on letter key press make cell editable and empty */
|
||||
if (e?.key?.length === 1) {
|
||||
if (!isPkAvail && !rowObj.rowMeta.new) {
|
||||
// Update not allowed for table which doesn't have primary Key
|
||||
return message.info(t('msg.info.updateNotAllowedWithoutPK'))
|
||||
}
|
||||
if (makeEditable(rowObj, columnObj)) {
|
||||
rowObj.row[columnObj.title] = ''
|
||||
}
|
||||
// editEnabled = true
|
||||
if ((!editEnabled && e.metaKey) || e.ctrlKey) {
|
||||
switch (e.keyCode) {
|
||||
// copy - ctrl/cmd +c
|
||||
case 67:
|
||||
await copy(rowObj.row[columnObj.title] || '')
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (editEnabled || e.ctrlKey || e.altKey || e.metaKey) {
|
||||
return
|
||||
}
|
||||
|
||||
/** on letter key press make cell editable and empty */
|
||||
if (e?.key?.length === 1) {
|
||||
if (!isPkAvail && !rowObj.rowMeta.new) {
|
||||
// Update not allowed for table which doesn't have primary Key
|
||||
return message.info(t('msg.info.updateNotAllowedWithoutPK'))
|
||||
}
|
||||
if (makeEditable(rowObj, columnObj)) {
|
||||
rowObj.row[columnObj.title] = ''
|
||||
}
|
||||
// editEnabled = true
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -324,6 +323,26 @@ const showContextMenu = (e: MouseEvent, target?: { row: number; col: number }) =
|
||||
contextMenuTarget.value = target
|
||||
}
|
||||
}
|
||||
|
||||
onBeforeUnmount(async () => {
|
||||
for (const row of data.value) {
|
||||
if (row.rowMeta.new) {
|
||||
await updateOrSaveRow(row, null)
|
||||
row.rowMeta.changed = false
|
||||
continue
|
||||
}
|
||||
if (row.rowMeta.changed) {
|
||||
row.rowMeta.changed = false
|
||||
for (const field of meta?.value.columns ?? []) {
|
||||
if (isVirtualCol(field)) continue
|
||||
if (row.row[field.title!] !== row.oldRow[field.title!]) {
|
||||
await updateOrSaveRow(row, field.title!)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -339,87 +358,88 @@ const showContextMenu = (e: MouseEvent, target?: { row: number; col: number }) =
|
||||
@contextmenu="showContextMenu"
|
||||
>
|
||||
<thead>
|
||||
<tr class="nc-grid-header border-1 bg-gray-100 sticky top[-1px]">
|
||||
<th>
|
||||
<div class="w-full h-full bg-gray-100 flex min-w-[70px] pl-5 pr-1 items-center">
|
||||
<template v-if="!readOnly">
|
||||
<div class="nc-no-label text-gray-500" :class="{ hidden: selectedAllRecords }">#</div>
|
||||
<div
|
||||
:class="{ hidden: !selectedAllRecords, flex: selectedAllRecords }"
|
||||
class="nc-check-all w-full items-center"
|
||||
>
|
||||
<a-checkbox v-model:checked="selectedAllRecords" />
|
||||
<tr class="nc-grid-header border-1 bg-gray-100 sticky top[-1px]">
|
||||
<th>
|
||||
<div class="w-full h-full bg-gray-100 flex min-w-[70px] pl-5 pr-1 items-center">
|
||||
<template v-if="!readOnly">
|
||||
<div class="nc-no-label text-gray-500" :class="{ hidden: selectedAllRecords }">#</div>
|
||||
<div
|
||||
:class="{ hidden: !selectedAllRecords, flex: selectedAllRecords }"
|
||||
class="nc-check-all w-full items-center"
|
||||
>
|
||||
<a-checkbox v-model:checked="selectedAllRecords" />
|
||||
|
||||
<span class="flex-1" />
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="text-gray-500">#</div>
|
||||
</template>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
v-for="col in fields"
|
||||
:key="col.title"
|
||||
v-xc-ver-resize
|
||||
:data-col="col.id"
|
||||
:data-title="col.title"
|
||||
@xcresize="onresize(col.id, $event)"
|
||||
@xcresizing="onXcResizing(col.title, $event)"
|
||||
@xcresized="resizingCol = null"
|
||||
>
|
||||
<div class="w-full h-full bg-gray-100 flex items-center">
|
||||
<SmartsheetHeaderVirtualCell v-if="isVirtualCol(col)" :column="col" :hide-menu="readOnly" />
|
||||
|
||||
<SmartsheetHeaderCell v-else :column="col" :hide-menu="readOnly" />
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
v-if="!readOnly && !isLocked && isUIAllowed('add-column') && !isSqlView"
|
||||
v-t="['c:column:add']"
|
||||
class="cursor-pointer"
|
||||
@click.stop="addColumnDropdown = true"
|
||||
>
|
||||
<a-dropdown v-model:visible="addColumnDropdown" :trigger="['click']">
|
||||
<div class="h-full w-[60px] flex items-center justify-center">
|
||||
<MdiPlus class="text-sm nc-column-add" />
|
||||
<span class="flex-1" />
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="text-gray-500">#</div>
|
||||
</template>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
v-for="col in fields"
|
||||
:key="col.title"
|
||||
v-xc-ver-resize
|
||||
:data-col="col.id"
|
||||
:data-title="col.title"
|
||||
@xcresize="onresize(col.id, $event)"
|
||||
@xcresizing="onXcResizing(col.title, $event)"
|
||||
@xcresized="resizingCol = null"
|
||||
>
|
||||
<div class="w-full h-full bg-gray-100 flex items-center">
|
||||
<SmartsheetHeaderVirtualCell v-if="isVirtualCol(col)" :column="col" :hide-menu="readOnly" />
|
||||
|
||||
<template #overlay>
|
||||
<SmartsheetColumnEditOrAddProvider
|
||||
v-if="addColumnDropdown"
|
||||
@submit="addColumnDropdown = false"
|
||||
@cancel="addColumnDropdown = false"
|
||||
@click.stop
|
||||
@keydown.stop
|
||||
/>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</th>
|
||||
</tr>
|
||||
<SmartsheetHeaderCell v-else :column="col" :hide-menu="readOnly" />
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
v-if="!readOnly && !isLocked && isUIAllowed('add-column') && !isSqlView"
|
||||
v-t="['c:column:add']"
|
||||
class="cursor-pointer"
|
||||
@click.stop="addColumnDropdown = true"
|
||||
>
|
||||
<a-dropdown v-model:visible="addColumnDropdown" :trigger="['click']">
|
||||
<div class="h-full w-[60px] flex items-center justify-center">
|
||||
<MdiPlus class="text-sm nc-column-add" />
|
||||
</div>
|
||||
|
||||
<template #overlay>
|
||||
<SmartsheetColumnEditOrAddProvider
|
||||
v-if="addColumnDropdown"
|
||||
@submit="addColumnDropdown = false"
|
||||
@cancel="addColumnDropdown = false"
|
||||
@click.stop
|
||||
@keydown.stop
|
||||
/>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<SmartsheetRow v-for="(row, rowIndex) of data" :key="rowIndex" :row="row">
|
||||
<template #default="{ state }">
|
||||
<tr class="nc-grid-row">
|
||||
<td key="row-index" class="caption nc-grid-cell pl-5 pr-1">
|
||||
<div class="items-center flex gap-1 min-w-[55px]">
|
||||
<div
|
||||
v-if="!readOnly || !isLocked"
|
||||
class="nc-row-no text-xs text-gray-500"
|
||||
:class="{ toggle: !readOnly, hidden: row.rowMeta.selected }"
|
||||
>
|
||||
{{ rowIndex + 1 }}
|
||||
</div>
|
||||
<div
|
||||
v-if="!readOnly"
|
||||
:class="{ hidden: !row.rowMeta.selected, flex: row.rowMeta.selected }"
|
||||
class="nc-row-expand-and-checkbox"
|
||||
>
|
||||
<a-checkbox v-model:checked="row.rowMeta.selected" />
|
||||
</div>
|
||||
<span class="flex-1" />
|
||||
<div v-if="!readOnly && !isLocked" class="nc-expand" :class="{ 'nc-comment': row.rowMeta?.commentCount }">
|
||||
<SmartsheetRow v-for="(row, rowIndex) of data" :key="rowIndex" :row="row">
|
||||
<template #default="{ state }">
|
||||
<tr class="nc-grid-row">
|
||||
<td key="row-index" class="caption nc-grid-cell pl-5 pr-1">
|
||||
<div class="items-center flex gap-1 min-w-[55px]">
|
||||
<div
|
||||
v-if="!readOnly || !isLocked"
|
||||
class="nc-row-no text-xs text-gray-500"
|
||||
:class="{ toggle: !readOnly, hidden: row.rowMeta.selected }"
|
||||
>
|
||||
{{ rowIndex + 1 }}
|
||||
</div>
|
||||
<div
|
||||
v-if="!readOnly"
|
||||
:class="{ hidden: !row.rowMeta.selected, flex: row.rowMeta.selected }"
|
||||
class="nc-row-expand-and-checkbox"
|
||||
>
|
||||
<a-checkbox v-model:checked="row.rowMeta.selected" />
|
||||
</div>
|
||||
<span class="flex-1" />
|
||||
<div v-if="!readOnly && !isLocked" class="nc-expand"
|
||||
:class="{ 'nc-comment': row.rowMeta?.commentCount }">
|
||||
<span
|
||||
v-if="row.rowMeta?.commentCount"
|
||||
class="py-1 px-3 rounded-full text-xs cursor-pointer select-none transform hover:(scale-110)"
|
||||
@@ -428,87 +448,87 @@ const showContextMenu = (e: MouseEvent, target?: { row: number; col: number }) =
|
||||
>
|
||||
{{ row.rowMeta.commentCount }}
|
||||
</span>
|
||||
<div
|
||||
v-else
|
||||
class="cursor-pointer flex items-center border-1 active:ring rounded p-1 hover:(bg-primary bg-opacity-10)"
|
||||
>
|
||||
<MdiArrowExpand
|
||||
v-t="['c:row-expand']"
|
||||
class="select-none transform hover:(text-accent scale-120) nc-row-expand"
|
||||
@click="expandForm(row, state)"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="cursor-pointer flex items-center border-1 active:ring rounded p-1 hover:(bg-primary bg-opacity-10)"
|
||||
>
|
||||
<MdiArrowExpand
|
||||
v-t="['c:row-expand']"
|
||||
class="select-none transform hover:(text-accent scale-120) nc-row-expand"
|
||||
@click="expandForm(row, state)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
v-for="(columnObj, colIndex) of fields"
|
||||
:ref="cellRefs.set"
|
||||
:key="columnObj.id"
|
||||
class="cell relative cursor-pointer nc-grid-cell"
|
||||
:class="{
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
v-for="(columnObj, colIndex) of fields"
|
||||
:ref="cellRefs.set"
|
||||
:key="columnObj.id"
|
||||
class="cell relative cursor-pointer nc-grid-cell"
|
||||
:class="{
|
||||
active: isUIAllowed('xcDatatableEditable') && selected.col === colIndex && selected.row === rowIndex,
|
||||
}"
|
||||
:data-key="rowIndex + columnObj.id"
|
||||
:data-col="columnObj.id"
|
||||
:data-title="columnObj.title"
|
||||
@click="selectCell(rowIndex, colIndex)"
|
||||
@dblclick="makeEditable(row, columnObj)"
|
||||
@contextmenu="showContextMenu($event, { row: rowIndex, col: colIndex })"
|
||||
>
|
||||
<div class="w-full h-full">
|
||||
<SmartsheetVirtualCell
|
||||
v-if="isVirtualCol(columnObj)"
|
||||
v-model="row.row[columnObj.title]"
|
||||
:column="columnObj"
|
||||
:active="selected.col === colIndex && selected.row === rowIndex"
|
||||
:row="row"
|
||||
@navigate="onNavigate"
|
||||
/>
|
||||
:data-key="rowIndex + columnObj.id"
|
||||
:data-col="columnObj.id"
|
||||
:data-title="columnObj.title"
|
||||
@click="selectCell(rowIndex, colIndex)"
|
||||
@dblclick="makeEditable(row, columnObj)"
|
||||
@contextmenu="showContextMenu($event, { row: rowIndex, col: colIndex })"
|
||||
>
|
||||
<div class="w-full h-full">
|
||||
<SmartsheetVirtualCell
|
||||
v-if="isVirtualCol(columnObj)"
|
||||
v-model="row.row[columnObj.title]"
|
||||
:column="columnObj"
|
||||
:active="selected.col === colIndex && selected.row === rowIndex"
|
||||
:row="row"
|
||||
@navigate="onNavigate"
|
||||
/>
|
||||
|
||||
<SmartsheetCell
|
||||
v-else
|
||||
v-model="row.row[columnObj.title]"
|
||||
:column="columnObj"
|
||||
:edit-enabled="
|
||||
<SmartsheetCell
|
||||
v-else
|
||||
v-model="row.row[columnObj.title]"
|
||||
:column="columnObj"
|
||||
:edit-enabled="
|
||||
isUIAllowed('xcDatatableEditable') &&
|
||||
editEnabled &&
|
||||
selected.col === colIndex &&
|
||||
selected.row === rowIndex
|
||||
"
|
||||
:row-index="rowIndex"
|
||||
:active="selected.col === colIndex && selected.row === rowIndex"
|
||||
@update:edit-enabled="editEnabled = false"
|
||||
@save="updateOrSaveRow(row, columnObj.title)"
|
||||
@navigate="onNavigate"
|
||||
@cancel="editEnabled = false"
|
||||
/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</SmartsheetRow>
|
||||
:row-index="rowIndex"
|
||||
:active="selected.col === colIndex && selected.row === rowIndex"
|
||||
@update:edit-enabled="editEnabled = false"
|
||||
@save="updateOrSaveRow(row, columnObj.title)"
|
||||
@navigate="onNavigate"
|
||||
@cancel="editEnabled = false"
|
||||
/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</SmartsheetRow>
|
||||
|
||||
<!--
|
||||
TODO: add relationType !== 'bt' ?
|
||||
v1: <tr v-if="!isView && !isLocked && !isPublicView && isEditable && relationType !== 'bt'">
|
||||
-->
|
||||
<tr v-if="!isView && !isLocked && isUIAllowed('xcDatatableEditable') && !isSqlView">
|
||||
<td
|
||||
v-t="['c:row:add:grid-bottom']"
|
||||
:colspan="visibleColLength + 1"
|
||||
class="text-left pointer nc-grid-add-new-cell cursor-pointer"
|
||||
@click="addEmptyRow()"
|
||||
>
|
||||
<div class="px-2 w-full flex items-center text-gray-500">
|
||||
<MdiPlus class="text-pint-500 text-xs ml-2 text-primary" />
|
||||
<!--
|
||||
TODO: add relationType !== 'bt' ?
|
||||
v1: <tr v-if="!isView && !isLocked && !isPublicView && isEditable && relationType !== 'bt'">
|
||||
-->
|
||||
<tr v-if="!isView && !isLocked && isUIAllowed('xcDatatableEditable') && !isSqlView">
|
||||
<td
|
||||
v-t="['c:row:add:grid-bottom']"
|
||||
:colspan="visibleColLength + 1"
|
||||
class="text-left pointer nc-grid-add-new-cell cursor-pointer"
|
||||
@click="addEmptyRow()"
|
||||
>
|
||||
<div class="px-2 w-full flex items-center text-gray-500">
|
||||
<MdiPlus class="text-pint-500 text-xs ml-2 text-primary" />
|
||||
|
||||
<span class="ml-1">
|
||||
<span class="ml-1">
|
||||
{{ $t('activity.addRow') }}
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<script lang="ts" setup>
|
||||
import type { Row } from '~/composables'
|
||||
import { useProvideSmartsheetRowStore, useSmartsheetStoreOrThrow } from '#imports'
|
||||
import { ReloadRowDataHookInj } from '~/context'
|
||||
import { ReloadRowDataHookInj, useProvideSmartsheetRowStore, useSmartsheetStoreOrThrow } from '#imports'
|
||||
|
||||
interface Props {
|
||||
row: Row
|
||||
|
||||
@@ -21,6 +21,11 @@ import {
|
||||
|
||||
import type { TabItem } from '~/composables'
|
||||
|
||||
|
||||
const { activeTab } = defineProps<{
|
||||
activeTab: TabItem
|
||||
}>()
|
||||
|
||||
const { metas } = useMetas()
|
||||
|
||||
const activeView = ref()
|
||||
@@ -29,11 +34,15 @@ const el = ref<typeof SmartsheetGrid>()
|
||||
|
||||
const fields = ref<ColumnType[]>([])
|
||||
|
||||
const tabMeta = inject(
|
||||
// const tabMeta = inject(
|
||||
// TabMetaInj,
|
||||
// computed(() => ({} as TabItem)),
|
||||
// )
|
||||
provide(
|
||||
TabMetaInj,
|
||||
computed(() => ({} as TabItem)),
|
||||
ref(activeTab),
|
||||
)
|
||||
const meta = computed<TableType>(() => metas.value?.[tabMeta?.value?.id as string])
|
||||
const meta = computed<TableType>(() => metas.value?.[activeTab?.id as string])
|
||||
|
||||
const reloadEventHook = createEventHook<void>()
|
||||
const openNewRecordFormHook = createEventHook<void>()
|
||||
|
||||
@@ -29,6 +29,8 @@ const [useProvideSmartsheetRowStore, useSmartsheetRowStore] = useInjectionState(
|
||||
|
||||
const { metas } = useMetas()
|
||||
|
||||
const currentRow = ref(row)
|
||||
|
||||
// state
|
||||
const state = ref<Record<string, Record<string, any> | Record<string, any>[] | null>>({})
|
||||
|
||||
@@ -132,6 +134,7 @@ const [useProvideSmartsheetRowStore, useSmartsheetRowStore] = useInjectionState(
|
||||
removeLTARRef,
|
||||
syncLTARRefs,
|
||||
loadRow,
|
||||
currentRow
|
||||
}
|
||||
}, 'smartsheet-row-store')
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ export interface Row {
|
||||
new?: boolean
|
||||
selected?: boolean
|
||||
commentCount?: number
|
||||
changed?: boolean
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,12 +167,12 @@ export function useViewData(
|
||||
if ((!project?.value?.id || !meta?.value?.id || !viewMeta?.value?.id) && !isPublic.value) return
|
||||
const response = !isPublic.value
|
||||
? await api.dbViewRow.list('noco', project.value.id!, meta!.value.id!, viewMeta!.value.id, {
|
||||
...queryParams.value,
|
||||
...params,
|
||||
...(isUIAllowed('sortSync') ? {} : { sortArrJson: JSON.stringify(sorts.value) }),
|
||||
...(isUIAllowed('filterSync') ? {} : { filterArrJson: JSON.stringify(nestedFilters.value) }),
|
||||
where: where?.value,
|
||||
})
|
||||
...queryParams.value,
|
||||
...params,
|
||||
...(isUIAllowed('sortSync') ? {} : { sortArrJson: JSON.stringify(sorts.value) }),
|
||||
...(isUIAllowed('filterSync') ? {} : { filterArrJson: JSON.stringify(nestedFilters.value) }),
|
||||
where: where?.value,
|
||||
})
|
||||
: await fetchSharedViewData()
|
||||
formattedData.value = formatData(response.list)
|
||||
paginationData.value = response.pageInfo
|
||||
@@ -210,6 +211,7 @@ export function useViewData(
|
||||
await syncCount()
|
||||
return insertedData
|
||||
} catch (error: any) {
|
||||
console.log(error)
|
||||
message.error(await extractSdkResponseErrorMsg(error))
|
||||
}
|
||||
}
|
||||
@@ -241,7 +243,8 @@ export function useViewData(
|
||||
value: getHTMLEncodedText(toUpdate.row[property]),
|
||||
prev_value: getHTMLEncodedText(toUpdate.oldRow[property]),
|
||||
})
|
||||
.then(() => {})
|
||||
.then(() => {
|
||||
})
|
||||
|
||||
/** update row data(to sync formula and other related columns) */
|
||||
Object.assign(toUpdate.row, updatedRowData)
|
||||
@@ -267,7 +270,7 @@ export function useViewData(
|
||||
|
||||
async function deleteRowById(id: string) {
|
||||
if (!id) {
|
||||
throw new Error("Delete not allowed for table which doesn't have primary Key")
|
||||
throw new Error('Delete not allowed for table which doesn\'t have primary Key')
|
||||
}
|
||||
|
||||
const res: any = await $api.dbViewRow.delete(
|
||||
@@ -280,11 +283,9 @@ export function useViewData(
|
||||
|
||||
if (res.message) {
|
||||
message.info(
|
||||
`Row delete failed: ${h('div', {
|
||||
innerHTML: `<div style="padding:10px 4px">Unable to delete row with ID ${id} because of the following:
|
||||
<br><br>${res.message.join('<br>')}<br><br>
|
||||
Clear the data first & try again</div>`,
|
||||
})}`,
|
||||
`Row delete failed: ${`Unable to delete row with ID ${id} because of the following:
|
||||
\n${res.message.join('\n')}.\n
|
||||
Clear the data first & try again`})}`,
|
||||
)
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
<script setup lang="ts">
|
||||
import { TabItem } from '~/composables'
|
||||
import { TabMetaInj } from '~/context'
|
||||
|
||||
const { getMeta } = useMetas()
|
||||
const route = useRoute()
|
||||
const loading = ref(true)
|
||||
|
||||
const activeTab = inject(
|
||||
TabMetaInj,
|
||||
computed(() => ({} as TabItem)),
|
||||
)
|
||||
|
||||
getMeta(route.params.title as string, true).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
@@ -12,7 +20,7 @@ getMeta(route.params.title as string, true).finally(() => {
|
||||
<div v-if="loading" class="flex items-center justify-center h-full w-full">
|
||||
<a-spin size="large" />
|
||||
</div>
|
||||
<TabsSmartsheet v-else />
|
||||
<TabsSmartsheet :active-tab="activeTab" :key="route.params.title" v-else />
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
Reference in New Issue
Block a user