diff --git a/package-lock.json b/package-lock.json index 28f6d37..bcf918f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,6 +68,7 @@ "typescript": "^4.9.5", "vite": "^5.4.8", "vite-plugin-compression": "^0.5.1", + "vite-plugin-env-compatible": "^2.0.1", "webpack": "^5.95.0", "webpack-cli": "^5.1.4" } @@ -5275,6 +5276,23 @@ "csstype": "^3.0.2" } }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -14656,6 +14674,17 @@ "vite": ">=2.0.0" } }, + "node_modules/vite-plugin-env-compatible": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-env-compatible/-/vite-plugin-env-compatible-2.0.1.tgz", + "integrity": "sha512-DRrOZTg/W44ojVQQfGSMPEgYQGzp5TeIpt9cpaK35hTOC/b2D7Ffl8/RIgK8vQ0mlnDIUgETcA173bnMEkyzdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -18867,6 +18896,18 @@ "csstype": "^3.0.2" } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, "ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -25325,6 +25366,16 @@ "fs-extra": "^10.0.0" } }, + "vite-plugin-env-compatible": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-env-compatible/-/vite-plugin-env-compatible-2.0.1.tgz", + "integrity": "sha512-DRrOZTg/W44ojVQQfGSMPEgYQGzp5TeIpt9cpaK35hTOC/b2D7Ffl8/RIgK8vQ0mlnDIUgETcA173bnMEkyzdw==", + "dev": true, + "requires": { + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0" + } + }, "void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", diff --git a/package.json b/package.json index 1504d36..9a287c9 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "typescript": "^4.9.5", "vite": "^5.4.8", "vite-plugin-compression": "^0.5.1", + "vite-plugin-env-compatible": "^2.0.1", "webpack": "^5.95.0", "webpack-cli": "^5.1.4" } diff --git a/src/Components/DataTable/SearchField.tsx b/src/Components/DataTable/SearchField.tsx index 6a34cc5..5c6c6ba 100644 --- a/src/Components/DataTable/SearchField.tsx +++ b/src/Components/DataTable/SearchField.tsx @@ -10,11 +10,11 @@ interface Props { } const SearchField: React.FC = ({ placeholder, searchBy }) => { + const { setFilter, Filter } = useFilterStateState(); const [isOpen, setIsOpen] = useState(false); - const [searchQuery, setSearchQuery] = useState(""); + const [searchQuery, setSearchQuery] = useState(Filter[searchBy] || ""); const inputRef = useRef(null); - const { setFilter, Filter } = useFilterStateState(); const { page } = PaginationParams(location); const handleInputChange = (value: string) => { @@ -25,6 +25,7 @@ const SearchField: React.FC = ({ placeholder, searchBy }) => { if (Number(page) > 1) { } setFilter({ + ...Filter, [searchBy]: value, }); }); @@ -46,6 +47,7 @@ const SearchField: React.FC = ({ placeholder, searchBy }) => { }; }, []); + console.log(searchQuery) const [t] = useTranslation(); return (
diff --git a/src/Components/ValidationField/View/SearchField.tsx b/src/Components/ValidationField/View/SearchField.tsx index 0d7bc78..120b514 100644 --- a/src/Components/ValidationField/View/SearchField.tsx +++ b/src/Components/ValidationField/View/SearchField.tsx @@ -23,6 +23,7 @@ const SearchField = ({ canChangePage, PageName, page, + clear, ...props }: SearchFieldProps) => { const { errorMsg, isError, t, formik } = useFormField(name, props); @@ -92,6 +93,14 @@ const SearchField = ({ } }; + // to clear + useEffect(()=>{ + if(clear?.value){ + formik.setFieldValue(name, null) + clear?.method?.(false) + } + },[clear?.value]) + const handleScroll = (event: any) => { const target = event.target; const isAtBottom = diff --git a/src/Components/ValidationField/View/SelectField.tsx b/src/Components/ValidationField/View/SelectField.tsx index 2737020..d15be27 100644 --- a/src/Components/ValidationField/View/SelectField.tsx +++ b/src/Components/ValidationField/View/SelectField.tsx @@ -1,5 +1,5 @@ import { Select } from "antd"; -import React from "react"; +import React, { useEffect } from "react"; import useFormField from "../../../Hooks/useFormField"; import { translateOptions } from "../utils/translatedOptions"; import { ValidationFieldLabel } from "../components/ValidationFieldLabel"; @@ -18,6 +18,7 @@ const SelectField = ({ no_label, label_icon, isLoading, + clear, ...props }: SelectFieldProps) => { const { errorMsg, isError, t, formik } = useFormField(name, props); @@ -29,6 +30,13 @@ const SelectField = ({ }; const options = translateOptions(option, t); + // to clear + useEffect(()=>{ + if(clear?.value){ + formik.setFieldValue(name, null) + clear?.method?.(false) + } + },[clear?.value]) return (
void, + value: boolean, + } }; export type SearchFieldProps = BaseFieldProps & @@ -36,6 +40,10 @@ export type SearchFieldProps = BaseFieldProps & canChangePage: boolean; PageName: string; page: number; + clear?:{ + method:(value:boolean) => void, + value: boolean, + } }; type DateFieldProps = BaseFieldProps & { diff --git a/src/Components/dependensesFields/DependensesFields.tsx b/src/Components/dependensesFields/DependensesFields.tsx new file mode 100644 index 0000000..474f9fd --- /dev/null +++ b/src/Components/dependensesFields/DependensesFields.tsx @@ -0,0 +1,54 @@ +import React from "react"; +import { disapledDependsOn } from "./handles"; + + + +export type children = { + defaultValue?:any + dependensValue: number | string | undefined | Array | any; + props:{[key:string]:any} +}; +export type parent = { + defaultValue?:any, + props:{[key:string]:any} +}; + +type DependensesFieldesProps = { + parent?: parent; + childrens?: children[]; + Component: React.ComponentType; +}; + +function DependensesFieldes({ + parent, + childrens, + Component, +}: DependensesFieldesProps) { + return ( + <> + {parent && React.createElement(Component, { + ...{...parent.props}, + ...(parent.defaultValue && { defaultValue: parent.defaultValue }), + })} + + {childrens?.map((child: children, index: number) => + React.createElement(Component, { + key: index, + ...{...child.props}, + ...(child.defaultValue + ? { + defaultValue: child.defaultValue, + clear: disapledDependsOn(child.dependensValue) + ? { value: disapledDependsOn(child.dependensValue) } + : undefined, + } + : { clear: { value: disapledDependsOn(child.dependensValue) } }), + disabled:disapledDependsOn(child.dependensValue), + + }) + )} + + ); +} + +export default DependensesFieldes; diff --git a/src/Components/dependensesFields/handles.ts b/src/Components/dependensesFields/handles.ts new file mode 100644 index 0000000..38c18f5 --- /dev/null +++ b/src/Components/dependensesFields/handles.ts @@ -0,0 +1,11 @@ +export const disapledDependsOn =(value:any) =>{ + let status = false + if (!value || (Array.isArray(value) && value.length === 0)) { + return true; + } + else if(Array.isArray(value)){ + value.filter((item) => disapledDependsOn(item) ).length > 0 ? status = true:'' + } + + return status + } \ No newline at end of file diff --git a/src/Layout/Dashboard/FilterLayout.tsx b/src/Layout/Dashboard/FilterLayout.tsx index b18d761..6ae4fa6 100644 --- a/src/Layout/Dashboard/FilterLayout.tsx +++ b/src/Layout/Dashboard/FilterLayout.tsx @@ -31,6 +31,7 @@ const FilterLayout = ({ const { t } = useTranslation(); const translateArray = translateOptions(search_array, t); const [isOpen, setIsOpen] = useState(false); + const isMultiSearch :boolean = search_by.split(" ").length > 1 const { FilterBody, FilterSubmit } = useFilter(); return ( @@ -74,7 +75,14 @@ const FilterLayout = ({
- {haveSearch && ( + {isMultiSearch ? + search_by.split(" ").map(searchBy => + + ) + : haveSearch && ( { const { ValidationParamState } = useValidationValidationParamState(); @@ -23,10 +24,17 @@ const FilterForm = () => { TagName, TagCurrentPage, } = ValidationParamState; + const formik :any= useFormikContext() + + + const grade_id = formik.values.grade_id?.id + const subject_id = formik.values?.subject_id?.id + const unit_id = formik.values?.unit_id?.id + const lessonsIds = formik.values?.lessonsIds?.map((lesson:any) => lesson.id) const { data: Grade, isLoading: isLoadingGrade } = useGetAllGrade({ name: GradeName, - page: GradeCurrentPage, + page: GradeCurrentPage, }); const GradeOption = Grade?.data ?? []; const canChangeGradePage = !!Grade?.links?.next; @@ -36,7 +44,12 @@ const FilterForm = () => { const { data: Subject, isLoading: isLoadingSubject } = useGetAllSubject({ name: SubjectName, page: SubjectCurrentPage, - }); + grade_id + }, + { + enabled: !!grade_id + } +); const SubjectOption = Subject?.data ?? []; const canChangeSubjectPage = !!Subject?.links?.next; const SubjectPage = Subject?.meta?.current_page; @@ -45,7 +58,14 @@ const FilterForm = () => { const { data: Unit, isLoading: isLoadingUnit } = useGetAllUnit({ name: UnitName, page: UnitCurrentPage, - }); + grade_id, + subject_id + + }, +{ + enabled: !!grade_id || !!subject_id +} +); const UnitOption = Unit?.data ?? []; const canChangeUnitPage = !!Unit?.links?.next; const UnitPage = Unit?.meta?.current_page; @@ -54,106 +74,120 @@ const FilterForm = () => { const { data: Lesson, isLoading: isLoadingLesson } = useGetAllLesson({ name: LessonName, page: LessonCurrentPage, - }); + grade_id, + unit_id + + }, + { + enabled: !!grade_id || !!unit_id + } +); const LessonOption = Lesson?.data ?? []; const canChangeLessonPage = !!Lesson?.links?.next; - const LessonPage = Lesson?.meta?.current_page; + const LessonPage = Lesson?.meta?.current_page; /// TagsIds const { data: Tag, isLoading: isLoadingTag } = useGetAllTag({ name: TagName, page: TagCurrentPage, + lessonsIds, + grade_id, + subject_id, + unit_id }); const TagOption = Tag?.data ?? []; const canChangeTagPage = !!Tag?.links?.next; const TagPage = Tag?.meta?.current_page; + const colRight:any = [ + { + props: { + searchBy: "GradeName", + name: "grade_id", + label: "grade", + type: "Search", + option: GradeOption, + isLoading: isLoadingGrade, + canChangePage: canChangeGradePage, + PageName: "GradeCurrentPage", + page: GradePage, + } + }, + { + dependensValue:grade_id, + props: { + searchBy: "SubjectName", + name: "subject_id", + label: "subject", + type: "Search", + option: SubjectOption, + isLoading: isLoadingSubject, + canChangePage: canChangeSubjectPage, + PageName: "SubjectCurrentPage", + page: SubjectPage, + }, + }, + { + dependensValue:subject_id, + props: { + searchBy: "UnitName", + name: "unit_id", + label: "unit", + type: "Search", + option: UnitOption, + isLoading: isLoadingUnit, + canChangePage: canChangeUnitPage, + PageName: "UnitCurrentPage", + page: UnitPage, + }, + }, +]; +const colLeft :any=[ + + { + dependensValue: unit_id, + props: { + searchBy: "LessonName", + name: "lessonsIds", + label: "lesson", + type: "Search", + option: LessonOption, + isMulti: true, + isLoading: isLoadingLesson, + canChangePage: canChangeLessonPage, + PageName: "LessonCurrentPage", + page: LessonPage, + }, + }, + { + dependensValue: "none" , + props: { + searchBy: "TagName", + name: "tagsIds", + label: "tag", + type: "Search", + option: TagOption, + isMulti: true, + isLoading: isLoadingTag, + canChangePage: canChangeTagPage, + PageName: "TagCurrentPage", + page: TagPage, + }, + } +] +console.log(formik.values) + return (
- {/* - grade_id - */} - + - {/* - subject_id - */} - - - {/* - TagsIds - */} - - - {/* - unit_id - */} - - - - {/* - lessonsIds - */} - - +
diff --git a/src/Pages/Admin/QuestionBank/Page.tsx b/src/Pages/Admin/QuestionBank/Page.tsx index be77762..b47a6ba 100644 --- a/src/Pages/Admin/QuestionBank/Page.tsx +++ b/src/Pages/Admin/QuestionBank/Page.tsx @@ -32,7 +32,7 @@ const TableHeader = () => { /> } filterTitle="table.QuestionBank" /> diff --git a/src/Pages/Admin/QuestionBank/Table.tsx b/src/Pages/Admin/QuestionBank/Table.tsx index f30decb..67db14f 100644 --- a/src/Pages/Admin/QuestionBank/Table.tsx +++ b/src/Pages/Admin/QuestionBank/Table.tsx @@ -23,6 +23,8 @@ const App: React.FC = () => { unit_id: filterState?.unit_id?.id, lessonsIds: ConvertArrayToArrayOfIds(filterState?.lessonsIds), content: Filter?.content, + hasAnswer: Filter?.hasAnswer, + hasRightAnswer: Filter?.hasRightAnswer, sort_by, }); diff --git a/src/Pages/Admin/QuestionBank/useTableColumns.tsx b/src/Pages/Admin/QuestionBank/useTableColumns.tsx index 2633afa..fe48ac8 100644 --- a/src/Pages/Admin/QuestionBank/useTableColumns.tsx +++ b/src/Pages/Admin/QuestionBank/useTableColumns.tsx @@ -44,7 +44,7 @@ export const useColumns = () => { // console.log(grade,"grade"); - setFilter({}); + // setFilter({}); navigate( `/${ABILITIES_ENUM?.GRADE}/${grade?.id}/${ABILITIES_ENUM?.SUBJECT}/${subject?.id}/${ABILITIES_ENUM?.UNIT}/${unit?.id}/${ABILITIES_ENUM?.LESSON}/${lesson?.id}/${ABILITIES_ENUM?.QUESTION}/${record?.id}`, ); diff --git a/src/translate/ar.json b/src/translate/ar.json index 575c445..a0afc16 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -252,6 +252,9 @@ "notifiable_type": "المستخدمون" }, "practical": { + "content":"السؤال", + "hasAnswer":"الجواب", + "hasRightAnswer":"الجواب الصحيح", "to_confirm_deletion_please_re_enter": "لتأكيد الحذف، يرجى إعادة الإدخال", "back": "العودة", "add": "إضافة",