import { Alert, Button, Card, Checkbox, Dialog, FormContainer, FormItem, Input, Notification, Select, Tabs, toast, } from '@/components/ui' import TabContent from '@/components/ui/Tabs/TabContent' import TabList from '@/components/ui/Tabs/TabList' import TabNav from '@/components/ui/Tabs/TabNav' import { getRoles, getUsers } from '@/services/identity.service' import { deleteChartJsonItem, getChartByCode, putChartJsonItem, putCharts, } from '@/services/chart.service' import { SelectBoxOption } from '@/shared/types' import { useStoreState } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' import setNull from '@/utils/setNull' import { Field, FieldArray, FieldProps, Form, Formik, FormikProps, getIn } from 'formik' import { useEffect, useState } from 'react' import { Helmet } from 'react-helmet' import { Link, useParams } from 'react-router-dom' import { object, string } from 'yup' import { chartAnnotationTypeListOptions, chartArgumentAxisPositionListOptions, chartArgumentAxisTypeListOptions, chartBreakStyleLineListOptions, chartSeriesDashStyleOptions, chartSeriesSelectionModeOptions, chartSeriesTypeOptions, chartTitleWordWrapListOptions, } from './options' import { ChartDialogType, ChartOperation } from './types' import { IdentityRoleDto, IdentityUserDto } from '@/proxy/admin/models' import { BreakDto, ChartAnnotationDto, ChartEditDto, ChartPanesDto, ChartSeriesDto, ChartValueAxisDto, } from '@/proxy/charts/models' import { Container } from '@/components/shared' import ChartEditDetailsTab from './edit/ChartTabDetails' import ChartEditDatabaseTab from './edit/ChartTabDatabase' import ChartEditCommonSettingsTab from './edit/ChartTabCommonSettings' import ChartEditPermissionsTab from './edit/ChartTabPermissions' import ChartEditSeriesTab from './edit/ChartTabSeries' import ChartEditAxisTab from './edit/ChartTabAxis' import ChartEditPanesTab from './edit/ChartTabPanes' import ChartEditCrosshairTab from './edit/ChartTabCrosshair' import ChartTabAnimation from './edit/ChartTabAnimation' import ChartEditExportTab from './edit/ChartTabExport' import ChartTabLegend from './edit/ChartTabLegend' import ChartTabAnnotations from './edit/ChartTabAnnotations' import ChartEditZoomAndPanTab from './edit/ChartTabZoomAndPan' import { getDataSources } from '@/proxy/data-source' import { tooltipFormatListOptions } from '@/shared/options' import { FaMinus } from 'react-icons/fa' import { ROUTES_ENUM } from '@/routes/route.constant' const chartPanesValidationSchema = object().shape({ name: string().required(), }) const chartSeriesValidationSchema = object().shape({ name: string().required(), }) const chartAxisValidationSchema = object().shape({ name: string().required(), title: string().required(), }) const chartAnnotationsValidationSchema = object().shape({ name: string().required(), }) const fieldFeedback = (form: FormikProps, name: string) => { const error = getIn(form.errors, name) const touch = getIn(form.touched, name) return { errorMessage: error || '', invalid: typeof touch === 'undefined' ? false : error && touch, } } const chartValidationSchema = object().shape({ cultureName: string().required(), chartCode: string().required(), }) export interface DatabaseOperation { isOpen: ChartDialogType id: string operation: ChartOperation index: number panesValues?: ChartPanesDto seriesValues?: ChartSeriesDto annotationsValues?: ChartAnnotationDto axisValues?: ChartValueAxisDto } const defaultDatabaseOperation: DatabaseOperation = { isOpen: '', id: '', operation: 'select', index: -1, } export interface ConfirmDelete { isOpen: boolean id: string index: number fieldName: ChartDialogType } const defaultConfirmDelete: ConfirmDelete = { isOpen: false, id: '', index: -1, fieldName: 'pane', } function ChartEdit() { const { chartCode } = useParams() const { translate } = useLocalization() const [dataSourceList, setDataSourceList] = useState([]) const languages = useStoreState((state) => state.abpConfig.config?.localization.languages) const permissions: Record | undefined = useStoreState( (state) => state.abpConfig.config?.auth.grantedPolicies, ) const [chartValues, setChartValues] = useState() const [langOptions, setLangOptions] = useState([]) const [roleList, setRoleList] = useState([]) const [userList, setUserList] = useState([]) const [permissionOptions, setPermissionOptions] = useState([]) const [confirmDelete, setConfirmDelete] = useState(defaultConfirmDelete) const [databaseOperationsModalData, setDatabaseOperationsModalData] = useState(defaultDatabaseOperation) const onSubmit = async (editType: string, values: Partial): Promise => { try { await putCharts({ ...chartValues, ...values, // sadece güncellenen tab'ın değerleri override edilir } as ChartEditDto) // chartValues null olamaz çünkü form ancak chartValues yüklendikten sonra render ediliyor toast.push( {`${editType} kaydedildi.`} , { placement: 'top-end' }, ) await getChartValues() } catch (error) { toast.push(Hata: {String(error)}) } } const valueAxisList = () => { return chartValues?.valueAxisDto.map((key: ChartValueAxisDto) => ({ value: key.name, label: key.name, })) } const valuePaneList = () => { return chartValues?.panesDto.map((key: ChartPanesDto) => ({ value: key.name, label: key.name, })) } const SeriesList = () => { return chartValues?.seriesDto.map((key: ChartSeriesDto) => ({ value: key.name, label: key.name, })) } useEffect(() => { if (languages) { setLangOptions( languages.map((lang) => ({ value: lang.cultureName, label: lang.displayName, })), ) } }, [languages]) useEffect(() => { if (permissions) { setPermissionOptions( Object.keys(permissions).map((key) => { return { value: key, label: key, } }), ) } }, [permissions]) const getRoleList = async () => { const response = await getRoles() if (response.data?.items) { setRoleList( response.data.items.map((role: IdentityRoleDto) => ({ value: role.id, label: role.name, })), ) } } const getUserList = async () => { const response = await getUsers() if (response.data?.items) { setUserList( response.data.items.map((user: IdentityUserDto) => ({ value: user.id, label: user.name, })), ) } } const getChartValues = async () => { if (!chartCode) return const res = await getChartByCode(chartCode) setNull(res.data) setChartValues(res.data) } const getDataSourceList = async () => { const response = await getDataSources() if (response.data?.items) { setDataSourceList( response.data.items.map((a) => ({ value: a.code, label: a.code, })), ) } } useEffect(() => { getChartValues() getRoleList() getUserList() getDataSourceList() }, [chartCode]) return chartValues && roleList && userList && permissionOptions ? ( { setSubmitting(true) await putCharts({ ...values }) toast.push( {'Chart Bilgileri Kaydedildi.'} , { placement: 'top-end', }, ) setSubmitting(false) }} > {({ touched, errors, resetForm, isSubmitting, values }) => (

