mirror of
https://github.com/nocodb/nocodb.git
synced 2026-05-02 08:36:45 +00:00
* feat: Improved ui (#6156) * refactor: revert Signed-off-by: Pranav C <pranavxc@gmail.com> feat: shared base Signed-off-by: Pranav C <pranavxc@gmail.com> fix: remove duplicate import statement Signed-off-by: Pranav C <pranavxc@gmail.com> fix: disable starred & license menu Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix airtable wait issue Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable mysql in ci Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix checkbox order for sqlite Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: disable quick tests Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: fix dbType env variable for CI Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: workspace API access error fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable SQLite CI CD Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: use DB_TYPE env variable Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: enable SQLite UT Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: isHub cleanup Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: add check for EE Timezone spec Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: cleanup Signed-off-by: Pranav C <pranavxc@gmail.com> chore: cleanup Signed-off-by: Pranav C <pranavxc@gmail.com> test: EE check fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: test correction Signed-off-by: Pranav C <pranavxc@gmail.com> chore: sync latest changes Signed-off-by: Pranav C <pranavxc@gmail.com> test: set EE=false Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> test: set NC Edition to community in workflow file Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> chore: update sdk build command Signed-off-by: Pranav C <pranavxc@gmail.com> refactor: i18n and other changes Signed-off-by: Pranav C <pranavxc@gmail.com> feat: new ui Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: sync tests Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: lint Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: shared view/base related bugs Signed-off-by: Pranav C <pranavxc@gmail.com> * test: checkbox verification sort order fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix sqlite reset Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable selfhosted runners Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: table ops (draft) Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * Docs: screenshots for table-operations.md * refactor: introduce missing buttons Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: get all fields Signed-off-by: Pranav C <pranavxc@gmail.com> * test: UT fix- new data API response Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: EE is false Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: webhook lookup as string in CE Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: include created_at and updated_at Signed-off-by: Pranav C <pranavxc@gmail.com> * test: fix UT newDataAPI response for PG Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: separate api for webhook related plugins Signed-off-by: Pranav C <pranavxc@gmail.com> * test: msyql filter corrections Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: mysql group by test corrections Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix datatype for rating field in groupby spec for pg Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: kanban datatype correction Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: column edit for mysql- rating field Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: misc fixes Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable 4 workers Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: enable 2 workers per shard only Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: table CRUD * Rename table-operations.md to table-crud.md * Create column-crud.md * docs: row CRUD * Rename row.md to row-crud.md * docs: project crud * docs: toolbar (skeleton) * refactor: single page UI and bug fixes Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: sync tests playwright Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: add missing dependency Signed-off-by: Pranav C <pranavxc@gmail.com> * feat: single page ui, test corrections Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: tests Signed-off-by: Pranav C <pranavxc@gmail.com> * test: project rename test correction Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: remove only Signed-off-by: Pranav C <pranavxc@gmail.com> * test: remove wrong import statement Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: delete option not visible in project context menu Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: move ws access within isEE() Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: fix groupby * test: groupby fix Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: signup & landing page * docs: project crud * docs: project-crud misc * docs: toolbar fields * docs: toolbar / filters * docs: toolbar / group by * docs: toolbar / sort * docs: toolbar / row height * docs: filters additional options * docs: file re-order Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: add links to column types * docs: code snippets * docs: links * docs: lookup * docs: rollup * docs: formula * docs: primary key * docs: display value * docs: development setup * docs: swagger * fix(nc-gui): encodeURIComponent for row id - closes: #6202 * docs: language * docs: expanded record * docs: import airtable * docs: airtable * docs: webhook * docs: revert file rename Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * docs: account settings * docs: audit * docs: meta management * docs: project settings * docs: shared base * docs: shared view * docs: meta sync * docs: team-auth * docs: views * docs: fix URL * docs: URL corrections * fix: shared base, view related bugs Signed-off-by: Pranav C <pranavxc@gmail.com> * test: EE check for WSaccess Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * test: exclude EE tests Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> * fix: missing project delete closes #6215 Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: merge existing project meta if found closes #6216 Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: merge existing project meta if found closes #6216 Signed-off-by: Pranav C <pranavxc@gmail.com> --------- Signed-off-by: Pranav C <pranavxc@gmail.com> Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: DarkPhoenix2704 <anbarasun123@gmail.com> Co-authored-by: Wing-Kam Wong <wingkwong.code@gmail.com> * refactor: docs and other bug fixes Signed-off-by: Pranav C <pranavxc@gmail.com> * feat: populate default project on super admin signup Signed-off-by: Pranav C <pranavxc@gmail.com> * fix: include created project details in signup response if avail, missing Dockerfile Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: use custom function for resolving ts path aliases Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: add missing generate script Signed-off-by: Pranav C <pranavxc@gmail.com> * chore: webpack build correction - ts path resolve Signed-off-by: Pranav C <pranavxc@gmail.com> --------- Signed-off-by: Pranav C <pranavxc@gmail.com> Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: mertmit <mertmit99@gmail.com> Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com> Co-authored-by: DarkPhoenix2704 <anbarasun123@gmail.com> Co-authored-by: Wing-Kam Wong <wingkwong.code@gmail.com>
259 lines
6.9 KiB
Vue
259 lines
6.9 KiB
Vue
<script setup lang="ts">
|
|
import {
|
|
extractSdkResponseErrorMsg,
|
|
iconMap,
|
|
message,
|
|
onMounted,
|
|
storeToRefs,
|
|
useCopy,
|
|
useDashboard,
|
|
useI18n,
|
|
useNuxtApp,
|
|
useProject,
|
|
} from '#imports'
|
|
|
|
interface ShareBase {
|
|
uuid?: string
|
|
url?: string
|
|
role?: string
|
|
}
|
|
|
|
enum ShareBaseRole {
|
|
Editor = 'editor',
|
|
Viewer = 'viewer',
|
|
}
|
|
|
|
const { t } = useI18n()
|
|
|
|
const { dashboardUrl } = useDashboard()
|
|
|
|
const { $api, $e } = useNuxtApp()
|
|
|
|
const base = ref<null | ShareBase>(null)
|
|
|
|
const showEditBaseDropdown = ref(false)
|
|
|
|
const { project } = storeToRefs(useProject())
|
|
|
|
const { copy } = useCopy()
|
|
|
|
const url = computed(() => (base.value && base.value.uuid ? `${dashboardUrl.value}#/base/${base.value.uuid}` : null))
|
|
|
|
const loadBase = async () => {
|
|
try {
|
|
if (!project.value.id) return
|
|
|
|
const res = await $api.project.sharedBaseGet(project.value.id)
|
|
|
|
base.value = {
|
|
uuid: res.uuid,
|
|
url: res.url,
|
|
role: res.roles,
|
|
}
|
|
} catch (e: any) {
|
|
message.error(await extractSdkResponseErrorMsg(e))
|
|
}
|
|
}
|
|
|
|
const createShareBase = async (role = ShareBaseRole.Viewer) => {
|
|
try {
|
|
if (!project.value.id) return
|
|
|
|
const res = await $api.project.sharedBaseUpdate(project.value.id, {
|
|
roles: role,
|
|
})
|
|
|
|
base.value = res ?? {}
|
|
base.value!.role = role
|
|
} catch (e: any) {
|
|
message.error(await extractSdkResponseErrorMsg(e))
|
|
}
|
|
|
|
$e('a:shared-base:enable', { role })
|
|
}
|
|
|
|
const disableSharedBase = async () => {
|
|
try {
|
|
if (!project.value.id) return
|
|
|
|
await $api.project.sharedBaseDisable(project.value.id)
|
|
base.value = null
|
|
} catch (e: any) {
|
|
message.error(await extractSdkResponseErrorMsg(e))
|
|
}
|
|
|
|
$e('a:shared-base:disable')
|
|
}
|
|
|
|
const recreate = async () => {
|
|
try {
|
|
if (!project.value.id) return
|
|
|
|
const sharedBase = await $api.project.sharedBaseCreate(project.value.id, {
|
|
roles: base.value?.role || ShareBaseRole.Viewer,
|
|
})
|
|
|
|
const newBase = sharedBase || {}
|
|
|
|
base.value = { ...newBase, role: base.value?.role }
|
|
} catch (e: any) {
|
|
message.error(await extractSdkResponseErrorMsg(e))
|
|
}
|
|
|
|
$e('a:shared-base:recreate')
|
|
}
|
|
|
|
const copyUrl = async () => {
|
|
if (!url.value) return
|
|
try {
|
|
await copy(url.value)
|
|
|
|
// Copied shareable base url to clipboard!
|
|
message.success(t('msg.success.shareableURLCopied'))
|
|
} catch (e: any) {
|
|
message.error(e.message)
|
|
}
|
|
|
|
$e('c:shared-base:copy-url')
|
|
}
|
|
|
|
const navigateToSharedBase = () => {
|
|
if (!url.value) return
|
|
|
|
window.open(url.value, '_blank')
|
|
|
|
$e('c:shared-base:open-url')
|
|
}
|
|
|
|
const generateEmbeddableIframe = async () => {
|
|
if (!url.value) return
|
|
try {
|
|
await copy(`<iframe
|
|
class="nc-embed"
|
|
src="${url.value}?embed"
|
|
frameborder="0"
|
|
width="100%"
|
|
height="700"
|
|
style="background: transparent; border: 1px solid #ddd"></iframe>`)
|
|
|
|
// Copied embeddable html code!
|
|
message.success(t('msg.success.embeddableHTMLCodeCopied'))
|
|
} catch (e: any) {
|
|
message.error(e.message)
|
|
}
|
|
$e('c:shared-base:copy-embed-frame')
|
|
}
|
|
|
|
onMounted(() => {
|
|
if (!base.value) {
|
|
loadBase()
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div class="flex flex-col gap-2 w-full" data-testid="nc-share-base-sub-modal">
|
|
<!-- Generate publicly shareable readonly base -->
|
|
<div class="flex text-xs text-gray-500 justify-start ml-1">{{ $t('msg.info.generatePublicShareableReadonlyBase') }}</div>
|
|
|
|
<div class="flex flex-row justify-between mx-1">
|
|
<a-dropdown v-model="showEditBaseDropdown" class="flex" overlay-class-name="nc-dropdown-shared-base-toggle">
|
|
<a-button>
|
|
<div class="flex flex-row rounded-md items-center space-x-2 nc-disable-shared-base">
|
|
<div v-if="base?.uuid">{{ $t('activity.shareBase.enable') }}</div>
|
|
<div v-else>{{ $t('activity.shareBase.disable') }}</div>
|
|
<IcRoundKeyboardArrowDown class="h-[1rem]" />
|
|
</div>
|
|
</a-button>
|
|
|
|
<template #overlay>
|
|
<a-menu>
|
|
<a-menu-item>
|
|
<div v-if="base?.uuid" class="py-3" @click="disableSharedBase">{{ $t('activity.shareBase.disable') }}</div>
|
|
<div v-else class="py-3" @click="createShareBase(ShareBaseRole.Viewer)">{{ $t('activity.shareBase.enable') }}</div>
|
|
</a-menu-item>
|
|
</a-menu>
|
|
</template>
|
|
</a-dropdown>
|
|
|
|
<a-select
|
|
v-if="base?.uuid"
|
|
v-model:value="base.role"
|
|
class="flex nc-shared-base-role"
|
|
dropdown-class-name="nc-dropdown-share-base-role"
|
|
>
|
|
<template #suffixIcon>
|
|
<div class="flex flex-row">
|
|
<IcRoundKeyboardArrowDown class="text-black -mt-0.5 h-[1rem]" />
|
|
</div>
|
|
</template>
|
|
|
|
<a-select-option
|
|
v-for="(role, index) in [ShareBaseRole.Editor, ShareBaseRole.Viewer]"
|
|
:key="index"
|
|
:value="role"
|
|
dropdown-class-name="capitalize"
|
|
@click="createShareBase(role)"
|
|
>
|
|
<div class="w-full px-2 capitalize">
|
|
{{ role }}
|
|
</div>
|
|
</a-select-option>
|
|
</a-select>
|
|
</div>
|
|
<div v-if="base?.uuid" class="flex flex-row mt-2 bg-red-50 py-4 mx-1 px-2 items-center rounded-sm w-full justify-between">
|
|
<span class="flex text-xs overflow-x-hidden overflow-ellipsis text-gray-700 pl-2 nc-url">{{ url }}</span>
|
|
|
|
<div class="flex border-l-1 pt-1 pl-1">
|
|
<a-tooltip placement="bottom">
|
|
<template #title>
|
|
<span>{{ $t('general.reload') }}</span>
|
|
</template>
|
|
|
|
<a-button type="text" class="!rounded-md mr-1 -mt-1.5 h-[1rem]" @click="recreate">
|
|
<template #icon>
|
|
<component :is="iconMap.reload" class="flex mx-auto text-gray-600" />
|
|
</template>
|
|
</a-button>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip placement="bottom">
|
|
<template #title>
|
|
<span>{{ $t('activity.copyUrl') }}</span>
|
|
</template>
|
|
|
|
<a-button type="text" class="!rounded-md mr-1 -mt-1.5 h-[1rem]" @click="copyUrl">
|
|
<template #icon>
|
|
<component :is="iconMap.copy" class="flex mx-auto text-gray-600" />
|
|
</template>
|
|
</a-button>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip placement="bottom">
|
|
<template #title>
|
|
<span>{{ $t('activity.openTab') }}</span>
|
|
</template>
|
|
|
|
<a-button type="text" class="!rounded-md mr-1 -mt-1.5 h-[1rem]" @click="navigateToSharedBase">
|
|
<template #icon>
|
|
<component :is="iconMap.share" class="flex mx-auto text-gray-600" />
|
|
</template>
|
|
</a-button>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip placement="bottom">
|
|
<template #title>
|
|
<span>{{ $t('activity.iFrame') }}</span>
|
|
</template>
|
|
|
|
<a-button type="text" class="!rounded-md mr-1 -mt-1.5 h-[1rem]" @click="generateEmbeddableIframe">
|
|
<template #icon>
|
|
<component :is="iconMap.xml" class="flex mx-auto text-gray-600" />
|
|
</template>
|
|
</a-button>
|
|
</a-tooltip>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|