SubForm kısmını isRefresh yeteneği getirildi.

This commit is contained in:
Sedat Öztürk 2025-10-12 22:50:01 +03:00
parent 8c0863b11c
commit abb85cf097
11 changed files with 36 additions and 318 deletions

View file

@ -5,6 +5,7 @@ public class SubFormDto
public string TabTitle { get; set; } public string TabTitle { get; set; }
public string TabType { get; set; } public string TabType { get; set; }
public string Code { get; set; } public string Code { get; set; }
public bool IsRefresh { get; set; }
public SubFormRelationDto[] Relation { get; set; } public SubFormRelationDto[] Relation { get; set; }
} }

View file

@ -6007,6 +6007,12 @@
"en": "List Form Code", "en": "List Form Code",
"tr": "List Form Code" "tr": "List Form Code"
}, },
{
"resourceName": "Platform",
"key": "ListForms.ListFormEdit.SubFormsIsRefresh",
"en": "Is Refresh",
"tr": "Yenilensin mi?"
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "ListForms.ListFormEdit.SubFormsRelation", "key": "ListForms.ListFormEdit.SubFormsRelation",
@ -12658,13 +12664,6 @@
"routeType": "protected", "routeType": "protected",
"authority": [] "authority": []
}, },
{
"key": "admin.pivot",
"path": "/admin/pivot/:listFormCode",
"componentPath": "@/views/list/ListPivot",
"routeType": "protected",
"authority": []
},
{ {
"key": "admin.developerkit", "key": "admin.developerkit",
"path": "/admin/developerkit", "path": "/admin/developerkit",

View file

@ -8,6 +8,7 @@ public class SubForm : ValueObject
public string TabTitle { get; set; } public string TabTitle { get; set; }
public string TabType { get; set; } public string TabType { get; set; }
public string Code { get; set; } public string Code { get; set; }
public bool IsRefresh { get; set; }
public SubFormRelation[] Relation { get; set; } public SubFormRelation[] Relation { get; set; }
protected override IEnumerable<object> GetAtomicValues() protected override IEnumerable<object> GetAtomicValues()
@ -15,6 +16,7 @@ public class SubForm : ValueObject
yield return TabTitle; yield return TabTitle;
yield return TabType; yield return TabType;
yield return Code; yield return Code;
yield return IsRefresh;
yield return Relation; yield return Relation;
} }
} }

View file

