多维表格
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB

<script setup lang="ts">
import { onMounted, watchEffect } from "@vue/runtime-core";
import { Form } from "ant-design-vue";
import type { TableType } from "nocodb-sdk";
import { useToast } from "vue-toastification";
import { useProject, useTableCreate, useTabs } from "#imports";
import { extractSdkResponseErrorMsg } from "~/utils/errorUtils";
import { validateTableName } from "~/utils/validation";
import { useNuxtApp } from "#app";
interface Props {
modelValue?: boolean;
tableMeta: TableType;
}
const { modelValue = false, tableMeta } = defineProps<Props>();
const emit = defineEmits(["update:modelValue", "updated"]);
const { $e, $api } = useNuxtApp();
const toast = useToast();
const dialogShow = computed({
get() {
return modelValue;
},
set(v) {
emit("update:modelValue", v);
}
});
const { addTab } = useTabs();
const { loadTables } = useProject();
const { project, tables } = useProject();
const prefix = computed(() => project?.value?.prefix || "");
const validateDuplicateAlias = (v: string) => {
return (tables?.value || []).every((t) => t.title !== (v || "")) || "Duplicate table alias";
};
const validateLeadingOrTrailingWhiteSpace = (v: string) => {
return !/^\s+|\s+$/.test(v) || "Leading or trailing whitespace not allowed in table name";
};
const validateDuplicate = (v: string) => {
return (tables?.value || []).every((t) => t.table_name.toLowerCase() !== (v || "").toLowerCase()) || "Duplicate table name";
};
const inputEl = $ref<any>();
const useForm = Form.useForm;
const formState = reactive({
title: ""
});
const validators = computed(() => {
return {
title: [validateTableName, validateDuplicateAlias],
table_name: [validateTableName]
};
});
const { resetFields, validate, validateInfos } = useForm(formState, validators);
watchEffect(() => {
if (tableMeta?.title) formState.title = tableMeta?.title;
// todo: replace setTimeout and follow better approach
nextTick(() => {
const input = inputEl?.$el;
input.setSelectionRange(0, formState.title.length);
input.focus();
});
});
const renameTable = async () => {
try {
await $api.dbTable.update(tableMeta?.id as string, {
title: formState.title
});
loadTables();
toast.success("Table renamed successfully");
$e("a:table:rename");
} catch (e) {
toast.error(await extractSdkResponseErrorMsg(e));
}
};
</script>
<template>
<a-modal v-model:visible="dialogShow" @keydown.esc="dialogShow = false" @finish="renameTable">
<template #footer>
<a-button key="back" @click="dialogShow = false">{{ $t("general.cancel") }}</a-button>
<a-button key="submit" type="primary" @click="renameTable">{{ $t("general.submit") }}</a-button>
</template>
<div class="pl-10 pr-10 pt-5">
<a-form :model="formState" name="create-new-table-form">
<!-- Rename Table -->
<div class="prose-xl font-bold text-center my-4">Rename Table</div>
<!-- hint="Enter table name" -->
<div class="mb-2">Table Name</div>
<a-form-item v-bind="validateInfos.title">
<a-input
ref="inputEl"
v-model:value="formState.title"
size="large"
hide-details
:placeholder="$t('msg.info.enterTableName')"
/>
</a-form-item>
</a-form>
</div>
</a-modal>
</template>