|
|
@ -166,7 +166,7 @@ const isViewColumnsLoading = computed(() => _isViewColumnsLoading.value || !meta |
|
|
|
const resizingColumn = ref(false) |
|
|
|
const resizingColumn = ref(false) |
|
|
|
|
|
|
|
|
|
|
|
// #Permissions |
|
|
|
// #Permissions |
|
|
|
const { isUIAllowed } = useRoles() |
|
|
|
const { isUIAllowed, isDataReadOnly } = useRoles() |
|
|
|
const hasEditPermission = computed(() => isUIAllowed('dataEdit')) |
|
|
|
const hasEditPermission = computed(() => isUIAllowed('dataEdit')) |
|
|
|
const isAddingColumnAllowed = computed(() => !readOnly.value && !isLocked.value && isUIAllowed('fieldAdd') && !isSqlView.value) |
|
|
|
const isAddingColumnAllowed = computed(() => !readOnly.value && !isLocked.value && isUIAllowed('fieldAdd') && !isSqlView.value) |
|
|
|
|
|
|
|
|
|
|
@ -233,7 +233,13 @@ const isKeyDown = ref(false) |
|
|
|
// #Cell - 1 |
|
|
|
// #Cell - 1 |
|
|
|
|
|
|
|
|
|
|
|
async function clearCell(ctx: { row: number; col: number } | null, skipUpdate = false) { |
|
|
|
async function clearCell(ctx: { row: number; col: number } | null, skipUpdate = false) { |
|
|
|
if (!ctx || !hasEditPermission.value || (!isLinksOrLTAR(fields.value[ctx.col]) && isVirtualCol(fields.value[ctx.col]))) return |
|
|
|
if ( |
|
|
|
|
|
|
|
isDataReadOnly.value || |
|
|
|
|
|
|
|
!ctx || |
|
|
|
|
|
|
|
!hasEditPermission.value || |
|
|
|
|
|
|
|
(!isLinksOrLTAR(fields.value[ctx.col]) && isVirtualCol(fields.value[ctx.col])) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define |
|
|
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define |
|
|
|
if (colMeta.value[ctx.col].isReadonly) return |
|
|
|
if (colMeta.value[ctx.col].isReadonly) return |
|
|
@ -916,7 +922,7 @@ const onNavigate = (dir: NavigateDir) => { |
|
|
|
// #Cell - 2 |
|
|
|
// #Cell - 2 |
|
|
|
|
|
|
|
|
|
|
|
async function clearSelectedRangeOfCells() { |
|
|
|
async function clearSelectedRangeOfCells() { |
|
|
|
if (!hasEditPermission.value) return |
|
|
|
if (!hasEditPermission.value || isDataReadOnly.value) return |
|
|
|
|
|
|
|
|
|
|
|
const start = selectedRange.start |
|
|
|
const start = selectedRange.start |
|
|
|
const end = selectedRange.end |
|
|
|
const end = selectedRange.end |
|
|
@ -1278,6 +1284,7 @@ const selectedReadonly = computed( |
|
|
|
|
|
|
|
|
|
|
|
const showFillHandle = computed( |
|
|
|
const showFillHandle = computed( |
|
|
|
() => |
|
|
|
() => |
|
|
|
|
|
|
|
!isDataReadOnly.value && |
|
|
|
!readOnly.value && |
|
|
|
!readOnly.value && |
|
|
|
!editEnabled.value && |
|
|
|
!editEnabled.value && |
|
|
|
(!selectedRange.isEmpty() || (activeCell.row !== null && activeCell.col !== null)) && |
|
|
|
(!selectedRange.isEmpty() || (activeCell.row !== null && activeCell.col !== null)) && |
|
|
@ -2175,7 +2182,7 @@ onKeyStroke('ArrowDown', onDown) |
|
|
|
</NcMenuItem> |
|
|
|
</NcMenuItem> |
|
|
|
|
|
|
|
|
|
|
|
<NcMenuItem |
|
|
|
<NcMenuItem |
|
|
|
v-if="!contextMenuClosing && !contextMenuTarget && data.some((r) => r.rowMeta.selected)" |
|
|
|
v-if="!contextMenuClosing && !contextMenuTarget && data.some((r) => r.rowMeta.selected) && !isDataReadOnly" |
|
|
|
class="nc-base-menu-item !text-red-600 !hover:bg-red-50" |
|
|
|
class="nc-base-menu-item !text-red-600 !hover:bg-red-50" |
|
|
|
data-testid="nc-delete-row" |
|
|
|
data-testid="nc-delete-row" |
|
|
|
@click="deleteSelectedRows" |
|
|
|
@click="deleteSelectedRows" |
|
|
@ -2222,7 +2229,7 @@ onKeyStroke('ArrowDown', onDown) |
|
|
|
</NcMenuItem> |
|
|
|
</NcMenuItem> |
|
|
|
|
|
|
|
|
|
|
|
<NcMenuItem |
|
|
|
<NcMenuItem |
|
|
|
v-if="contextMenuTarget && hasEditPermission" |
|
|
|
v-if="contextMenuTarget && hasEditPermission && !isDataReadOnly" |
|
|
|
class="nc-base-menu-item" |
|
|
|
class="nc-base-menu-item" |
|
|
|
data-testid="context-menu-item-paste" |
|
|
|
data-testid="context-menu-item-paste" |
|
|
|
:disabled="selectedReadonly" |
|
|
|
:disabled="selectedReadonly" |
|
|
@ -2241,7 +2248,8 @@ onKeyStroke('ArrowDown', onDown) |
|
|
|
contextMenuTarget && |
|
|
|
contextMenuTarget && |
|
|
|
hasEditPermission && |
|
|
|
hasEditPermission && |
|
|
|
selectedRange.isSingleCell() && |
|
|
|
selectedRange.isSingleCell() && |
|
|
|
(isLinksOrLTAR(fields[contextMenuTarget.col]) || !cellMeta[0]?.[contextMenuTarget.col].isVirtualCol) |
|
|
|
(isLinksOrLTAR(fields[contextMenuTarget.col]) || !cellMeta[0]?.[contextMenuTarget.col].isVirtualCol) && |
|
|
|
|
|
|
|
!isDataReadOnly |
|
|
|
" |
|
|
|
" |
|
|
|
class="nc-base-menu-item" |
|
|
|
class="nc-base-menu-item" |
|
|
|
:disabled="selectedReadonly" |
|
|
|
:disabled="selectedReadonly" |
|
|
@ -2256,7 +2264,7 @@ onKeyStroke('ArrowDown', onDown) |
|
|
|
|
|
|
|
|
|
|
|
<!-- Clear cell --> |
|
|
|
<!-- Clear cell --> |
|
|
|
<NcMenuItem |
|
|
|
<NcMenuItem |
|
|
|
v-else-if="contextMenuTarget && hasEditPermission" |
|
|
|
v-else-if="contextMenuTarget && hasEditPermission && !isDataReadOnly" |
|
|
|
class="nc-base-menu-item" |
|
|
|
class="nc-base-menu-item" |
|
|
|
:disabled="selectedReadonly" |
|
|
|
:disabled="selectedReadonly" |
|
|
|
data-testid="context-menu-item-clear" |
|
|
|
data-testid="context-menu-item-clear" |
|
|
@ -2278,7 +2286,7 @@ onKeyStroke('ArrowDown', onDown) |
|
|
|
</NcMenuItem> |
|
|
|
</NcMenuItem> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
<template v-if="hasEditPermission"> |
|
|
|
<template v-if="hasEditPermission && !isDataReadOnly"> |
|
|
|
<NcDivider v-if="!(!contextMenuClosing && !contextMenuTarget && data.some((r) => r.rowMeta.selected))" /> |
|
|
|
<NcDivider v-if="!(!contextMenuClosing && !contextMenuTarget && data.some((r) => r.rowMeta.selected))" /> |
|
|
|
<NcMenuItem |
|
|
|
<NcMenuItem |
|
|
|
v-if="contextMenuTarget && (selectedRange.isSingleCell() || selectedRange.isSingleRow())" |
|
|
|
v-if="contextMenuTarget && (selectedRange.isSingleCell() || selectedRange.isSingleRow())" |
|
|
|