From 8bd4215c00e0a7223862d59f6ea5a795b37cd412 Mon Sep 17 00:00:00 2001
From: Ramesh Mane <101566080+rameshmane7218@users.noreply.github.com>
Date: Sat, 9 Mar 2024 11:51:12 +0000
Subject: [PATCH] fix(nc-gui): move get prefill link in share form modal
---
.../dlg/share-and-collaborate/SharePage.vue | 110 ++++++++++++++----
.../nc-gui/components/smartsheet/Form.vue | 70 ++++-------
.../composables/useSharedFormViewStore.ts | 2 +-
packages/nc-gui/lang/en.json | 6 +-
packages/nc-gui/lib/enums.ts | 3 +-
packages/nc-gui/lib/types.ts | 1 +
packages/nc-gui/store/views.ts | 5 +
7 files changed, 123 insertions(+), 74 deletions(-)
diff --git a/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue b/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue
index b6b282ef3e..f197402783 100644
--- a/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue
+++ b/packages/nc-gui/components/dlg/share-and-collaborate/SharePage.vue
@@ -7,6 +7,8 @@ const { view: _view, $api } = useSmartsheetStoreOrThrow()
const { $e } = useNuxtApp()
const { getBaseUrl, appInfo } = useGlobal()
+const { t } = useI18n()
+
const { dashboardUrl } = useDashboard()
const viewStore = useViewsStore()
@@ -52,6 +54,10 @@ const url = computed(() => {
return sharedViewUrl() ?? ''
})
+const forPreFillUrl = computed(() => {
+ return sharedViewUrl(true) ?? ''
+})
+
const passwordProtectedLocal = ref(false)
const passwordProtected = computed(() => {
@@ -149,17 +155,31 @@ const surveyMode = computed({
},
})
-const preFilledMode = computed({
- get: () => parseProp(activeView.value?.meta)?.preFilledMode || PreFilledMode.Default,
- set: (preFilled) => {
+const formPreFill = computed({
+ get: () => ({
+ preFillEnabled: parseProp(activeView.value?.meta)?.preFillEnabled ?? false,
+ preFilledMode: parseProp(activeView.value?.meta)?.preFilledMode || t('general.default'),
+ }),
+ set: (value) => {
if (!activeView.value?.meta) return
- activeView.value.meta = { ...activeView.value.meta, preFilledMode: preFilled }
+ if (formPreFill.value.preFillEnabled !== value.preFillEnabled) {
+ $e(`a:view:share:prefilled-mode-${value.preFillEnabled ? 'enabled' : 'disabled'}`)
+ }
+
+ if (formPreFill.value.preFilledMode !== value.preFilledMode) {
+ $e(`a:view:share:${value.preFillEnabled || 'default'}-prefilled-mode`)
+ }
+
+ activeView.value.meta = {
+ ...activeView.value.meta,
+ ...value,
+ }
savePreFilledMode()
},
})
-function sharedViewUrl() {
+function sharedViewUrl(isPreFillUrl: boolean = false) {
if (!activeView.value) return
let viewType
@@ -191,7 +211,13 @@ function sharedViewUrl() {
dashboardUrl1 = `${baseUrl}${appInfo.value?.dashboardPath}`
}
- return encodeURI(`${dashboardUrl1}#/nc/${viewType}/${activeView.value.uuid}${surveyMode.value ? '/survey' : ''}`)
+ return encodeURI(
+ `${dashboardUrl1}#/nc/${viewType}/${activeView.value.uuid}${surveyMode.value ? '/survey' : ''}${
+ isPreFillUrl && formPreFill.value.preFillEnabled && viewStore.preFillFormSearchParams
+ ? `?${viewStore.preFillFormSearchParams}`
+ : ''
+ }`,
+ )
}
const toggleViewShare = async () => {
@@ -270,7 +296,6 @@ async function updateSharedView() {
async function savePreFilledMode() {
await updateSharedView()
- $e(`a:view:share:${preFilledMode.value}-prefilled-mode`)
}
@@ -361,29 +386,74 @@ async function savePreFilledMode() {
v-if="activeView?.type === ViewTypes.FORM"
class="nc-pre-filled-mode-wrapper flex flex-col justify-between gap-y-3 mt-1 py-2 px-3 bg-gray-50 rounded-md"
>
-
+
{{ $t('activity.preFilledFields.title') }}
+
{
+ formPreFill = {
+ ...formPreFill,
+ preFillEnabled: value,
+ }
+ }
+ "
+ >
+
+
+
+
{
+ formPreFill = {
+ ...formPreFill,
+ preFilledMode: value || '',
+ }
+ }
+ "
>
-
-
-
{{ $t(`activity.preFilledFields.${mode}`) }}
-
-
-
+
+
+
+
{{ $t(`activity.preFilledFields.${mode}`) }}
+
+
+
+
+
+
+ {{ $t('tooltip.fillTheFormFieldFirst') }}
+
+
+
+
diff --git a/packages/nc-gui/components/smartsheet/Form.vue b/packages/nc-gui/components/smartsheet/Form.vue
index 019306f309..705a787d24 100644
--- a/packages/nc-gui/components/smartsheet/Form.vue
+++ b/packages/nc-gui/components/smartsheet/Form.vue
@@ -43,6 +43,7 @@ import {
useViewColumnsOrThrow,
useViewData,
watch,
+ useViewsStore,
} from '#imports'
import type { ImageCropperConfig } from '~/lib'
@@ -104,6 +105,8 @@ const isPublic = inject(IsPublicInj, ref(false))
const { loadFormView, insertRow, formColumnData, formViewData, updateFormView } = useViewData(meta, view)
+const { preFillFormSearchParams } = storeToRefs(useViewsStore())
+
const reloadEventHook = inject(ReloadViewDataHookInj, createEventHook())
reloadEventHook.on(async () => {
@@ -199,6 +202,22 @@ const updateView = useDebounceFn(
{ maxWait: 2000 },
)
+const updatePreFillFormSearchParams = useDebounceFn(() => {
+ if (isLocked.value || !isUIAllowed('dataInsert')) return
+
+ const preFilledData = { ...formState, ...state.value }
+
+ const searchParams = new URLSearchParams()
+
+ for (const c of visibleColumns.value) {
+ if (c.title && preFilledData[c.title] && !isVirtualCol(c) && !(UITypes.Attachment === c.uidt)) {
+ searchParams.append(c.title, preFilledData[c.title])
+ }
+ }
+
+ preFillFormSearchParams.value = searchParams.toString()
+}, 250)
+
async function submitForm() {
if (isLocked.value || !isUIAllowed('dataInsert')) return
@@ -220,38 +239,6 @@ async function submitForm() {
submitted.value = true
}
-async function getPreFilledLink() {
- if (isLocked.value || !isUIAllowed('dataInsert') || !view.value?.uuid) return
-
- const preFilledData = { ...formState, ...state.value }
-
- const searchParams = new URLSearchParams()
-
- for (const c of visibleColumns.value) {
- if (c.title && preFilledData[c.title] && !isVirtualCol(c)) {
- searchParams.append(c.title, preFilledData[c.title])
- }
- }
-
- // get base url for workspace
- const baseUrl = getBaseUrl(workspaceStore.activeWorkspaceId)
-
- let dashboardUrl1 = dashboardUrl.value
-
- if (baseUrl) {
- dashboardUrl1 = `${baseUrl}${appInfo.value?.dashboardPath}`
- }
-
- copy(
- encodeURI(
- `${dashboardUrl1}#/nc/form/${view.value?.uuid}${parseProp(view.value?.meta).surveyMode ? '/survey' : ''}${
- searchParams.toString() ? `?${searchParams.toString()}` : ''
- }`,
- ),
- )
-
- message.info(t('msg.info.copiedToClipboard'))
-}
async function clearForm() {
if (isLocked.value || !isUIAllowed('dataInsert')) return
@@ -639,6 +626,10 @@ watch([focusLabel, activeRow], () => {
}
})
+watch([formState, state], () => {
+ updatePreFillFormSearchParams()
+})
+
useEventListener(
formRef,
'focusout',
@@ -1332,21 +1323,6 @@ useEventListener(
{{ $t('activity.clearForm') }}
-
- {{ $t('tooltip.formIsNotShared') }}
-
- {{ $t('activity.getPreFilledLink') }}
-
-
{
if (
!c.title ||
diff --git a/packages/nc-gui/lang/en.json b/packages/nc-gui/lang/en.json
index 47736cda95..062905a936 100644
--- a/packages/nc-gui/lang/en.json
+++ b/packages/nc-gui/lang/en.json
@@ -928,9 +928,7 @@
"addFieldFromFormView": "Add Field",
"selectAllFields": "Select all fields",
"preFilledFields": {
- "title": "Pre-filled Fields",
- "default": "Allow pre-filling fields",
- "disabled": "Disable pre-filling fields",
+ "title": "Enable Pre-fill",
"locked": "Lock pre-filled fields as read-only",
"hidden": "Hide pre-filled fields",
"lockedFieldTooltip": "Pre-filled value"
@@ -966,7 +964,7 @@
"clientKey": "Select .key file",
"clientCert": "Select .cert file",
"clientCA": "Select CA file",
- "formIsNotShared": "Form is not shared"
+ "fillTheFormFieldFirst": "Fill the form fields first"
},
"placeholder": {
"selectSlackChannels": "Select Slack channels",
diff --git a/packages/nc-gui/lib/enums.ts b/packages/nc-gui/lib/enums.ts
index 5001d068c9..abcd362f0f 100644
--- a/packages/nc-gui/lib/enums.ts
+++ b/packages/nc-gui/lib/enums.ts
@@ -138,8 +138,7 @@ export enum ImportSource {
}
export enum PreFilledMode {
- Default = 'default',
- Disabled = 'disabled',
+ Default = '',
Locked = 'locked',
Hidden = 'hidden',
}
diff --git a/packages/nc-gui/lib/types.ts b/packages/nc-gui/lib/types.ts
index cd61b37e47..24c1d997f5 100644
--- a/packages/nc-gui/lib/types.ts
+++ b/packages/nc-gui/lib/types.ts
@@ -115,6 +115,7 @@ interface SharedViewMeta extends Record {
theme?: Partial
allowCSVDownload?: boolean
rtl?: boolean
+ preFillEnabled?: boolean
preFilledMode?: PreFilledMode
}
diff --git a/packages/nc-gui/store/views.ts b/packages/nc-gui/store/views.ts
index f32ca96271..48f24a6555 100644
--- a/packages/nc-gui/store/views.ts
+++ b/packages/nc-gui/store/views.ts
@@ -116,6 +116,8 @@ export const useViewsStore = defineStore('viewsStore', () => {
// Used for Grid View Pagination
const isPaginationLoading = ref(true)
+ const preFillFormSearchParams = ref('')
+
const loadViews = async ({
tableId,
ignoreLoading,
@@ -282,6 +284,8 @@ export const useViewsStore = defineStore('viewsStore', () => {
if (!view) return
if (!view.base_id) return
+ preFillFormSearchParams.value = ''
+
const tableName = tablesStore.baseTables.get(view.base_id)?.find((t) => t.id === view.fk_model_id)?.title
const baseName = bases.basesList.find((p) => p.id === view.base_id)?.title
@@ -322,6 +326,7 @@ export const useViewsStore = defineStore('viewsStore', () => {
activeSorts,
activeNestedFilters,
isActiveViewLocked,
+ preFillFormSearchParams,
}
})