+
{
- const { listFormCode, filter, isSubForm, level, gridDto } = props
+ // State UserId güncellemesi için
+ const { userName } = useStoreState((s) => s.auth.user)
+ const { id, listFormCode, filter, isSubForm, level, gridDto, refreshGridDto } = props
const { translate } = useLocalization()
const { checkPermission } = usePermission()
const isPwaMode = usePWA()
- const [series, setSeries] = useState([])
const initialized = useRef(false)
const [searchParams] = useSearchParams()
@@ -44,38 +56,45 @@ const Chart = (props: ChartProps) => {
const params = useParams()
const _listFormCode = props?.listFormCode ?? params?.listFormCode ?? ''
+ const [openDialog, setOpenDialog] = useState(false)
+ const [fieldList, setFieldList] = useState([])
+
const [searchText, setSearchText] = useState('')
const [prevValue, setPrevValue] = useState('')
const [urlSearchParams, setUrlSearchParams] = useState(
searchParams ? new URLSearchParams(searchParams) : new URLSearchParams(),
)
- 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 [allSeries, setAllSeries] = useState([])
+
+ const [userSeries, setUserSeries] = useState([])
+ const [oldSeries, setOldSeries] = useState([])
+
+ useEffect(() => {
+ if (gridDto && !initialized.current) {
+ const initialSeries = gridDto.gridOptions.seriesDto.map((s, index) => ({ ...s, index }))
+
+ setAllSeries(initialSeries)
+ setUserSeries(initialSeries.filter((s) => s.userId === userName))
+ setOldSeries(initialSeries.filter((s) => s.userId === userName))
+
+ initialized.current = true
+ }
+ }, [gridDto])
useEffect(() => {
if (!gridDto) return
+ if (!allSeries) return
+ if (!initialized.current) return
+
+ const seriesDto = userSeries.length > 0 ? userSeries : allSeries.length > 0 ? allSeries : []
const gridOptions = {
...gridDto.gridOptions,
- seriesDto: series ?? gridDto.gridOptions.seriesDto,
+ seriesDto,
}
- const dataSource = createSelectDataSource(
- gridOptions,
- listFormCode,
- urlSearchParams,
- [],
- true,
- )
+ const dataSource = createSelectDataSource(gridOptions, listFormCode, urlSearchParams, [], true)
const options = {
dataSource: dataSource,
@@ -106,7 +125,7 @@ const Chart = (props: ChartProps) => {
valueAxis: gridDto.gridOptions.valueAxisDto,
tooltip: gridDto.gridOptions.tooltipDto,
- series: buildSeriesDto(series ?? gridDto.gridOptions.seriesDto),
+ series: buildSeriesDto(seriesDto),
panes: gridDto.gridOptions.panesDto?.length > 0 ? gridDto.gridOptions.panesDto : undefined,
commonSeriesSettings: gridDto.gridOptions.commonSeriesSettingsDto,
@@ -121,7 +140,7 @@ const Chart = (props: ChartProps) => {
}
setChartOptions(options)
- }, [gridDto, series, searchParams, urlSearchParams])
+ }, [gridDto, allSeries, initialized.current, searchParams, urlSearchParams])
const onFilter = useCallback(
(value?: string) => {
@@ -169,50 +188,64 @@ const Chart = (props: ChartProps) => {
[gridDto, urlSearchParams, searchText],
)
- const newSeriesValue = () => {
- return {
- argumentField: '',
- axis: '',
- barOverlapGroup: '',
- barPadding: 0,
- barWidth: 0,
- color: '',
- cornerRadius: 0,
- dashStyle: 'solid',
- ignoreEmptyPoints: false,
- name: '',
- pane: '',
- rangeValue1Field: '',
- rangeValue2Field: '',
- selectionMode: 'none',
- showInLegend: true,
- type: 'line',
- valueField: '',
- 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,
- },
- },
+ const getFields = async () => {
+ if (!props.listFormCode) return
+ try {
+ const resp = await getListFormFields({
+ listFormCode: props.listFormCode,
+ sorting: 'ListOrderNo',
+ maxResultCount: 1000,
+ })
+ if (resp.data?.items) {
+ const fieldNames = groupBy(resp?.data?.items, 'fieldName')
+ setFieldList(Object.keys(fieldNames).map((a) => ({ value: a, label: a })))
+ }
+ } catch (error: any) {
+ toast.push(
+
+ Alanlar getirilemedi {error.toString()}
+ ,
+ { placement: 'top-end' },
+ )
}
}
useEffect(() => {
- if (gridDto && !initialized.current) {
- setSeries(gridDto.gridOptions.seriesDto)
- initialized.current = true
- }
- }, [gridDto])
+ if (props.listFormCode) getFields()
+ }, [props.listFormCode])
- const [openDialog, setOpenDialog] = useState(false)
+ const onSave = async (newSeries: ChartSeriesDto[]) => {
+ // 1. Silinecek serileri bul (oldSeries var ama newSeries yok)
+ const toDelete = oldSeries.filter((old) => !newSeries.some((s) => s.index === old.index))
+
+ // Index kaymasını önlemek için büyükten küçüğe sırala
+ toDelete.sort((a, b) => b.index - a.index)
+
+ for (const old of toDelete) {
+ await deleteListFormJsonRow(id, ListFormEditTabs.ChartSeries.GeneralJsonRow, old.index)
+ }
+
+ // 2. Yeni veya güncellenen serileri kaydet
+ for (const series of newSeries) {
+ const input: ListFormJsonRowDto = {
+ index: series.index,
+ fieldName: ListFormEditTabs.ChartSeries.GeneralJsonRow,
+ itemChartSeries: series,
+ }
+
+ if (series.index === -1) {
+ await postListFormJsonRow(id, input)
+ } else {
+ await putListFormJsonRow(id, input)
+ }
+ }
+
+ // 3. Yeniden yükle
+ if (props.refreshGridDto) {
+ initialized.current = false
+ await props.refreshGridDto()
+ }
+ }
return (
@@ -252,26 +285,24 @@ const Chart = (props: ChartProps) => {
}}
className="p-1 pl-6 pr-2 border border-1 outline-none text-xs text-gray-700 dark:text-gray-200 placeholder-gray-400 rounded"
/>
-
-
@@ -299,109 +330,13 @@ const Chart = (props: ChartProps) => {
-
+
setOpenDialog(false)}
+ initialSeries={allSeries.filter((s) => s.userId === userName)}
+ fieldList={fieldList}
+ onSave={onSave}
+ />
)}
diff --git a/ui/src/views/list/ChartSeriesDialog.tsx b/ui/src/views/list/ChartSeriesDialog.tsx
new file mode 100644
index 00000000..3b3b1f91
--- /dev/null
+++ b/ui/src/views/list/ChartSeriesDialog.tsx
@@ -0,0 +1,279 @@
+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'
+import { SummaryTypeEnum } from '@/proxy/form/models'
+
+interface ChartSeriesDialogProps {
+ 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 ChartSeriesDialog = ({
+ open,
+ onClose,
+ initialSeries,
+ fieldList,
+ onSave,
+}: ChartSeriesDialogProps) => {
+ 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: SummaryTypeEnum.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 (
+