fix: render more fieldtypes and show all field in modal
This commit is contained in:
parent
7b86773b73
commit
3b29f377e1
@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user