🔙 {chartCode}

{chartValues.isTenant && ( Bu bir MULTI TENANT form'dur, veri kaybı olmaması için, sorgularda TENANTID parametresini kullanmayı unutmayınız. )}
Details Database Permissions Common Series Axis Panes Animations Crosshair Export Legend Zoom & Pan Annotations
)}
setDatabaseOperationsModalData(defaultDatabaseOperation)} onRequestClose={() => setDatabaseOperationsModalData(defaultDatabaseOperation)} >
{databaseOperationsModalData.index === -1 ? 'Add' : 'Update'}
{ setSubmitting(true) await putChartJsonItem({ id: chartValues.id, chartCode: chartValues.chartCode, index: databaseOperationsModalData.index, fieldName: 'pane', itemPane: { ...values }, }) toast.push( {databaseOperationsModalData.index === -1 ? 'Kayıt eklendi.' : 'Kayıt Değiştirildi.'} , { placement: 'top-end', }, ) getChartValues() setSubmitting(false) setDatabaseOperationsModalData(defaultDatabaseOperation) }} > {({ touched, errors, resetForm, isSubmitting, values }) => (
)}
setDatabaseOperationsModalData(defaultDatabaseOperation)} onRequestClose={() => setDatabaseOperationsModalData(defaultDatabaseOperation)} >
{databaseOperationsModalData.index === -1 ? 'Add' : 'Update'}
{ setSubmitting(true) await putChartJsonItem({ chartCode: chartValues.chartCode, id: chartValues.id, index: databaseOperationsModalData.index, fieldName: 'serie', itemSerie: { ...values } as ChartSeriesDto, }) toast.push( {databaseOperationsModalData.index === -1 ? 'Kayıt eklendi.' : 'Kayıt Değiştirildi.'} , { placement: 'top-end', }, ) getChartValues() setSubmitting(false) setDatabaseOperationsModalData(defaultDatabaseOperation) }} > {({ touched, errors, resetForm, isSubmitting, values }) => (
{({ field, form }: FieldProps) => ( option.value === values.axis)} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )} {({ field, form }: FieldProps) => ( option.value === values.dashStyle, )} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )} {({ field, form }: FieldProps) => ( option.value === values.label.format, )} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )}
)}
setDatabaseOperationsModalData(defaultDatabaseOperation)} onRequestClose={() => setDatabaseOperationsModalData(defaultDatabaseOperation)} >
{databaseOperationsModalData.index === -1 ? 'Add' : 'Update'}
{ setSubmitting(true) await putChartJsonItem({ chartCode: chartValues.chartCode, id: chartValues.id, index: databaseOperationsModalData.index, fieldName: 'axis', itemAxis: { ...values }, }) toast.push( {databaseOperationsModalData.index === -1 ? 'Kayıt eklendi.' : 'Kayıt Değiştirildi.'} , { placement: 'top-end', }, ) getChartValues() setSubmitting(false) setDatabaseOperationsModalData(defaultDatabaseOperation) }} > {({ touched, errors, resetForm, isSubmitting, values }) => { const breaks = values.breaks return (
{({ field, form }: FieldProps) => ( option.value === values.type, )} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )} {({ field, form }: FieldProps) => ( option.value === values.breakStyle.line, )} onChange={(option) => form.setFieldValue(field.name, option?.value) } /> )} {({ form, remove, push }) => (
{breaks && breaks.length > 0 ? breaks.map((_, index) => { const startValueFeedBack = fieldFeedback( form, `breaks[${index}].startValue`, ) const endValueFeedBack = fieldFeedback( form, `breaks[${index}].endValue`, ) return (
) }) : null}
)}
) }}
setDatabaseOperationsModalData(defaultDatabaseOperation)} onRequestClose={() => setDatabaseOperationsModalData(defaultDatabaseOperation)} >
{databaseOperationsModalData.index === -1 ? 'Add' : 'Update'}
{ setSubmitting(true) await putChartJsonItem({ chartCode: chartValues.chartCode, id: chartValues.id, index: databaseOperationsModalData.index, fieldName: 'annotation', itemAnnotation: { ...values }, }) toast.push( {databaseOperationsModalData.index === -1 ? 'Kayıt eklendi.' : 'Kayıt Değiştirildi.'} , { placement: 'top-end', }, ) getChartValues() setSubmitting(false) setDatabaseOperationsModalData(defaultDatabaseOperation) }} > {({ touched, errors, resetForm, isSubmitting, values }) => (
General Border {({ field, form }: FieldProps) => ( option.value === values.series)} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )} {({ field, form }: FieldProps) => ( option.value === values.border.dashStyle, )} onChange={(option) => form.setFieldValue(field.name, option?.value)} /> )}
)}
setConfirmDelete(defaultConfirmDelete)} onRequestClose={() => setConfirmDelete(defaultConfirmDelete)} >
Delete

Silmek istediğinize emin misiniz?

) : ( <> ) } export default ChartEdit