2025-08-21 12:26:25 +00:00
|
|
|
|
import { Container, Loading } from '@/components/shared'
|
2025-05-06 06:45:49 +00:00
|
|
|
|
import { useLocalization } from '@/utils/hooks/useLocalization'
|
|
|
|
|
|
import { DataType } from 'devextreme/common'
|
|
|
|
|
|
import { SimpleItem } from 'devextreme/ui/form'
|
|
|
|
|
|
import { useEffect, useState } from 'react'
|
|
|
|
|
|
import { Helmet } from 'react-helmet'
|
|
|
|
|
|
import { useParams, useSearchParams } from 'react-router-dom'
|
|
|
|
|
|
import FormButtons from './FormButtons'
|
|
|
|
|
|
import FormDevExpress from './FormDevExpress'
|
|
|
|
|
|
import { FormProps } from './types'
|
|
|
|
|
|
import { useGridData } from './useGridData'
|
2025-09-23 10:30:57 +00:00
|
|
|
|
import { useCurrentMenuIcon } from '@/utils/hooks/useCurrentMenuIcon'
|
|
|
|
|
|
import { Badge } from '@/components/ui'
|
2025-05-06 06:45:49 +00:00
|
|
|
|
|
|
|
|
|
|
const FormNew = (
|
|
|
|
|
|
props: FormProps = {
|
|
|
|
|
|
isSubForm: false,
|
|
|
|
|
|
},
|
|
|
|
|
|
) => {
|
|
|
|
|
|
const mode = 'new'
|
|
|
|
|
|
const { isSubForm, level, sParams } = props
|
|
|
|
|
|
const params = useParams()
|
|
|
|
|
|
const listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
|
|
|
|
|
|
const [searchParams] = useSearchParams()
|
|
|
|
|
|
const { translate } = useLocalization()
|
2025-09-23 10:30:57 +00:00
|
|
|
|
const MenuIcon = useCurrentMenuIcon('w-5 h-5')
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
const {
|
|
|
|
|
|
setFormData,
|
|
|
|
|
|
loading,
|
|
|
|
|
|
handleSubmit,
|
|
|
|
|
|
gridDto,
|
|
|
|
|
|
dataSource,
|
|
|
|
|
|
commandColumnData,
|
|
|
|
|
|
formData,
|
|
|
|
|
|
formItems,
|
|
|
|
|
|
refForm,
|
|
|
|
|
|
permissionResults,
|
|
|
|
|
|
} = useGridData({
|
|
|
|
|
|
mode,
|
|
|
|
|
|
listFormCode,
|
|
|
|
|
|
level,
|
|
|
|
|
|
isSubForm,
|
|
|
|
|
|
onSubmitAction: props?.onActionView,
|
|
|
|
|
|
})
|
|
|
|
|
|
const [newParams, setNewParams] = useState<URLSearchParams>(new URLSearchParams())
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setNewParams(
|
|
|
|
|
|
new URLSearchParams({
|
|
|
|
|
|
...Object.fromEntries(searchParams),
|
|
|
|
|
|
...Object.fromEntries(sParams ?? []),
|
|
|
|
|
|
}),
|
|
|
|
|
|
)
|
|
|
|
|
|
}, [searchParams, sParams])
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (!formItems) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setFormData(createInitialFormData())
|
|
|
|
|
|
}, [formItems, newParams])
|
|
|
|
|
|
|
|
|
|
|
|
function createInitialFormData() {
|
|
|
|
|
|
const data: any = {}
|
|
|
|
|
|
if (!formItems?.length) {
|
|
|
|
|
|
return data
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Default tüm alanlar undefined olsun
|
|
|
|
|
|
for (const formGroupItem of formItems) {
|
|
|
|
|
|
if (formGroupItem.items) {
|
|
|
|
|
|
//SimpleItem
|
|
|
|
|
|
for (const formItem of formGroupItem.items) {
|
|
|
|
|
|
const f = formItem as SimpleItem
|
|
|
|
|
|
data[f.dataField!] = undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!gridDto?.columnFormats) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
for (const colFormat of gridDto?.columnFormats) {
|
|
|
|
|
|
if (!colFormat.fieldName) {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Grid'den gelen columnFormat'ları kullanarak default değerleri set et
|
|
|
|
|
|
if (colFormat.defaultValue != null) {
|
|
|
|
|
|
data[colFormat.fieldName] = colFormat.defaultValue
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// URL'den veya Component Prop'dan gelen parametreleri set et
|
|
|
|
|
|
if (newParams.has(colFormat.fieldName)) {
|
|
|
|
|
|
const dType = colFormat.dataType as DataType
|
|
|
|
|
|
switch (dType) {
|
|
|
|
|
|
case 'date':
|
|
|
|
|
|
case 'datetime':
|
|
|
|
|
|
data[colFormat.fieldName] = new Date(newParams.get(colFormat.fieldName)!)
|
|
|
|
|
|
break
|
|
|
|
|
|
case 'number':
|
|
|
|
|
|
data[colFormat.fieldName] = Number(newParams.get(colFormat.fieldName))
|
|
|
|
|
|
break
|
|
|
|
|
|
case 'boolean':
|
|
|
|
|
|
if (newParams.get(colFormat.fieldName) === 'true') {
|
|
|
|
|
|
data[colFormat.fieldName] = true
|
|
|
|
|
|
} else if (newParams.get(colFormat.fieldName) === 'false') {
|
|
|
|
|
|
data[colFormat.fieldName] = false
|
|
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
case 'object':
|
|
|
|
|
|
try {
|
|
|
|
|
|
data[colFormat.fieldName] = JSON.parse(newParams.get(colFormat.fieldName) as string)
|
|
|
|
|
|
} catch (error) {}
|
|
|
|
|
|
break
|
|
|
|
|
|
default:
|
|
|
|
|
|
data[colFormat.fieldName] = newParams.get(colFormat.fieldName)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Eğer default value varsa, bu editörü readonly yapıyoruz
|
|
|
|
|
|
formItems.forEach((form) => {
|
|
|
|
|
|
form?.items?.forEach((item: SimpleItem) => {
|
|
|
|
|
|
if (item.dataField === colFormat.fieldName) {
|
|
|
|
|
|
item.editorOptions = { ...item.editorOptions, readOnly: true }
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!listFormCode) {
|
|
|
|
|
|
return <></>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (loading) {
|
|
|
|
|
|
return <Loading type="cover" loading={loading}></Loading>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!formData) {
|
|
|
|
|
|
return <>{translate('::Error:0002')}</>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
2025-08-21 12:26:25 +00:00
|
|
|
|
<Container>
|
2025-05-06 06:45:49 +00:00
|
|
|
|
{!isSubForm && (
|
|
|
|
|
|
<Helmet
|
2025-09-13 11:46:34 +00:00
|
|
|
|
titleTemplate="%s | Sözsoft Kurs Platform"
|
2025-05-06 06:45:49 +00:00
|
|
|
|
title={translate('::' + gridDto?.gridOptions.title)}
|
2025-09-13 11:46:34 +00:00
|
|
|
|
defaultTitle="Sözsoft Kurs Platform"
|
2025-05-06 06:45:49 +00:00
|
|
|
|
></Helmet>
|
|
|
|
|
|
)}
|
2025-09-23 09:26:20 +00:00
|
|
|
|
<div
|
|
|
|
|
|
className={`flex items-center pb-2 px-2 ${isSubForm ? 'justify-end' : 'justify-between'}`}
|
|
|
|
|
|
>
|
2025-09-23 10:30:57 +00:00
|
|
|
|
<div className="flex items-center gap-2">
|
|
|
|
|
|
{MenuIcon}
|
|
|
|
|
|
{!isSubForm && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<h4 className="text-slate-700 text-sm font-medium leading-none">
|
|
|
|
|
|
{translate('::' + gridDto?.gridOptions?.title)}
|
|
|
|
|
|
</h4>
|
|
|
|
|
|
<Badge content={mode} />
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
2025-05-06 06:45:49 +00:00
|
|
|
|
{permissionResults && (
|
|
|
|
|
|
<FormButtons
|
2025-09-21 14:42:24 +00:00
|
|
|
|
isSubForm={isSubForm}
|
2025-05-06 06:45:49 +00:00
|
|
|
|
mode={mode}
|
|
|
|
|
|
listFormCode={listFormCode}
|
|
|
|
|
|
id={formData?.Id}
|
|
|
|
|
|
gridDto={gridDto!}
|
|
|
|
|
|
commandColumnData={commandColumnData!}
|
|
|
|
|
|
dataSource={dataSource!}
|
|
|
|
|
|
permissions={permissionResults}
|
|
|
|
|
|
handleSubmit={handleSubmit}
|
|
|
|
|
|
refreshData={() => {}}
|
|
|
|
|
|
getSelectedRowKeys={() => []}
|
|
|
|
|
|
getSelectedRowsData={() => [formData]}
|
|
|
|
|
|
getFilter={() => []}
|
|
|
|
|
|
onActionView={props?.onActionView}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
2025-09-23 09:26:20 +00:00
|
|
|
|
<div className="px-2">
|
|
|
|
|
|
<FormDevExpress
|
|
|
|
|
|
mode={mode}
|
|
|
|
|
|
refForm={refForm}
|
|
|
|
|
|
formData={formData}
|
|
|
|
|
|
formItems={formItems}
|
|
|
|
|
|
setFormData={setFormData}
|
|
|
|
|
|
listFormCode={listFormCode}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
2025-08-21 12:26:25 +00:00
|
|
|
|
</Container>
|
2025-05-06 06:45:49 +00:00
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default FormNew
|