formbuilder

This commit is contained in:
hamid zarghami
2026-01-29 10:24:41 +03:30
parent 2234c44202
commit f9899f108c
6 changed files with 48 additions and 30 deletions
+12 -10
View File
@@ -1,40 +1,42 @@
import { useFormik } from 'formik'
import { type FC } from 'react'
import type { CreateAttributeType } from '../types/Types'
import { FieldTypeEnum } from '../enum/Enum'
import type { CreateFieldType } from './types/Types'
import { FieldTypeEnum } from './enum/Enum'
import * as Yup from 'yup'
import Button from '@/components/Button'
import { AddSquare } from 'iconsax-react'
import Input from '@/components/Input'
import Select from '@/components/Select'
import SwitchComponent from '@/components/Switch'
import { useCreateAttribute } from '../hooks/useProductData'
import { useCreateField } from './hooks/useFormBuilderData'
import { useNavigate, useParams } from 'react-router-dom'
import { toast } from 'react-toastify'
import { extractErrorMessage } from '@/config/func'
import { Paths } from '@/config/Paths'
const CreateAttribute: FC = () => {
const FormBuilderCreate: FC = () => {
const { id } = useParams()
const { id, type } = useParams()
const navigate = useNavigate()
const { mutate: createAttribute, isPending } = useCreateAttribute()
const { mutate: createField, isPending } = useCreateField()
const formik = useFormik<CreateAttributeType>({
const formik = useFormik<CreateFieldType>({
initialValues: {
name: '',
isRequired: true,
order: 1,
type: FieldTypeEnum.text,
entityType: 'product',
multiple: false,
},
validationSchema: Yup.object({
name: Yup.string().required('این فیلد اجباری می باشد')
}),
onSubmit: (values) => {
createAttribute({ id: Number(id), params: values }, {
createField({ id: Number(id), params: values }, {
onSuccess: () => {
toast.success('با موفقیت ذخیره شد')
navigate(Paths.product.attribute.list + id)
navigate(Paths.formBuilder.list + `${id}/${type} `)
},
onError: (error) => {
toast.error(extractErrorMessage(error))
@@ -124,4 +126,4 @@ const CreateAttribute: FC = () => {
)
}
export default CreateAttribute
export default FormBuilderCreate
+9 -9
View File
@@ -3,20 +3,20 @@ import { Paths } from '@/config/Paths'
import { AddSquare, Edit } from 'iconsax-react'
import { type FC } from 'react'
import { Link, useParams } from 'react-router-dom'
import { useDeleteAttribute, useGetAttributes } from '../hooks/useProductData'
import { useDeleteField, useGetFields } from './hooks/useFormBuilderData'
import Table from '@/components/Table'
import TrashWithConfrim from '@/components/TrashWithConfrim'
import { toast } from 'react-toastify'
import { extractErrorMessage } from '@/config/func'
const AttributeList: FC = () => {
const FormBuilderList: FC = () => {
const { id } = useParams()
const { mutate: deleteAttribute, isPending } = useDeleteAttribute()
const { data, refetch } = useGetAttributes(Number(id))
const { mutate: deleteField, isPending } = useDeleteField()
const { data, refetch } = useGetFields(Number(id))
const handleDelete = (id: number) => {
deleteAttribute(id, {
deleteField(id, {
onSuccess: () => {
refetch()
},
@@ -33,7 +33,7 @@ const AttributeList: FC = () => {
<h1 className='text-lg font-light'>ویژگی ها</h1>
<Link
to={Paths.product.attribute.create + id}
to={Paths.formBuilder.create + id}
>
<Button
className='w-fit px-6'
@@ -71,7 +71,7 @@ const AttributeList: FC = () => {
title: 'مقادیر',
render: (item) => {
return (
<Link to={Paths.product.attributeValue.list + item.id}>
<Link to={Paths.formBuilder.list + item.id}>
<Button className='w-fit px-5'>
میدیریت مقادیر
</Button>
@@ -85,7 +85,7 @@ const AttributeList: FC = () => {
render: (item) => {
return (
<div className='flex gap-2 items-center'>
<Link to={Paths.product.attribute.update + item.id}>
<Link to={Paths.formBuilder.update + item.id}>
<Edit
color='#0037FF'
size={20}
@@ -110,4 +110,4 @@ const AttributeList: FC = () => {
)
}
export default AttributeList
export default FormBuilderList
+14 -10
View File
@@ -1,37 +1,39 @@
import { useFormik } from 'formik'
import { useEffect, type FC } from 'react'
import type { CreateAttributeType } from '../types/Types'
import { FieldTypeEnum } from '../enum/Enum'
import type { CreateFieldType } from './types/Types'
import { FieldTypeEnum } from './enum/Enum'
import * as Yup from 'yup'
import Button from '@/components/Button'
import { AddSquare } from 'iconsax-react'
import Input from '@/components/Input'
import Select from '@/components/Select'
import SwitchComponent from '@/components/Switch'
import { useGetAttributeDetail, useUpdateAttribute } from '../hooks/useProductData'
import { useGetFieldDetail, useUpdateField } from './hooks/useFormBuilderData'
import { useNavigate, useParams } from 'react-router-dom'
import { toast } from 'react-toastify'
import { extractErrorMessage } from '@/config/func'
const UpdateAttribute: FC = () => {
const FormBuilderUpdate: FC = () => {
const { id } = useParams()
const navigate = useNavigate()
const { data, refetch } = useGetAttributeDetail(Number(id))
const { mutate: createAttribute, isPending } = useUpdateAttribute()
const { data, refetch } = useGetFieldDetail(Number(id))
const { mutate: createField, isPending } = useUpdateField()
const formik = useFormik<CreateAttributeType>({
const formik = useFormik<CreateFieldType>({
initialValues: {
name: '',
isRequired: true,
order: 1,
type: FieldTypeEnum.text,
entityType: 'product',
multiple: false
},
validationSchema: Yup.object({
name: Yup.string().required('این فیلد اجباری می باشد')
}),
onSubmit: (values) => {
createAttribute({ id: Number(id), params: values }, {
createField({ id: Number(id), params: values }, {
onSuccess: () => {
toast.success('با موفقیت ذخیره شد')
refetch()
@@ -51,7 +53,9 @@ const UpdateAttribute: FC = () => {
isRequired: data?.data?.isRequired,
name: data?.data?.name,
order: data?.data?.order,
type: data?.data?.type
type: data?.data?.type,
entityType: data?.data?.entityType,
multiple: data?.data?.multiple
})
}
@@ -140,4 +144,4 @@ const UpdateAttribute: FC = () => {
)
}
export default UpdateAttribute
export default FormBuilderUpdate