@ -46,7 +46,6 @@ export interface ListFormJsonRowDto {
itemSubForm?: SubFormDto itemSubForm?: SubFormDto
itemWidget?: WidgetEditDto itemWidget?: WidgetEditDto
itemExtraFilter?: ExtraFilterEditDto itemExtraFilter?: ExtraFilterEditDto
itemChartAnnotation?: ChartAnnotationDto itemChartAnnotation?: ChartAnnotationDto
itemChartPanes?: ChartPanesDto itemChartPanes?: ChartPanesDto
itemChartSeries?: ChartSeriesDto itemChartSeries?: ChartSeriesDto

View file

@ -673,6 +673,7 @@ export interface SubFormDto {
tabTitle: string tabTitle: string
tabType: SubFormTabTypeEnum tabType: SubFormTabTypeEnum
code: string code: string
isRefresh: boolean
relation: SubFormRelationDto[] relation: SubFormRelationDto[]
tabMode: RowMode tabMode: RowMode

View file

@ -57,6 +57,7 @@ function FormTabSubForm() {
<Th>{translate('::ListForms.ListFormEdit.SubFormsTabTitle')}</Th> <Th>{translate('::ListForms.ListFormEdit.SubFormsTabTitle')}</Th>
<Th>{translate('::ListForms.ListFormEdit.SubFormsTabType')}</Th> <Th>{translate('::ListForms.ListFormEdit.SubFormsTabType')}</Th>
<Th>{translate('::ListForms.ListFormEdit.SubFormsCode')}</Th> <Th>{translate('::ListForms.ListFormEdit.SubFormsCode')}</Th>
<Th>{translate('::ListForms.ListFormEdit.SubFormsIsRefresh')}</Th>
<Th>{translate('::ListForms.ListFormEdit.SubFormsRelation')}</Th> <Th>{translate('::ListForms.ListFormEdit.SubFormsRelation')}</Th>
</Tr> </Tr>
</THead> </THead>
@ -105,6 +106,7 @@ function FormTabSubForm() {
<Td>{row.tabTitle}</Td> <Td>{row.tabTitle}</Td>
<Td>{row.tabType}</Td> <Td>{row.tabType}</Td>
<Td>{row.code}</Td> <Td>{row.code}</Td>
<Td>{row.isRefresh ? 'Evet' : 'Hayır'}</Td>
<Td> <Td>
<ul className="list-disc"> <ul className="list-disc">
{row.relation?.map((i) => ( {row.relation?.map((i) => (

View file

@ -1,5 +1,6 @@
import { import {
Button, Button,
Checkbox,
Dialog, Dialog,
FormContainer, FormContainer,
FormItem, FormItem,
@ -15,7 +16,7 @@ import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, FieldArray, FieldProps, Form, Formik } from 'formik' import { Field, FieldArray, FieldProps, Form, Formik } from 'formik'
import { Dispatch, SetStateAction } from 'react' import { Dispatch, SetStateAction } from 'react'
import { FaCalendarPlus, FaCalendarMinus } from 'react-icons/fa' import { FaCalendarPlus, FaCalendarMinus } from 'react-icons/fa'
import { object, string } from 'yup' import { boolean, object, string } from 'yup'
import { tabTypeOptions } from '../options' import { tabTypeOptions } from '../options'
import { JsonRowDialogData } from './types' import { JsonRowDialogData } from './types'
import { import {
@ -30,6 +31,7 @@ const schema = object().shape({
tabTitle: string().required('Tab Title Required'), tabTitle: string().required('Tab Title Required'),
tabType: string().required('Tab Type Required'), tabType: string().required('Tab Type Required'),
code: string().required('Code Required'), code: string().required('Code Required'),
isRefresh: boolean(),
}) })
function JsonRowOpDialogSubForm({ function JsonRowOpDialogSubForm({
@ -82,6 +84,7 @@ function JsonRowOpDialogSubForm({
tabTitle: '', tabTitle: '',
tabType: 'List', tabType: 'List',
code: '', code: '',
isRefresh: false,
relation: [], relation: [],
} }
} }
@ -174,6 +177,17 @@ function JsonRowOpDialogSubForm({
/> />
</FormItem> </FormItem>
<FormItem
label="isRefresh"
invalid={errors.isRefresh && touched.isRefresh}
errorMessage={errors.isRefresh}
>
<Field
name="isRefresh"
component={Checkbox}
/>
</FormItem>
<FormItem label="Relations"> <FormItem label="Relations">
<FieldArray <FieldArray
name="relation" name="relation"

View file

@ -11,15 +11,15 @@ import { GridDto, SubFormDto, SubFormTabTypeEnum } from '@/proxy/form/models'
import FormEdit from './FormEdit' import FormEdit from './FormEdit'
import FormNew from './FormNew' import FormNew from './FormNew'
import FormView from './FormView' import FormView from './FormView'
import { getList } from '@/services/form.service'
const SubForms = (props: { const SubForms = (props: {
gridDto: GridDto gridDto: GridDto
formData: any formData: any
level: number level: number
refreshData?: () => Promise<void> refreshData?: () => Promise<void>
refreshGridDto?: () => Promise<void>
}) => { }) => {
const { gridDto, formData, level, refreshData } = props const { gridDto, formData, level, refreshData, refreshGridDto } = props
const { hash } = useLocation() const { hash } = useLocation()
const [currentTab, setCurrentTab] = useState<string>() const [currentTab, setCurrentTab] = useState<string>()
const [subForms, setSubForms] = useState<SubFormDto[]>() const [subForms, setSubForms] = useState<SubFormDto[]>()
@ -103,7 +103,7 @@ const SubForms = (props: {
searchParams={subForm.searchParams} searchParams={subForm.searchParams}
isSubForm={true} isSubForm={true}
level={level + 1} level={level + 1}
refreshData={refreshData} refreshData={subForm.isRefresh ? refreshData : undefined}
/> />
)} )}
{subForm.tabType == SubFormTabTypeEnum.Form && {subForm.tabType == SubFormTabTypeEnum.Form &&
@ -181,10 +181,13 @@ const SubForms = (props: {
))} ))}
{subForm.tabType == SubFormTabTypeEnum.Chart && ( {subForm.tabType == SubFormTabTypeEnum.Chart && (
<Chart <Chart
id={gridDto?.gridOptions.id!}
listFormCode={subForm.code} listFormCode={subForm.code}
isSubForm={true} isSubForm={true}
level={level + 1} level={level + 1}
refreshData={refreshData} refreshData={subForm.isRefresh ? refreshData : undefined}
gridDto={gridDto}
refreshGridDto={refreshGridDto}
/> />
)} )}
</TabContent> </TabContent>

View file

@ -37,7 +37,7 @@ interface ChartProps extends CommonProps, Meta {
level?: number level?: number
refreshData?: () => Promise<void> refreshData?: () => Promise<void>
gridDto?: GridDto gridDto?: GridDto
refreshGridDto: () => Promise<void> refreshGridDto?: () => Promise<void>
} }
const Chart = (props: ChartProps) => { const Chart = (props: ChartProps) => {
@ -291,7 +291,7 @@ const Chart = (props: ChartProps) => {
className="text-sm" className="text-sm"
onClick={async () => { onClick={async () => {
initialized.current = false initialized.current = false
await refreshGridDto() await refreshGridDto?.()
}} }}
title="Refresh Data" title="Refresh Data"
> >

View file

@ -1,278 +0,0 @@
import { Button, FormContainer, Input, Notification, Select, Dialog, toast } from '@/components/ui'
import { Field, FieldArray, Form, Formik, FieldProps } from 'formik'
import { FaMinus, FaPlus } from 'react-icons/fa'
import { SelectBoxOption } from '@/shared/types'
import {
chartSeriesTypeOptions,
columnSummaryTypeListOptions,
} from '../admin/listForm/edit/options'
import { ChartSeriesDto } from '@/proxy/admin/charts/models'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { useStoreState } from '@/store/store'
import { object, array, string } from 'yup'
interface ChartSeriesDialog1 {
open: boolean
onClose: () => void
initialSeries: ChartSeriesDto[]
fieldList: SelectBoxOption[]
onSave: (series: ChartSeriesDto[]) => void
}
const schema = object().shape({
series: array().of(
object().shape({
name: string().required('Name Required'),
argumentField: string().required('Argument Field Required'),
valueField: string().required('Value Field Required'),
summaryType: string().required('Summary Type Required'),
}),
),
})
const ChartSeriesDialog1 = ({
open,
onClose,
initialSeries,
fieldList,
onSave,
}: ChartSeriesDialog1) => {
const { translate } = useLocalization()
// State UserId güncellemesi için
const { userName } = useStoreState((s) => s.auth.user)
const newSeriesValue = () => {
return {
index: -1,
type: 'line',
name: '',
argumentField: '',
valueField: '',
summaryType: 'sum',
axis: '',
barOverlapGroup: '',
barPadding: 0,
barWidth: 0,
color: '',
cornerRadius: 0,
dashStyle: 'solid',
ignoreEmptyPoints: false,
pane: '',
rangeValue1Field: '',
rangeValue2Field: '',
selectionMode: 'none',
showInLegend: true,
visible: true,
width: 2,
label: {
visible: true,
backgroundColor: '#f05b41',
customizeText: '',
format: 'decimal',
font: {
color: '#FFFFFF',
family: '"Segoe UI", "Helvetica Neue", "Trebuchet MS", Verdana, sans-serif',
size: 12,
weight: 400,
},
},
userId: userName ?? '',
}
}
return (
<Dialog isOpen={open} onClose={onClose} width={1200}>
<div className="flex flex-col bg-white p-4 h-[600px]">
<Formik
enableReinitialize
initialValues={{
series: initialSeries && initialSeries.length > 0 ? initialSeries : [newSeriesValue()],
}}
validationSchema={schema}
onSubmit={(values, { setSubmitting }) => {
try {
onSave(values.series)
toast.push(<Notification type="success">{'Chart güncellendi'}</Notification>, {
placement: 'top-end',
})
onClose()
} catch (error: any) {
toast.push(
<Notification type="danger">
Hata
<code>{error}</code>
</Notification>,
{ placement: 'top-end' },
)
} finally {
setSubmitting(false)
}
}}
>
{({ setFieldValue, values, isSubmitting }) => (
<Form className="flex flex-col h-full">
<FormContainer size="sm" className="flex flex-col h-full">
{/* Header */}
<div className="mb-2 pb-2 border-b flex items-center justify-between">
<Button
variant="default"
shape="circle"
type="button"
size="xs"
onClick={() => setFieldValue('series', [...values.series, newSeriesValue()])}
>
<div className="flex items-center gap-1">
<FaPlus /> Seri Ekle
</div>
</Button>
</div>
{/* Kaydırılabilir içerik */}
<div className="flex-1 overflow-y-auto p-1">
<FieldArray name="series">
{({ remove }) => (
<div>
<div className="grid grid-cols-12 gap-2 font-semibold text-xs py-2">
<div className="text-center col-span-1">#</div>
<div className="text-center col-span-2">Type</div>
<div className="text-center col-span-2">Name</div>
<div className="text-center col-span-2">Argument Field</div>
<div className="text-center col-span-2">Value Field</div>
<div className="text-center col-span-2">Summary Type</div>
<div className="text-center col-span-1">#</div>
</div>
{values.series.map((_, index) => (
<div key={index} className="border-b py-1">
<div className="grid grid-cols-12 gap-1 items-center">
<div className="text-center text-xs col-span-1">
{values.series[index].index}
</div>
<div className="text-xs col-span-2">
<Field name={`series[${index}].type`}>
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
options={chartSeriesTypeOptions}
isClearable
value={chartSeriesTypeOptions.find(
(option) => option.value === field.value,
)}
onChange={(option) =>
form.setFieldValue(field.name, option?.value)
}
/>
)}
</Field>
</div>
<div className="text-xs col-span-2">
<Field
size="sm"
name={`series[${index}].name`}
type="text"
component={Input}
className="text-xs px-1 py-0 grid-cols-2"
/>
</div>
<div className="text-xs col-span-2">
<Field type="text" name={`series[${index}].argumentField`}>
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
options={fieldList}
value={fieldList?.find(
(option) => option.value === field.value,
)}
onChange={(option) =>
form.setFieldValue(field.name, option?.value)
}
menuPlacement="auto"
maxMenuHeight={150}
/>
)}
</Field>
</div>
<div className="text-xs col-span-2">
<Field type="text" name={`series[${index}].valueField`}>
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
options={fieldList}
value={fieldList?.find(
(option) => option.value === field.value,
)}
onChange={(option) =>
form.setFieldValue(field.name, option?.value)
}
menuPlacement="auto"
maxMenuHeight={150}
/>
)}
</Field>
</div>
<div className="text-xs col-span-2">
<Field type="text" name={`series[${index}].summaryType`}>
{({ field, form }: FieldProps<SelectBoxOption>) => (
<Select
field={field}
form={form}
isClearable={true}
options={columnSummaryTypeListOptions}
value={columnSummaryTypeListOptions.find(
(option) => option.value === field.value,
)}
onChange={(option) =>
form.setFieldValue(field.name, option?.value)
}
/>
)}
</Field>
</div>
<div className="flex items-center justify-center gap-1 col-span-1">
<Button
shape="circle"
type="button"
size="xs"
icon={<FaMinus />}
className="bg-slate-100 hover:bg-red-100"
onClick={() => remove(index)}
/>
</div>
</div>
</div>
))}
</div>
)}
</FieldArray>
</div>
{/* Footer */}
<div className="flex gap-2 mt-auto pt-2 border-t text-right justify-end">
<Button
variant="solid"
loading={isSubmitting}
type="submit"
className="ml-auto px-4 py-1 text-sm rounded"
>
{isSubmitting ? translate('::SavingWithThreeDot') : translate('::Save')}
</Button>
</div>
</FormContainer>
</Form>
)}
</Formik>
</div>
</Dialog>
)
}
export default ChartSeriesDialog1

View file

@ -1,25 +0,0 @@
import { CommonProps } from '@/@types/common'
import { Meta } from '@/@types/routes'
import Container from '@/components/shared/Container'
import { useParams, useSearchParams } from 'react-router-dom'
import Pivot from './Pivot'
export interface FormProps extends CommonProps, Meta {
listFormCode?: string
}
const ListPivot = (props?: FormProps) => {
const params = useParams()
const _listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
const [searchParams] = useSearchParams()
return _listFormCode ? (
<Container>
<Pivot listFormCode={_listFormCode} searchParams={searchParams} isSubForm={false}></Pivot>
</Container>
) : (
<></>
)
}
export default ListPivot