erp-platform/ui/src/views/form/FormDevExpress.tsx

155 lines
5.9 KiB
TypeScript
Raw Normal View History

2025-05-06 06:45:49 +00:00
import { DX_CLASSNAMES } from '@/constants/app.constant'
import {
Form as FormDx,
GroupItem as GroupItemDx,
Label as LabelDx,
SimpleItem as SimpleItemDx,
} from 'devextreme-react/form'
import { FieldDataChangedEvent, GroupItem } from 'devextreme/ui/form'
import { Dispatch, RefObject, useEffect, useRef } from 'react'
2025-05-06 06:45:49 +00:00
import { GridBoxEditorComponent } from './editors/GridBoxEditorComponent'
import { TagBoxEditorComponent } from './editors/TagBoxEditorComponent'
import { RowMode, SimpleItemWithColData } from './types'
import { PlatformEditorTypes } from '@/proxy/form/models'
2025-09-29 07:08:24 +00:00
import dxSelectBox from 'devextreme/ui/select_box'
2025-05-06 06:45:49 +00:00
const FormDevExpress = (props: {
2025-09-21 20:05:13 +00:00
listFormCode: string
isSubForm?: boolean
2025-05-06 06:45:49 +00:00
mode: RowMode
refForm: RefObject<FormDx>
formData: any
formItems: GroupItem[]
setFormData: Dispatch<any>
}) => {
2025-09-21 20:05:13 +00:00
const { listFormCode, isSubForm, mode, refForm, formData, formItems, setFormData } = props
2025-05-06 06:45:49 +00:00
const formDataRef = useRef(formData)
useEffect(() => {
formDataRef.current = formData
}, [formData])
2025-05-06 06:45:49 +00:00
return (
2025-09-23 19:52:08 +00:00
<form className={`${DX_CLASSNAMES} ${!isSubForm ? 'px-2' : ''} pb-2`}>
2025-05-06 06:45:49 +00:00
<FormDx
ref={refForm}
formData={formData}
onFieldDataChanged={async (e: FieldDataChangedEvent) => {
2025-05-06 06:45:49 +00:00
setFormData({ ...formData, [e.dataField!]: e.value })
//Dinamik script
const changeItem = formItems
.flatMap((group) => (group.items as SimpleItemWithColData[]) || [])
.find((i: SimpleItemWithColData) => i.dataField === e.dataField)
if (changeItem?.script) {
try {
//setFormData({...formData, Path: e.value});
//UiEvalService.ApiGenerateBackgroundWorkers();
//setFormData({ ...formData, Path: (v => v === '1' ? '1-deneme' : v === '0' ? '0-deneme' : '')(e.value) })
eval(changeItem.script)
} catch (err) {
console.error('Script execution failed for', changeItem.name, err)
}
}
2025-05-06 06:45:49 +00:00
}}
2025-09-19 14:06:48 +00:00
onContentReady={(e) => {
const groupItems = e.component.option('items') as any[]
const firstItem = groupItems?.[0]?.items?.[0]
2025-09-19 14:06:48 +00:00
if (firstItem?.dataField) {
const editor = e.component.getEditor(firstItem.dataField)
2025-09-29 07:08:24 +00:00
mode !== 'view' && editor?.focus()
2025-09-19 14:06:48 +00:00
}
}}
2025-05-06 06:45:49 +00:00
>
{formItems.map((formGroupItem, i) => {
return (
<GroupItemDx
key={'formGroupItem-' + i}
colCount={formGroupItem.colCount}
colSpan={formGroupItem.colSpan}
caption={formGroupItem.caption}
>
{(formGroupItem.items as SimpleItemWithColData[])?.map((formItem, i) => {
return formItem.editorType2 === PlatformEditorTypes.dxTagBox ? (
<SimpleItemDx
key={'formItem-' + i}
{...formItem}
render={() => (
<TagBoxEditorComponent
value={formData[formItem.dataField!] || []}
setDefaultValue={false}
values={formData}
options={formItem.tagBoxOptions}
col={formItem.colData}
onValueChanged={(e: any) => {
setFormData({ ...formData, [formItem.dataField!]: e })
}}
editorOptions={{
...formItem.editorOptions,
...(mode === 'view' ? { readOnly: true } : {}),
}}
></TagBoxEditorComponent>
)}
>
<LabelDx text={formItem.name} />
</SimpleItemDx>
) : formItem.editorType2 === PlatformEditorTypes.dxGridBox ? (
<SimpleItemDx
key={'formItem-' + i}
{...formItem}
render={() => (
<GridBoxEditorComponent
value={formData[formItem.dataField!] || []}
values={formData}
options={formItem.gridBoxOptions}
col={formItem.colData}
onValueChanged={(e: any) => {
setFormData({ ...formData, [formItem.dataField!]: e })
}}
editorOptions={{
...formItem.editorOptions,
...(mode === 'view' ? { readOnly: true } : {}),
}}
></GridBoxEditorComponent>
)}
>
<LabelDx text={formItem.name} />
</SimpleItemDx>
) : (
<SimpleItemDx
cssClass="font-semibold"
2025-05-06 06:45:49 +00:00
key={'formItem-' + i}
{...formItem}
editorOptions={{
...formItem.editorOptions,
2025-09-19 14:06:48 +00:00
...(mode === 'view' ? { readOnly: true } : { autoFocus: i === 1 }),
buttons: (formItem.editorOptions?.buttons || []).map((btn: any) => {
if (btn?.options?.onClick && typeof btn.options.onClick === 'string') {
const origClick = eval(`(${btn.options.onClick})`)
btn.options.onClick = (e: any) => {
origClick({
...e,
2025-09-29 07:08:24 +00:00
formData: formDataRef.current,
fieldName: formItem.dataField,
2025-09-29 07:08:24 +00:00
mode,
})
}
}
return btn
}),
2025-05-06 06:45:49 +00:00
}}
/>
)
})}
</GroupItemDx>
)
})}
</FormDx>
</form>
)
}
export default FormDevExpress