-
+
{{ $t('activity.addSort') }}
diff --git a/packages/nc-gui-v2/components/smartsheet/Grid.vue b/packages/nc-gui-v2/components/smartsheet/Grid.vue
index 7852cfd50f..a5db17b0b0 100644
--- a/packages/nc-gui-v2/components/smartsheet/Grid.vue
+++ b/packages/nc-gui-v2/components/smartsheet/Grid.vue
@@ -15,6 +15,7 @@ import {
PaginationDataInj,
ReadonlyInj,
ReloadViewDataHookInj,
+ createEventHook,
enumColor,
inject,
onClickOutside,
@@ -44,8 +45,8 @@ const fields = inject(FieldsInj, ref([]))
const readOnly = inject(ReadonlyInj, false)
const isLocked = inject(IsLockedInj, ref(false))
-const reloadViewDataHook = inject(ReloadViewDataHookInj)
-const openNewRecordFormHook = inject(OpenNewRecordFormHookInj)
+const reloadViewDataHook = inject(ReloadViewDataHookInj, createEventHook())
+const openNewRecordFormHook = inject(OpenNewRecordFormHookInj, createEventHook())
const { isUIAllowed } = useUIPermission()
From e9474292a60f3c5cecaf3d0e70b56a59b860a859 Mon Sep 17 00:00:00 2001
From: braks <78412429+bcakmakoglu@users.noreply.github.com>
Date: Tue, 23 Aug 2022 11:32:43 +0200
Subject: [PATCH 2/8] fix(gui-v2): attachment cell not accepting files in
shared form view
---
.../components/cell/attachment/index.vue | 20 ++++++++++----
.../components/cell/attachment/utils.ts | 27 ++++++++++++-------
.../nc-gui-v2/components/shared-view/Form.vue | 17 ++++++------
.../nc-gui-v2/components/smartsheet/Form.vue | 12 ++++++---
.../nc-gui-v2/composables/useViewColumns.ts | 1 +
5 files changed, 52 insertions(+), 25 deletions(-)
diff --git a/packages/nc-gui-v2/components/cell/attachment/index.vue b/packages/nc-gui-v2/components/cell/attachment/index.vue
index e1981a915f..fb11a2a1e8 100644
--- a/packages/nc-gui-v2/components/cell/attachment/index.vue
+++ b/packages/nc-gui-v2/components/cell/attachment/index.vue
@@ -5,7 +5,9 @@ import { useSortable } from './sort'
import Modal from './Modal.vue'
import Carousel from './Carousel.vue'
import {
+ IsFormInj,
computed,
+ inject,
isImage,
openLink,
ref,
@@ -28,6 +30,10 @@ const { modelValue, rowIndex } = defineProps()
const emits = defineEmits()
+const isForm = inject(IsFormInj, ref(false))
+
+const attachmentCellRef = ref()
+
const sortableRef = ref()
const { cellRefs } = useSmartsheetStoreOrThrow()!
@@ -46,7 +52,9 @@ const {
storedFiles,
} = useProvideAttachmentCell(updateModelValue)
-const currentCellRef = computed(() => cellRefs.value.find((cell) => cell.dataset.key === `${rowIndex}${column.value.id}`))
+const currentCellRef = computed(() =>
+ isForm.value ? attachmentCellRef.value : cellRefs.value.find((cell) => cell.dataset.key === `${rowIndex}${column.value.id}`),
+)
const { dragging } = useSortable(sortableRef, visibleItems, updateModelValue, isReadonly)
@@ -93,7 +101,10 @@ const { isSharedForm } = useSmartsheetStoreOrThrow()
-
+
@@ -135,9 +146,8 @@ const { isSharedForm } = useSmartsheetStoreOrThrow()
>
@@ -146,7 +156,7 @@ const { isSharedForm } = useSmartsheetStoreOrThrow()
([])
/** keep user selected File object */
- const storedFiles = ref([])
+ const storedFiles = ref<{ title: string; file: File }[]>([])
const attachments = ref([])
@@ -60,7 +60,7 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
const { api, isLoading } = useApi()
- const { files, open } = useFileDialog()
+ const { files, open, reset } = useFileDialog()
/** remove a file from our stored attachments (either locally stored or saved ones) */
function removeFile(i: number) {
@@ -81,22 +81,27 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
if (!selectedFiles.length || isPublicGrid) return
if (isPublic.value) {
- storedFiles.value.push(...selectedFiles)
- storedFilesData.value.push(
+ storedFiles.value.push(
...(await Promise.all(
Array.from(selectedFiles).map(
(file) =>
new Promise((resolve) => {
- const res: AttachmentProps = { file, title: file.name }
- if (isImage(file.name, (file as any).mimetype)) {
+ const res: any = { ...file, file, title: file.name }
+
+ console.log(res)
+ if (isImage(file.name, (file).mimetype ?? file.type)) {
const reader = new FileReader()
- reader.onload = (e: any) => {
+
+ reader.onload = (e) => {
res.data = e.target?.result
+
resolve(res)
}
+
reader.onerror = () => {
resolve(res)
}
+
reader.readAsDataURL(file)
} else {
resolve(res)
@@ -106,7 +111,9 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
)),
)
- return updateModelValue(storedFilesData.value.map((storedFile) => storedFile.file))
+ reset()
+
+ return updateModelValue(storedFiles.value.map((next) => next.file))
}
const newAttachments = []
@@ -129,6 +136,8 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
}
}
+ reset()
+
updateModelValue([...attachments.value, ...newAttachments])
}
@@ -161,7 +170,7 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
}
/** our currently visible items, either the locally stored or the ones from db, depending on isPublicForm status */
- const visibleItems = computed(() => [...attachments.value, ...storedFiles.value])
+ const visibleItems = computed(() => (isPublic.value ? storedFiles.value : attachments.value))
watch(files, (nextFiles) => nextFiles && onFileSelect(nextFiles))
diff --git a/packages/nc-gui-v2/components/shared-view/Form.vue b/packages/nc-gui-v2/components/shared-view/Form.vue
index 61c5fe3685..fd71e4b2f9 100644
--- a/packages/nc-gui-v2/components/shared-view/Form.vue
+++ b/packages/nc-gui-v2/components/shared-view/Form.vue
@@ -29,33 +29,32 @@ function isRequired(_columnObj: Record, required = false) {
>
}
- return required || (columnObj && columnObj.rqd && !columnObj.cdf)
+ return !!(required || (columnObj && columnObj.rqd && !columnObj.cdf))
}
-
-
-
-
+
-
-
+
+
New form will be loaded after {{ secondsRemain }} seconds
+
-
+
+
@@ -81,6 +80,7 @@ function isRequired(_columnObj: Record
, required = false) {
{{ sharedFormView.subheading }}
+
@@ -90,6 +90,7 @@ function isRequired(_columnObj: Record, required = false) {
:required="isRequired(field, field.required)"
:hide-menu="true"
/>
+
{
-
+
| undefined, meta: ComputedRe
[curr.fk_column_id]: curr,
}
}, {})
+
fields.value = meta.value?.columns
?.map((column: ColumnType) => {
const currentColumnField = fieldById[column.id!] || {}
From 40e67573ad243ca750179d1477b160dc68a138f8 Mon Sep 17 00:00:00 2001
From: braks <78412429+bcakmakoglu@users.noreply.github.com>
Date: Tue, 23 Aug 2022 17:26:36 +0200
Subject: [PATCH 3/8] fix(gui-v2): shared form view not passing files when
submitting
---
.../components/cell/attachment/index.vue | 12 +++-
.../components/cell/attachment/utils.ts | 23 +++----
.../composables/useSharedFormViewStore.ts | 62 +++++++++++++------
.../composables/useSmartsheetRowStore.ts | 28 +++++++--
packages/nc-gui-v2/utils/urlUtils.ts | 5 +-
5 files changed, 83 insertions(+), 47 deletions(-)
diff --git a/packages/nc-gui-v2/components/cell/attachment/index.vue b/packages/nc-gui-v2/components/cell/attachment/index.vue
index fb11a2a1e8..090a1c07c4 100644
--- a/packages/nc-gui-v2/components/cell/attachment/index.vue
+++ b/packages/nc-gui-v2/components/cell/attachment/index.vue
@@ -18,7 +18,7 @@ import {
} from '#imports'
interface Props {
- modelValue: string | Record[] | null
+ modelValue?: string | Record[] | null
rowIndex?: number
}
@@ -50,10 +50,16 @@ const {
selectedImage,
isReadonly,
storedFiles,
-} = useProvideAttachmentCell(updateModelValue)
+} = useProvideAttachmentCell((val) => {
+ console.log(val)
+
+ updateModelValue(val)
+})
const currentCellRef = computed(() =>
- isForm.value ? attachmentCellRef.value : cellRefs.value.find((cell) => cell.dataset.key === `${rowIndex}${column.value.id}`),
+ !rowIndex && isForm.value
+ ? attachmentCellRef.value
+ : cellRefs.value.find((cell) => cell.dataset.key === `${rowIndex}${column.value.id}`),
)
const { dragging } = useSortable(sortableRef, visibleItems, updateModelValue, isReadonly)
diff --git a/packages/nc-gui-v2/components/cell/attachment/utils.ts b/packages/nc-gui-v2/components/cell/attachment/utils.ts
index 243934474c..c2ea48bf75 100644
--- a/packages/nc-gui-v2/components/cell/attachment/utils.ts
+++ b/packages/nc-gui-v2/components/cell/attachment/utils.ts
@@ -23,10 +23,11 @@ import MdiFilePowerpointBox from '~icons/mdi/file-powerpoint-box'
import MdiFileExcelOutline from '~icons/mdi/file-excel-outline'
import IcOutlineInsertDriveFile from '~icons/ic/outline-insert-drive-file'
-interface AttachmentProps {
+interface AttachmentProps extends File {
data?: any
file: File
title: string
+ mimetype: string
}
export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
@@ -44,11 +45,8 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
const editEnabled = inject(EditModeInj, ref(false))
- /** keep user selected files data (in base encoded string format) and meta details */
- const storedFilesData = ref<{ title: string; file: File }[]>([])
-
/** keep user selected File object */
- const storedFiles = ref<{ title: string; file: File }[]>([])
+ const storedFiles = ref([])
const attachments = ref([])
@@ -60,15 +58,14 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
const { api, isLoading } = useApi()
- const { files, open, reset } = useFileDialog()
+ const { files, open } = useFileDialog()
/** remove a file from our stored attachments (either locally stored or saved ones) */
function removeFile(i: number) {
if (isPublic.value) {
- storedFilesData.value.splice(i, 1)
storedFiles.value.splice(i, 1)
- updateModelValue(storedFilesData.value.map((storedFile) => storedFile.file))
+ updateModelValue(storedFiles.value.map((stored) => stored.file))
} else {
attachments.value.splice(i, 1)
@@ -86,9 +83,8 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
Array.from(selectedFiles).map(
(file) =>
new Promise((resolve) => {
- const res: any = { ...file, file, title: file.name }
+ const res: AttachmentProps = { ...file, file, title: file.name, mimetype: file.type }
- console.log(res)
if (isImage(file.name, (file).mimetype ?? file.type)) {
const reader = new FileReader()
@@ -111,9 +107,7 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
)),
)
- reset()
-
- return updateModelValue(storedFiles.value.map((next) => next.file))
+ return updateModelValue(storedFiles.value.map((stored) => stored.file))
}
const newAttachments = []
@@ -136,8 +130,6 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
}
}
- reset()
-
updateModelValue([...attachments.value, ...newAttachments])
}
@@ -176,7 +168,6 @@ export const [useProvideAttachmentCell, useAttachmentCell] = useInjectionState(
return {
attachments,
- storedFilesData,
visibleItems,
isPublic,
isPublicGrid,
diff --git a/packages/nc-gui-v2/composables/useSharedFormViewStore.ts b/packages/nc-gui-v2/composables/useSharedFormViewStore.ts
index 902405b41c..6902ffe036 100644
--- a/packages/nc-gui-v2/composables/useSharedFormViewStore.ts
+++ b/packages/nc-gui-v2/composables/useSharedFormViewStore.ts
@@ -1,12 +1,21 @@
import useVuelidate from '@vuelidate/core'
import { minLength, required } from '@vuelidate/validators'
+import type { Ref } from 'vue'
import { message } from 'ant-design-vue'
import type { ColumnType, FormType, LinkToAnotherRecordType, TableType, ViewType } from 'nocodb-sdk'
import { ErrorMessages, RelationTypes, UITypes, isVirtualCol } from 'nocodb-sdk'
-import type { Ref } from 'vue'
-import { SharedViewPasswordInj } from '~/context'
-import { extractSdkResponseErrorMsg } from '~/utils'
-import { useInjectionState, useMetas } from '#imports'
+import {
+ SharedViewPasswordInj,
+ computed,
+ extractSdkResponseErrorMsg,
+ provide,
+ ref,
+ useApi,
+ useInjectionState,
+ useMetas,
+ useProvideSmartsheetRowStore,
+ watch,
+} from '#imports'
const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((sharedViewId: string) => {
const progress = ref(false)
@@ -23,8 +32,10 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
const meta = ref()
const columns = ref<(ColumnType & { required?: boolean; show?: boolean })[]>()
- const { $api } = useNuxtApp()
+ const { api, isLoading } = useApi()
+
const { metas, setMeta } = useMetas()
+
const formState = ref({})
const { state: additionalState } = useProvideSmartsheetRowStore(
@@ -37,11 +48,11 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
)
const formColumns = computed(() =>
- columns?.value?.filter((c) => c.show)?.filter((col) => !isVirtualCol(col) || col.uidt === UITypes.LinkToAnotherRecord),
+ columns.value?.filter((c) => c.show).filter((col) => !isVirtualCol(col) || col.uidt === UITypes.LinkToAnotherRecord),
)
const loadSharedView = async () => {
try {
- const viewMeta = await $api.public.sharedViewMetaGet(sharedViewId, {
+ const viewMeta: Record = await api.public.sharedViewMetaGet(sharedViewId, {
headers: {
'xc-password': password.value,
},
@@ -54,9 +65,10 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
meta.value = viewMeta.model
columns.value = viewMeta.model?.columns
- setMeta(viewMeta.model)
+ await setMeta(viewMeta.model)
const relatedMetas = { ...viewMeta.relatedMetas }
+
Object.keys(relatedMetas).forEach((key) => setMeta(relatedMetas[key]))
} catch (e: any) {
if (e.response && e.response.status === 404) {
@@ -68,11 +80,14 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
}
const validators = computed(() => {
- const obj: any = {
+ const obj: Record> = {
localState: {},
virtual: {},
}
- for (const column of formColumns?.value ?? []) {
+
+ if (!formColumns.value) return obj
+
+ for (const column of formColumns.value) {
if (
!isVirtualCol(column) &&
((column.rqd && !column.cdf) || (column.pk && !(column.ai || column.cdf)) || (column as any).required)
@@ -103,7 +118,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
const v$ = useVuelidate(
validators,
- computed(() => ({ localState: formState?.value, virtual: additionalState?.value })),
+ computed(() => ({ localState: formState.value, virtual: additionalState.value })),
)
const submitForm = async () => {
@@ -113,18 +128,20 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
}
progress.value = true
- const data: Record = { ...(formState?.value ?? {}), ...(additionalState?.value || {}) }
+ const data: Record = { ...formState.value, ...additionalState.value }
const attachment: Record = {}
- for (const col of metas?.value?.[sharedView?.value?.fk_model_id as string]?.columns ?? []) {
+ /** find attachments in form data */
+ for (const col of metas.value?.[sharedView.value?.fk_model_id as string]?.columns) {
if (col.uidt === UITypes.Attachment) {
- attachment[`_${col.title}`] = data[col.title!]
- delete data[col.title!]
+ console.log(data[col.title!])
+
+ attachment[`_${col.title}`] = data[col.title].map((item: { file: File }) => item.file)
}
}
- await $api.public.dataCreate(
- sharedView?.value?.uuid as string,
+ await api.public.dataCreate(
+ (sharedView.value as any)?.uuid as string,
{
data,
...attachment,
@@ -139,7 +156,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
submitted.value = true
progress.value = false
- await message.success(sharedFormView.value?.success_msg || 'Saved successfully.')
+ await message.success(sharedFormView.value?.sucess_msg || 'Saved successfully.')
} catch (e: any) {
console.log(e)
await message.error(await extractSdkResponseErrorMsg(e))
@@ -148,13 +165,15 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
}
/** reset form if show_blank_form is true */
- watch(submitted, (nextVal: boolean) => {
- if (nextVal && sharedFormView.value?.show_blank_form) {
+ watch(submitted, (nextVal) => {
+ if (nextVal && (sharedFormView.value as any)?.show_blank_form) {
secondsRemain.value = 5
const intvl = setInterval(() => {
secondsRemain.value = secondsRemain.value - 1
+
if (secondsRemain.value < 0) {
submitted.value = false
+
clearInterval(intvl)
}
}, 1000)
@@ -185,6 +204,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
submitted,
secondsRemain,
passwordDlg,
+ isLoading,
}
}, 'expanded-form-store')
@@ -192,6 +212,8 @@ export { useProvideSharedFormStore }
export function useSharedFormStoreOrThrow() {
const sharedFormStore = useSharedFormStore()
+
if (sharedFormStore == null) throw new Error('Please call `useProvideSharedFormStore` on the appropriate parent component')
+
return sharedFormStore
}
diff --git a/packages/nc-gui-v2/composables/useSmartsheetRowStore.ts b/packages/nc-gui-v2/composables/useSmartsheetRowStore.ts
index de2987577e..5267fc4498 100644
--- a/packages/nc-gui-v2/composables/useSmartsheetRowStore.ts
+++ b/packages/nc-gui-v2/composables/useSmartsheetRowStore.ts
@@ -2,27 +2,41 @@ import { message } from 'ant-design-vue'
import { UITypes } from 'nocodb-sdk'
import type { ColumnType, LinkToAnotherRecordType, RelationTypes, TableType } from 'nocodb-sdk'
import type { Ref } from 'vue'
+import type { MaybeRef } from '@vueuse/core'
import type { Row } from './useViewData'
-import { useInjectionState, useMetas, useNuxtApp, useProject, useVirtualCell } from '#imports'
-import { NOCO } from '~/lib'
-import { deepCompare, extractPkFromRow, extractSdkResponseErrorMsg } from '~/utils'
+import {
+ NOCO,
+ computed,
+ deepCompare,
+ extractPkFromRow,
+ extractSdkResponseErrorMsg,
+ ref,
+ unref,
+ useInjectionState,
+ useMetas,
+ useNuxtApp,
+ useProject,
+ useVirtualCell,
+} from '#imports'
-const [useProvideSmartsheetRowStore, useSmartsheetRowStore] = useInjectionState((meta: Ref, row: Ref) => {
+const [useProvideSmartsheetRowStore, useSmartsheetRowStore] = useInjectionState((meta: Ref, row: MaybeRef) => {
const { $api } = useNuxtApp()
+
const { project } = useProject()
+
const { metas } = useMetas()
// state
const state = ref | Record[] | null>>({})
// getters
- const isNew = computed(() => row.value?.rowMeta?.new ?? false)
+ const isNew = computed(() => unref(row).rowMeta?.new ?? false)
// actions
const addLTARRef = async (value: Record, column: ColumnType) => {
const { isHm, isMm, isBt } = $(useVirtualCell(ref(column)))
if (isHm || isMm) {
- state.value[column.title!] = state.value[column.title!] || []
+ if (!state.value[column.title!]) state.value[column.title!] = []
if (state.value[column.title!]!.find((ln: Record) => deepCompare(ln, value))) {
return message.info('This value is already in the list')
@@ -106,6 +120,8 @@ export { useProvideSmartsheetRowStore }
export function useSmartsheetRowStoreOrThrow() {
const smartsheetRowStore = useSmartsheetRowStore()
+
if (smartsheetRowStore == null) throw new Error('Please call `useSmartsheetRowStore` on the appropriate parent component')
+
return smartsheetRowStore
}
diff --git a/packages/nc-gui-v2/utils/urlUtils.ts b/packages/nc-gui-v2/utils/urlUtils.ts
index 95c3aeb41a..e6bf9d8c74 100644
--- a/packages/nc-gui-v2/utils/urlUtils.ts
+++ b/packages/nc-gui-v2/utils/urlUtils.ts
@@ -21,10 +21,11 @@ export const replaceUrlsWithLink = (text: string): boolean | string => {
export const isValidURL = (str: string) => {
const pattern =
/^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00A1-\uFFFF0-9]-*)*[a-z\u00A1-\uFFFF0-9]+)(?:\.(?:[a-z\u00A1-\uFFFF0-9]-*)*[a-z\u00A1-\uFFFF0-9]+)*(?:\.(?:[a-z\u00A1-\uFFFF]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i
- return !!pattern.test(str)
+
+ return pattern.test(str)
}
-export const openLink = (path: string, baseURL: string, target = '_blank') => {
+export const openLink = (path: string, baseURL?: string, target = '_blank') => {
const url = new URL(path, baseURL)
window.open(url.href, target)
}
From 769c20ba582bef29f664155bcb9b384d3a66ab3f Mon Sep 17 00:00:00 2001
From: braks <78412429+bcakmakoglu@users.noreply.github.com>
Date: Tue, 23 Aug 2022 17:30:01 +0200
Subject: [PATCH 4/8] refactor(gui-v2): use page for shared view form
---
.../nc-gui-v2/components/shared-view/Form.vue | 169 -----------------
.../pages/[projectType]/form/[viewId].vue | 27 ++-
.../[projectType]/form/[viewId]/index.vue | 174 ++++++++++++++++++
3 files changed, 193 insertions(+), 177 deletions(-)
delete mode 100644 packages/nc-gui-v2/components/shared-view/Form.vue
create mode 100644 packages/nc-gui-v2/pages/[projectType]/form/[viewId]/index.vue
diff --git a/packages/nc-gui-v2/components/shared-view/Form.vue b/packages/nc-gui-v2/components/shared-view/Form.vue
deleted file mode 100644
index fd71e4b2f9..0000000000
--- a/packages/nc-gui-v2/components/shared-view/Form.vue
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- New form will be loaded after {{ secondsRemain }} seconds
-
-
-
-
-
-
-
-
-
-
-
-
-
This shared view is protected
-
-
-
-
- Unlock
-
-
-
-
-
-
-
diff --git a/packages/nc-gui-v2/pages/[projectType]/form/[viewId].vue b/packages/nc-gui-v2/pages/[projectType]/form/[viewId].vue
index b3590c30bb..a36615a205 100644
--- a/packages/nc-gui-v2/pages/[projectType]/form/[viewId].vue
+++ b/packages/nc-gui-v2/pages/[projectType]/form/[viewId].vue
@@ -1,9 +1,19 @@
-
+
+
+
diff --git a/packages/nc-gui-v2/pages/[projectType]/form/[viewId]/index.vue b/packages/nc-gui-v2/pages/[projectType]/form/[viewId]/index.vue
new file mode 100644
index 0000000000..97b17d9724
--- /dev/null
+++ b/packages/nc-gui-v2/pages/[projectType]/form/[viewId]/index.vue
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
From 6a2ccfd693f8cfdff75f3dd345b58ce65a768d50 Mon Sep 17 00:00:00 2001
From: braks <78412429+bcakmakoglu@users.noreply.github.com>
Date: Tue, 23 Aug 2022 17:40:59 +0200
Subject: [PATCH 5/8] fix(gui-v2): teleport warning on shared view form
---
packages/nc-gui-v2/components/cell/Text.vue | 5 ++---
packages/nc-gui-v2/layouts/default.vue | 12 ++++++------
packages/nc-gui-v2/nuxt-shim.d.ts | 1 +
.../nc-gui-v2/pages/[projectType]/form/[viewId].vue | 3 +++
4 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/packages/nc-gui-v2/components/cell/Text.vue b/packages/nc-gui-v2/components/cell/Text.vue
index 2c8e54d0d7..23575fc222 100644
--- a/packages/nc-gui-v2/components/cell/Text.vue
+++ b/packages/nc-gui-v2/components/cell/Text.vue
@@ -1,10 +1,9 @@