mirror of
https://github.com/nocodb/nocodb.git
synced 2026-04-30 19:16:41 +00:00
refactor: rename project and base
- Rename `Project` => `Base` - Rename `Base` => `Source` - Remove `db` from data/meta api endpoints - Add backward compatibility for old apis - Migrations for renaming table and columns Signed-off-by: Pranav C <pranavxc@gmail.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<script lang="ts" setup>
|
||||
import { Empty } from 'ant-design-vue'
|
||||
import type { ProjectType } from 'nocodb-sdk'
|
||||
import type { BaseType } from 'nocodb-sdk'
|
||||
import { ProjectRoles, ProjectStatus, WorkspaceUserRoles } from 'nocodb-sdk'
|
||||
import { nextTick } from '@vue/runtime-core'
|
||||
import { NcProjectType, isEeUI, navigateTo, storeToRefs, timeAgo, useGlobal, useWorkspace } from '#imports'
|
||||
@@ -10,13 +10,13 @@ const workspaceStore = useWorkspace()
|
||||
const { updateProjectTitle } = workspaceStore
|
||||
const { activePage } = storeToRefs(workspaceStore)
|
||||
|
||||
const projectsStore = useProjects()
|
||||
const { loadProjects } = projectsStore
|
||||
const { projectsList, isProjectsLoading } = storeToRefs(projectsStore)
|
||||
const basesStore = useBases()
|
||||
const { loadProjects } = basesStore
|
||||
const { basesList, isProjectsLoading } = storeToRefs(basesStore)
|
||||
|
||||
const { navigateToProject } = useGlobal()
|
||||
|
||||
// const filteredProjects = computed(() => projects.value?.filter((p) => !p.deleted) || [])
|
||||
// const filteredProjects = computed(() => bases.value?.filter((p) => !p.deleted) || [])
|
||||
|
||||
const { $e, $poller } = useNuxtApp()
|
||||
|
||||
@@ -27,10 +27,10 @@ const { refreshCommandPalette } = useCommandPalette()
|
||||
const showProjectDeleteModal = ref(false)
|
||||
const toBeDeletedProjectId = ref<string | undefined>()
|
||||
|
||||
const openProject = async (project: ProjectType) => {
|
||||
const openProject = async (base: BaseType) => {
|
||||
navigateToProject({
|
||||
projectId: project.id!,
|
||||
type: project.type as NcProjectType,
|
||||
baseId: base.id!,
|
||||
type: base.type as NcProjectType,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -40,46 +40,46 @@ const roleAlias = {
|
||||
[WorkspaceUserRoles.CREATOR]: 'Workspace Creator',
|
||||
[WorkspaceUserRoles.EDITOR]: 'Workspace Editor',
|
||||
[WorkspaceUserRoles.COMMENTER]: 'Workspace Commenter',
|
||||
[ProjectRoles.CREATOR]: 'Project Creator',
|
||||
[ProjectRoles.EDITOR]: 'Project Editor',
|
||||
[ProjectRoles.VIEWER]: 'Project Viewer',
|
||||
[ProjectRoles.COMMENTER]: 'Project Commenter',
|
||||
[ProjectRoles.OWNER]: 'Project Owner',
|
||||
[ProjectRoles.CREATOR]: 'Base Creator',
|
||||
[ProjectRoles.EDITOR]: 'Base Editor',
|
||||
[ProjectRoles.VIEWER]: 'Base Viewer',
|
||||
[ProjectRoles.COMMENTER]: 'Base Commenter',
|
||||
[ProjectRoles.OWNER]: 'Base Owner',
|
||||
}
|
||||
|
||||
const deleteProject = (project: ProjectType) => {
|
||||
$e('c:project:delete')
|
||||
const deleteProject = (base: BaseType) => {
|
||||
$e('c:base:delete')
|
||||
|
||||
showProjectDeleteModal.value = true
|
||||
toBeDeletedProjectId.value = project.id
|
||||
toBeDeletedProjectId.value = base.id
|
||||
}
|
||||
|
||||
const renameInput = ref<HTMLInputElement>()
|
||||
const enableEdit = (index: number) => {
|
||||
projectsList.value![index]!.temp_title = projectsList.value![index].title
|
||||
projectsList.value![index]!.edit = true
|
||||
basesList.value![index]!.temp_title = basesList.value![index].title
|
||||
basesList.value![index]!.edit = true
|
||||
nextTick(() => {
|
||||
renameInput.value?.focus()
|
||||
renameInput.value?.select()
|
||||
})
|
||||
}
|
||||
const disableEdit = (index: number) => {
|
||||
projectsList.value![index]!.temp_title = undefined
|
||||
projectsList.value![index]!.edit = false
|
||||
basesList.value![index]!.temp_title = undefined
|
||||
basesList.value![index]!.edit = false
|
||||
}
|
||||
|
||||
const customRow = (record: ProjectType) => ({
|
||||
const customRow = (record: BaseType) => ({
|
||||
onClick: async () => {
|
||||
openProject(record)
|
||||
|
||||
$e('a:project:open')
|
||||
$e('a:base:open')
|
||||
},
|
||||
class: ['group'],
|
||||
})
|
||||
|
||||
const columns = computed(() => [
|
||||
{
|
||||
title: 'Project Name',
|
||||
title: 'Base Name',
|
||||
dataIndex: 'title',
|
||||
sorter: {
|
||||
compare: (a, b) => a.title?.localeCompare(b.title),
|
||||
@@ -163,18 +163,18 @@ const DlgProjectDuplicateOnOk = async (jobData: { id: string }) => {
|
||||
await loadProjects('workspace')
|
||||
refreshCommandPalette()
|
||||
} else if (data.status === JobStatus.FAILED) {
|
||||
message.error('Failed to duplicate project')
|
||||
message.error('Failed to duplicate base')
|
||||
await loadProjects('workspace')
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
$e('a:project:duplicate')
|
||||
$e('a:base:duplicate')
|
||||
}
|
||||
|
||||
const duplicateProject = (project: ProjectType) => {
|
||||
selectedProjectToDuplicate.value = project
|
||||
const duplicateProject = (base: BaseType) => {
|
||||
selectedProjectToDuplicate.value = base
|
||||
isDuplicateDlgOpen.value = true
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ function onProjectTitleClick(index: number) {
|
||||
clickCount++
|
||||
if (clickCount === 1) {
|
||||
timer = setTimeout(function () {
|
||||
openProject(projectsList.value![index])
|
||||
openProject(basesList.value![index])
|
||||
clickCount = 0
|
||||
}, delay)
|
||||
} else {
|
||||
@@ -196,16 +196,16 @@ function onProjectTitleClick(index: number) {
|
||||
}
|
||||
}
|
||||
|
||||
const setIcon = async (icon: string, project: ProjectType) => {
|
||||
const setIcon = async (icon: string, base: BaseType) => {
|
||||
try {
|
||||
const meta = {
|
||||
...((project.meta as object) || {}),
|
||||
...((base.meta as object) || {}),
|
||||
icon,
|
||||
}
|
||||
|
||||
projectsStore.updateProject(project.id!, { meta: JSON.stringify(meta) })
|
||||
basesStore.updateProject(base.id!, { meta: JSON.stringify(meta) })
|
||||
|
||||
$e('a:project:icon:navdraw', { icon })
|
||||
$e('a:base:icon:navdraw', { icon })
|
||||
} catch (e: any) {
|
||||
message.error(await extractSdkResponseErrorMsg(e))
|
||||
}
|
||||
@@ -215,7 +215,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
<template>
|
||||
<div>
|
||||
<div
|
||||
v-if="!projectsList || projectsList?.length === 0 || isProjectsLoading"
|
||||
v-if="!basesList || basesList?.length === 0 || isProjectsLoading"
|
||||
class="w-full flex flex-row justify-center items-center"
|
||||
style="height: calc(100vh - 16rem)"
|
||||
>
|
||||
@@ -232,7 +232,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
/>
|
||||
<template v-if="activePage === 'workspace'">
|
||||
<div class="font-medium text-xl">Welcome to nocoDB</div>
|
||||
<div class="font-medium">Create your first Project!</div>
|
||||
<div class="font-medium">Create your first Base!</div>
|
||||
</template>
|
||||
<template v-else-if="activePage === 'recent'">
|
||||
<div class="font-medium text-lg">No Recent Projects</div>
|
||||
@@ -247,7 +247,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
</div>
|
||||
<a-table
|
||||
v-else
|
||||
v-model:data-source="projectsList"
|
||||
v-model:data-source="basesList"
|
||||
class="h-full"
|
||||
:class="{
|
||||
'full-height-table': activePage !== 'workspace',
|
||||
@@ -263,7 +263,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
|
||||
<template #bodyCell="{ column, text, record, index: i }">
|
||||
<template v-if="column.dataIndex === 'title'">
|
||||
<div class="flex items-center nc-project-title gap-2.5 max-w-full -ml-1.5">
|
||||
<div class="flex items-center nc-base-title gap-2.5 max-w-full -ml-1.5">
|
||||
<div class="flex items-center gap-2 text-center">
|
||||
<LazyGeneralEmojiPicker
|
||||
:key="record.id"
|
||||
@@ -341,7 +341,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
|
||||
<template v-if="column.dataIndex === 'id'">
|
||||
<a-dropdown
|
||||
v-if="isUIAllowed('projectActionMenu', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
v-if="isUIAllowed('baseActionMenu', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
:trigger="['click']"
|
||||
>
|
||||
<div @click.stop>
|
||||
@@ -361,7 +361,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
<a-menu-item
|
||||
v-if="
|
||||
record.type === NcProjectType.DB &&
|
||||
isUIAllowed('projectDuplicate', { roles: [record.workspace_role, record.project_role].join() })
|
||||
isUIAllowed('baseDuplicate', { roles: [record.workspace_role, record.project_role].join() })
|
||||
"
|
||||
@click="duplicateProject(record)"
|
||||
>
|
||||
@@ -372,7 +372,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
</a-menu-item>
|
||||
<!--
|
||||
<a-menu-item
|
||||
v-if="false && isUIAllowed('projectMove', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
v-if="false && isUIAllowed('baseMove', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
@click="moveProject(record)"
|
||||
>
|
||||
<div class="nc-menu-item-wrapper">
|
||||
@@ -382,7 +382,7 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
</a-menu-item>
|
||||
-->
|
||||
<a-menu-item
|
||||
v-if="isUIAllowed('projectDelete', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
v-if="isUIAllowed('baseDelete', { roles: [record.workspace_role, record.project_role].join() })"
|
||||
@click="deleteProject(record)"
|
||||
>
|
||||
<div class="nc-menu-item-wrapper text-red-500">
|
||||
@@ -397,17 +397,17 @@ const setIcon = async (icon: string, project: ProjectType) => {
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
<DlgProjectDelete v-if="toBeDeletedProjectId" v-model:visible="showProjectDeleteModal" :project-id="toBeDeletedProjectId" />
|
||||
<DlgProjectDelete v-if="toBeDeletedProjectId" v-model:visible="showProjectDeleteModal" :base-id="toBeDeletedProjectId" />
|
||||
<WorkspaceMoveProjectDlg
|
||||
v-if="selectedProjectToMove"
|
||||
v-model="isMoveDlgOpen"
|
||||
:project="selectedProjectToMove"
|
||||
:base="selectedProjectToMove"
|
||||
@success="workspaceMoveProjectOnSuccess"
|
||||
/>
|
||||
<DlgProjectDuplicate
|
||||
v-if="selectedProjectToDuplicate"
|
||||
v-model="isDuplicateDlgOpen"
|
||||
:project="selectedProjectToDuplicate"
|
||||
:base="selectedProjectToDuplicate"
|
||||
:on-ok="DlgProjectDuplicateOnOk"
|
||||
/>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user