fix: render more fieldtypes and show all field in modal

This commit is contained in:
Shariq Ansari 2024-12-23 19:25:40 +05:30
parent 7b86773b73
commit 3b29f377e1
3 changed files with 121 additions and 27 deletions

View File

@ -119,7 +119,7 @@ function parseTabs(_tabs) {
if (field.type === 'Table') { if (field.type === 'Table') {
let name = props.meta[field.name].df.fieldname let name = props.meta[field.name].df.fieldname
let fields = props.meta[field.name].fields let fields = props.meta[field.name].fields
field.fields = fields.map((field) => { let _fields = fields.map((field) => {
return { return {
...getFieldObj(field), ...getFieldObj(field),
onChange: (value, index) => { onChange: (value, index) => {
@ -127,7 +127,14 @@ function parseTabs(_tabs) {
}, },
} }
}) })
field.gridFields = field.fields.filter((field) => field.in_list_view)
field.fields = [
{
no_tabs: true,
sections: [{ columns: 3, hideLabel: true, fields: _fields }],
},
]
field.gridFields = _fields.filter((field) => field.in_list_view)
} }
}) })
}) })
@ -137,10 +144,18 @@ function parseTabs(_tabs) {
} }
function getFieldObj(field) { function getFieldObj(field) {
if (field.fieldtype === 'Select' && typeof field.options === 'string') {
field.options = field.options.split('\n').map((option) => {
return {
label: option,
value: option,
}
})
}
return { return {
label: field.label, label: field.label,
fieldname: field.fieldname, name: field.fieldname,
fieldtype: field.fieldtype, type: field.fieldtype,
options: field.options, options: field.options,
in_list_view: field.in_list_view, in_list_view: field.in_list_view,
} }

View File

@ -21,7 +21,7 @@
<div <div
class="inline-flex items-center border-r p-2" class="inline-flex items-center border-r p-2"
v-for="field in gridFields" v-for="field in gridFields"
:key="field.fieldname" :key="field.name"
> >
{{ field.label }} {{ field.label }}
</div> </div>
@ -52,26 +52,26 @@
<div <div
class="border-r border-gray-100 h-full" class="border-r border-gray-100 h-full"
v-for="field in gridFields" v-for="field in gridFields"
:key="field.fieldname" :key="field.name"
> >
<Link <Link
v-if="field.fieldtype === 'Link'" v-if="field.type === 'Link'"
class="text-sm text-gray-800" class="text-sm text-gray-800"
:value="row[field.fieldname]" :value="row[field.name]"
:doctype="field.options" :doctype="field.options"
:placeholder="row.placeholder" :filters="field.filters"
@change=" @change="
(data: String) => (data: String) =>
field.onChange && field.onChange(data, index) field.onChange && field.onChange(data, index)
" "
/> />
<div <div
v-else-if="field.fieldtype === 'Check'" v-else-if="field.type === 'Check'"
class="flex h-full justify-center items-center" class="flex h-full justify-center items-center"
> >
<Checkbox <Checkbox
class="cursor-pointer duration-300" class="cursor-pointer duration-300"
v-model="row[field.fieldname]" v-model="row[field.name]"
@change=" @change="
(e: Event) => (e: Event) =>
field.onChange && field.onChange &&
@ -82,14 +82,85 @@
" "
/> />
</div> </div>
<DatePicker
v-else-if="field.type === 'Date'"
:value="row[field.name]"
icon-left=""
variant="outline"
:formatter="(date) => getFormat(date, '', true)"
input-class="border-none text-sm text-gray-800"
@change="
(data: String) =>
field.onChange && field.onChange(data, index)
"
/>
<DateTimePicker
v-else-if="field.type === 'Datetime'"
:value="row[field.name]"
icon-left=""
variant="outline"
:formatter="(date) => getFormat(date, '', true, true)"
input-class="border-none text-sm text-gray-800"
@change="
(data: String) =>
field.onChange && field.onChange(data, index)
"
/>
<FormControl
v-else-if="
['Small Text', 'Text', 'Long Text', 'Code'].includes(
field.type,
)
"
type="textarea"
v-model="row[field.name]"
variant="outline"
@change="
(e: Event) =>
field.onChange &&
field.onChange(
(e.target as HTMLInputElement).value,
index,
)
"
/>
<FormControl
v-else-if="['Int'].includes(field.type)"
type="number"
v-model="row[field.name]"
variant="outline"
@change="
(e: Event) =>
field.onChange &&
field.onChange(
(e.target as HTMLInputElement).value,
index,
)
"
/>
<FormControl
v-else-if="field.type === 'Select'"
class="text-sm text-gray-800"
v-model="row[field.name]"
type="select"
:options="field.options"
variant="outline"
@change="
(e: Event) =>
field.onChange &&
field.onChange(
(e.target as HTMLInputElement).value,
index,
)
"
/>
<FormControl <FormControl
v-else v-else
class="text-sm text-gray-800" class="text-sm text-gray-800"
v-model="row[field.fieldname]" v-model="row[field.name]"
:type="field.fieldtype.toLowerCase()" type="text"
:options="field.options" :options="field.options"
variant="outline" variant="outline"
size="md"
@change=" @change="
(e: Event) => (e: Event) =>
field.onChange && field.onChange &&
@ -113,12 +184,13 @@
</div> </div>
<Dialog <Dialog
v-model="showRowList[index]" v-model="showRowList[index]"
:options="{ title: `Editing Row ${index + 1}` }" :options="{
title: __('Editing Row {0}', [index + 1]),
size: '4xl',
}"
> >
<template #body-content> <template #body-content>
<div v-for="field in fields" :key="field.fieldname"> <FieldLayout :tabs="fields" :data="row" />
{{ field.label }}: {{ row[field.fieldname] }}
</div>
</template> </template>
</Dialog> </Dialog>
</div> </div>
@ -130,28 +202,35 @@
v-else v-else
class="flex flex-col items-center rounded p-5 text-sm text-gray-600" class="flex flex-col items-center rounded p-5 text-sm text-gray-600"
> >
No Data __("No Data")
</div> </div>
</div> </div>
<div class="mt-2 flex flex-row gap-2"> <div class="mt-2 flex flex-row gap-2">
<Button <Button
v-if="showDeleteBtn" v-if="showDeleteBtn"
label="Delete" :label="__('Delete')"
variant="solid" variant="solid"
theme="red" theme="red"
@click="deleteRows" @click="deleteRows"
/> />
<Button label="Add Row" @click="addRow" /> <Button :label="__('Add Row')" @click="addRow" />
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import FieldLayout from '@/components/FieldLayout.vue'
import Link from '@/components/Controls/Link.vue' import Link from '@/components/Controls/Link.vue'
import { GridColumn, GridRow } from '@/types/controls' import { GridColumn, GridRow } from '@/types/controls'
import { getRandom } from '@/utils' import { getRandom, getFormat } from '@/utils'
import { Dialog, FormControl, Checkbox } from 'frappe-ui' import {
Dialog,
FormControl,
Checkbox,
DateTimePicker,
DatePicker,
} from 'frappe-ui'
import Draggable from 'vuedraggable' import Draggable from 'vuedraggable'
import { ref, reactive, computed, PropType } from 'vue' import { ref, reactive, computed, PropType } from 'vue'
@ -206,8 +285,8 @@ const toggleSelectRow = (row: GridRow) => {
const addRow = () => { const addRow = () => {
const newRow = {} as GridRow const newRow = {} as GridRow
props.gridFields.forEach((field) => { props.gridFields.forEach((field) => {
if (field.fieldtype === 'Check') newRow[field.fieldname] = false if (field.type === 'Check') newRow[field.name] = false
else newRow[field.fieldname] = '' else newRow[field.name] = ''
}) })
newRow.name = getRandom(10) newRow.name = getRandom(10)
showRowList.value.push(false) showRowList.value.push(false)

View File

@ -15,7 +15,7 @@
!hasTabs ? 'hidden' : modal ? 'border-outline-gray-modals' : '' !hasTabs ? 'hidden' : modal ? 'border-outline-gray-modals' : ''
" "
> >
<div :class="{ 'my-4 sm:my-6': hasTabs }"> <div class="overflow-hidden" :class="{ 'my-4 sm:my-6': hasTabs }">
<div <div
v-for="(section, i) in tab.sections" v-for="(section, i) in tab.sections"
:key="section.label" :key="section.label"
@ -184,7 +184,7 @@
/> />
<FormControl <FormControl
v-else-if=" v-else-if="
['Small Text', 'Text', 'Long Text'].includes(field.type) ['Small Text', 'Text', 'Long Text', 'Code'].includes(field.type)
" "
type="textarea" type="textarea"
:placeholder="getPlaceholder(field)" :placeholder="getPlaceholder(field)"