From 88f25cdd2e7ac7ca986b22a4876700204068d1c9 Mon Sep 17 00:00:00 2001 From: Ehsan Date: Mon, 14 Jul 2025 04:30:50 +0330 Subject: [PATCH] in page add doctor change data state & component & save data & request to send data & change component folder --- app/component/date/dateTime/SendAppo.js | 1 - app/component/date/dateTime/index.js | 3 - .../detailUser/information/form/index.js | 9 +- .../information/form/listSelector.js | 8 -- components/home/search/modal/index.js | 5 -- components/panel/addDoctor/defaultState.js | 72 +++++++++++++++ components/panel/addDoctor/index.js | 89 +++---------------- .../generalInformation/form/Selector.js | 83 +++++++++++++++++ .../generalInformation/form/SendReq.js | 23 +++++ .../listMenu/generalInformation/form/index.js | 64 ++++++------- .../listMenu/officeInformation/Form.js | 17 ++-- .../listMenu/officeInformation/Selector.js | 83 +++++++++++++++++ .../addDoctor/listMenu/workingDays/SendReq.js | 64 +++++++++++++ .../addDoctor/listMenu/workingDays/index.js | 20 +---- data/education.json | 7 ++ services/response.js | 1 + 16 files changed, 393 insertions(+), 156 deletions(-) create mode 100644 components/panel/addDoctor/defaultState.js create mode 100644 components/panel/addDoctor/listMenu/generalInformation/form/Selector.js create mode 100644 components/panel/addDoctor/listMenu/generalInformation/form/SendReq.js create mode 100644 components/panel/addDoctor/listMenu/officeInformation/Selector.js create mode 100644 components/panel/addDoctor/listMenu/workingDays/SendReq.js create mode 100644 data/education.json diff --git a/app/component/date/dateTime/SendAppo.js b/app/component/date/dateTime/SendAppo.js index 722e610..3f636b3 100644 --- a/app/component/date/dateTime/SendAppo.js +++ b/app/component/date/dateTime/SendAppo.js @@ -17,7 +17,6 @@ function SendAppo({ hour }) { slot: hour, }) .then((res) => { - console.log(res); setLoading(false); }) .catch((err) => { diff --git a/app/component/date/dateTime/index.js b/app/component/date/dateTime/index.js index 73a2856..4662395 100644 --- a/app/component/date/dateTime/index.js +++ b/app/component/date/dateTime/index.js @@ -23,7 +23,6 @@ function DateTime({ date, doctor, setStep, setIsError, locateVisit }) { setHour(); setValue(newValue); }; - console.log(hour); useEffect(() => { if (date) { @@ -32,11 +31,9 @@ function DateTime({ date, doctor, setStep, setIsError, locateVisit }) { request .getAppointment(doctorId, date) .then((res) => { - console.log(res); setAppo(res); }) .catch((err) => { - console.log(err); setAppo("در حال حاضر، نوبتی برای ساعت‌های صبح موجود نمی‌باشد."); }); } diff --git a/components/dashboard/userAccount/detailUser/information/form/index.js b/components/dashboard/userAccount/detailUser/information/form/index.js index 8f43bdc..64c2076 100644 --- a/components/dashboard/userAccount/detailUser/information/form/index.js +++ b/components/dashboard/userAccount/detailUser/information/form/index.js @@ -3,13 +3,8 @@ import Content from "./Content"; import DateBirthday from "./DateBirthday"; import AutoSelector from "../component/AutoSelector"; import Field from "../component/Field"; -import { - gender, - blood_group, - marital_status, - education, - job, -} from "./listSelector"; +import { gender, blood_group, marital_status, job } from "./listSelector"; +import education from "@/data/education.json"; function Form({ insurance, errors, changeData, information }) { const findVal = (list, name) => diff --git a/components/dashboard/userAccount/detailUser/information/form/listSelector.js b/components/dashboard/userAccount/detailUser/information/form/listSelector.js index 178c785..fa286ef 100644 --- a/components/dashboard/userAccount/detailUser/information/form/listSelector.js +++ b/components/dashboard/userAccount/detailUser/information/form/listSelector.js @@ -19,14 +19,6 @@ export const marital_status = [ { label: "مجرد", id: "single" }, ]; -export const education = [ - { label: "دیپلم", id: "diploma" }, - { label: "دیپلم تحصیلات تکمیلی", id: "postgraduate_diploma" }, - { label: "لیسانس", id: "bachelor_s_degree" }, - { label: "کارشناسی ارشد", id: "master_s_degree" }, - { label: "دکترا", id: "doctorate" }, -]; - export const job = [ { label: "آزاد", id: "azad" }, { label: "دولتی", id: "dolati" }, diff --git a/components/home/search/modal/index.js b/components/home/search/modal/index.js index d7d8941..2f2d1d9 100644 --- a/components/home/search/modal/index.js +++ b/components/home/search/modal/index.js @@ -29,15 +29,12 @@ function ModalSearchCity() { second: "", }); - // Load states and cities from JSON files useEffect(() => { - // Format states data to match the structure expected by AutoCompleteSelect const formattedStates = statesData.map((state) => ({ label: state.name, id: state.id, })); - // Format cities data const formattedCities = citiesData.map((city) => ({ label: city.name, id: city.id, @@ -48,7 +45,6 @@ function ModalSearchCity() { setCities(formattedCities); }, []); - // Filter cities when state is selected useEffect(() => { if (selected.first) { const selectedState = states.find( @@ -69,7 +65,6 @@ function ModalSearchCity() { const updateData = (event, name) => { if (name === "first" && event !== selected.first) { - // If state changes, reset city selection setSelected({ first: event, second: "" }); } else { setSelected({ ...selected, [name]: event }); diff --git a/components/panel/addDoctor/defaultState.js b/components/panel/addDoctor/defaultState.js new file mode 100644 index 0000000..d5b146e --- /dev/null +++ b/components/panel/addDoctor/defaultState.js @@ -0,0 +1,72 @@ +export const defaultState = { + general: { + name: { value: "", placeholder: "", isEdit: true }, + medical_system_number: { + value: "", + placeholder: 1741025645, + isEdit: true, + }, + expertise: { value: "", placeholder: "دندان پزشکی", isEdit: true }, + description: { value: "", isEdit: true }, + skills: { value: "", isEdit: true }, + time_work: { value: "", isEdit: true }, + degree: { value: "", isEdit: true }, + }, + office: { + address: { value: "مپ", isEdit: true }, + phone: { value: "", placeholder: 1741025645, isEdit: true }, + office_number1: { value: "", isEdit: true }, + state: { value: "", isEdit: true }, + city: { value: "", isEdit: true }, + }, + work_day: [ + { + name: "شنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + { + name: "یکشنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + { + name: "دوشنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + { + name: "سه شنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + { + name: "چهار شنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + { + name: "پنج شنبه", + number_turns: { value: 1, isEdit: true }, + turn_time: "", + workplace: "", + morning_time: ["", ""], + evening_time: ["", ""], + }, + ], +}; diff --git a/components/panel/addDoctor/index.js b/components/panel/addDoctor/index.js index c90e51f..82ef8fd 100644 --- a/components/panel/addDoctor/index.js +++ b/components/panel/addDoctor/index.js @@ -7,82 +7,16 @@ import WorkingDays from "./listMenu/workingDays"; import OfficeInformation from "./listMenu/officeInformation"; import GeneralInformation from "./listMenu/generalInformation"; import Step from "./Step"; +import { defaultState } from "./defaultState"; function AddDoctorPage() { - const [value, setValue] = useState(0); - const [data, setData] = useState({ - general: { - name: { value: "", placeholder: "", isEdit: true }, - medical_system_number: { - value: "", - placeholder: 1741025645, - isEdit: true, - }, - expertise: { value: "", placeholder: "دندان پزشکی", isEdit: true }, - description: { value: "", isEdit: true }, - skills: { value: "", isEdit: true }, - time_work: { value: "", isEdit: true }, - degree: { value: "", isEdit: true }, - }, - office: { - address: { value: "مپ", isEdit: true }, - phone: { value: "", placeholder: 1741025645, isEdit: true }, - office_number1: { value: "", isEdit: true }, - office_number2: { value: "", isEdit: true }, - state: { value: "", isEdit: true }, - city: { value: "", isEdit: true }, - }, - work_day: [ - { - name: "شنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - { - name: "یکشنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - { - name: "دوشنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - { - name: "سه شنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - { - name: "چهار شنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - { - name: "پنج شنبه", - number_turns: { value: 1, isEdit: true }, - turn_time: "", - workplace: "", - morning_time: ["", ""], - evening_time: ["", ""], - }, - ], - }); + const [value, setValue] = useState(2); + const [data, setData] = useState(defaultState); + + const resetData = () => { + setData(defaultState); + setValue(0); + }; const components = [ , - , + , ]; return ( diff --git a/components/panel/addDoctor/listMenu/generalInformation/form/Selector.js b/components/panel/addDoctor/listMenu/generalInformation/form/Selector.js new file mode 100644 index 0000000..6ec19a6 --- /dev/null +++ b/components/panel/addDoctor/listMenu/generalInformation/form/Selector.js @@ -0,0 +1,83 @@ +import BottomSelect from "@/components/icons/BottomSelect"; +import { Autocomplete, Button, TextField } from "@mui/material"; +import { styleTextSelectRight } from "@/mui"; + +function Selector({ updateData, nameKey, label, name, list }) { + return ( + option[nameKey] || ""} + isOptionEqualToValue={(option, value) => option.id === value.id} + className="!w-full !rounded-lg auto-complete-selector " + onChange={(e, newValue) => { + if (newValue) { + updateData && updateData(newValue.id, "value", name); + } + }} + sx={{ + ...styleTextSelectRight, + // Hide Icon Number + "& input::-webkit-outer-spin-button, & input::-webkit-inner-spin-button": + { + display: "none", + }, + "& input[type=number]": { + MozAppearance: "textfield", + }, + "& .MuiInputBase-input": { padding: "12.5px 14px !important" }, + "& .MuiInputBase-root": { + borderRadius: 2, + padding: "0 !important", + height: { + xs: "43px !important", + sm: "43px !important", + md: "46px !important", + lg: "48px !important", + }, + }, + "& .MuiOutlinedInput-notchedOutline": { + border: "1px solid #D7D7D7", + }, + "& .MuiInput-underline:hover:not(.Mui-disabled):before, .MuiOutlinedInput-notchedOutline": + { + borderColor: "#D7D7D7 !important", + }, + "& .muirtl-1kiro5a-MuiInputBase-root-MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline": + { + border: "1px solid #5559CE !important", + }, + }} + renderOption={(props, option) => ( + + )} + renderInput={(params) => ( + + + + ), + }} + placeholder={label} + sx={{ + borderRadius: "8px", + }} + /> + )} + /> + ); +} + +export default Selector; diff --git a/components/panel/addDoctor/listMenu/generalInformation/form/SendReq.js b/components/panel/addDoctor/listMenu/generalInformation/form/SendReq.js new file mode 100644 index 0000000..1f94017 --- /dev/null +++ b/components/panel/addDoctor/listMenu/generalInformation/form/SendReq.js @@ -0,0 +1,23 @@ +import ArrowLeftPA from "@/components/icons/ArrowLeftPA"; +import { checkAllValues } from "@/helper"; +import { Button } from "@mui/material"; + +function SendReq({ setValue, data }) { + return ( +
+ +
+ ); +} + +export default SendReq; diff --git a/components/panel/addDoctor/listMenu/generalInformation/form/index.js b/components/panel/addDoctor/listMenu/generalInformation/form/index.js index 67f6137..dcd8719 100644 --- a/components/panel/addDoctor/listMenu/generalInformation/form/index.js +++ b/components/panel/addDoctor/listMenu/generalInformation/form/index.js @@ -1,14 +1,15 @@ -import { Button } from "@mui/material"; import FieldDate from "./FieldDate"; -import { degree, expertise } from "./listSelector"; import RadioGender from "./RadioGender"; +import SendReq from "./SendReq"; +import Selector from "./Selector"; // Components import EditField from "@/app/component/EditField"; import ContentText from "@/app/component/ContentText"; -import ArrowLeftPA from "@/components/icons/ArrowLeftPA"; -import AutoCompleteSelect from "@/app/component/element/AutoCompleteSelect"; -import { checkAllValues } from "@/helper"; + +// Data +import specialties from "@/data/specialties.json"; +import education from "@/data/education.json"; const validate_medical_number = { min: 1, @@ -16,20 +17,22 @@ const validate_medical_number = { }; function Form({ setValue, parent, data, setData }) { - const changeData = (value, type, name) => + const changeData = (value, type, name) => { + type !== "isEdit" && - setData((prev) => { - return { - ...prev, - [parent]: { - ...prev[parent], - [name]: { - ...prev[parent][name], - [type]: value, + setData((prev) => { + return { + ...prev, + [parent]: { + ...prev[parent], + [name]: { + ...prev[parent][name], + [type]: value, + }, }, - }, - }; - }); + }; + }); + }; const updateNum = (value, type, name) => { const parseValue = +value; @@ -37,6 +40,7 @@ function Form({ setValue, parent, data, setData }) { const validateValue = parseValue > max ? data[name].value : value; changeData(validateValue, type, name); }; + const filteredSpe = specialties.filter((item) => item.parent); return ( <> @@ -67,20 +71,22 @@ function Form({ setValue, parent, data, setData }) { /> - - @@ -110,19 +116,7 @@ function Form({ setValue, parent, data, setData }) { -
- -
+ ); } diff --git a/components/panel/addDoctor/listMenu/officeInformation/Form.js b/components/panel/addDoctor/listMenu/officeInformation/Form.js index 17d9ad0..8e1e7a7 100644 --- a/components/panel/addDoctor/listMenu/officeInformation/Form.js +++ b/components/panel/addDoctor/listMenu/officeInformation/Form.js @@ -8,6 +8,11 @@ import AutoCompleteSelect from "@/app/component/element/AutoCompleteSelect"; import { useState } from "react"; import ModalMap from "./modal"; +// Data +import statesData from "@/data/state.json"; +import citiesData from "@/data/city.json"; +import Selector from "./Selector"; + const validate_phone_number = { min: 1, max: 9999999999, @@ -45,19 +50,19 @@ function Form({ parent, data, setData }) { <>
- - @@ -107,7 +112,7 @@ function Form({ parent, data, setData }) { }} /> - + {/* - + */}
diff --git a/components/panel/addDoctor/listMenu/officeInformation/Selector.js b/components/panel/addDoctor/listMenu/officeInformation/Selector.js new file mode 100644 index 0000000..3c1ba91 --- /dev/null +++ b/components/panel/addDoctor/listMenu/officeInformation/Selector.js @@ -0,0 +1,83 @@ +import BottomSelect from "@/components/icons/BottomSelect"; +import { Autocomplete, Button, TextField } from "@mui/material"; +import { styleTextSelectRight } from "@/mui"; + +function Selector({ updateData, label, name, list }) { + return ( + option.name || ""} + // isOptionEqualToValue={(option, value) => option.id === value.id} + className="!w-full !rounded-lg auto-complete-selector " + onChange={(e, newValue) => { + if (newValue) { + updateData && updateData(newValue.id, "value", name); + } + }} + sx={{ + ...styleTextSelectRight, + // Hide Icon Number + "& input::-webkit-outer-spin-button, & input::-webkit-inner-spin-button": + { + display: "none", + }, + "& input[type=number]": { + MozAppearance: "textfield", + }, + "& .MuiInputBase-input": { padding: "12.5px 14px !important" }, + "& .MuiInputBase-root": { + borderRadius: 2, + padding: "0 !important", + height: { + xs: "43px !important", + sm: "43px !important", + md: "46px !important", + lg: "48px !important", + }, + }, + "& .MuiOutlinedInput-notchedOutline": { + border: "1px solid #D7D7D7", + }, + "& .MuiInput-underline:hover:not(.Mui-disabled):before, .MuiOutlinedInput-notchedOutline": + { + borderColor: "#D7D7D7 !important", + }, + "& .muirtl-1kiro5a-MuiInputBase-root-MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline": + { + border: "1px solid #5559CE !important", + }, + }} + renderOption={(props, option) => ( + + )} + renderInput={(params) => ( + + + + ), + }} + placeholder={label} + sx={{ + borderRadius: "8px", + }} + /> + )} + /> + ); +} + +export default Selector; diff --git a/components/panel/addDoctor/listMenu/workingDays/SendReq.js b/components/panel/addDoctor/listMenu/workingDays/SendReq.js new file mode 100644 index 0000000..fa4ffe2 --- /dev/null +++ b/components/panel/addDoctor/listMenu/workingDays/SendReq.js @@ -0,0 +1,64 @@ +import { Button } from "@mui/material"; +import ArrowLeftWhiteD from "@/components/icons/ArrowLeftWhiteD"; +import { request } from "@/services/response"; +import { useState } from "react"; +import moment from "jalali-moment"; +import { defaultState } from "../../defaultState"; + +const dateToTimestamp = (date) => { + const gregorianMoment = moment(date, "jYYYY/jM/jD").locale("fa"); + const unixTimestamp = gregorianMoment.valueOf(); + return unixTimestamp / 1000; +}; + +const transformData = (data) => { + return { + name: data.general.name.value, + activity_time: dateToTimestamp(data.general.time_work.value), + doctor_mobile_number: data.office.phone.value, + state: [Number(data.office.state.value)], + city: [Number(data.office.city.value)], + degree: data.general.degree.value, + specialty: [Number(data.general.expertise.value)], + info: data.general.description.value, + }; +}; + +function SendReq({ data, isDisable, resetData }) { + const [loading, setLoading] = useState(false); + + const saveData = () => { + setLoading(true); + + const transformed = transformData(data); + + request + .postDoctor(transformed) + .then(() => { + resetData(); + setLoading(false); + }) + .catch(() => { + setLoading(false); + }); + }; + + return ( + + ); +} + +export default SendReq; diff --git a/components/panel/addDoctor/listMenu/workingDays/index.js b/components/panel/addDoctor/listMenu/workingDays/index.js index d1c0923..06cc8f0 100644 --- a/components/panel/addDoctor/listMenu/workingDays/index.js +++ b/components/panel/addDoctor/listMenu/workingDays/index.js @@ -1,11 +1,10 @@ -import { Button } from "@mui/material"; import List from "./List"; -import ArrowLeftWhiteD from "@/components/icons/ArrowLeftWhiteD"; import { useState } from "react"; import ScrollToTop from "@/app/component/ScrollToTop"; +import SendReq from "./SendReq"; -function WorkingDays({ parent, data, setData }) { - const [isDisable, setIsDisable] = useState(true); +function WorkingDays({ parent, data, setData, resetData }) { + const [isDisable, setIsDisable] = useState(false); return (
@@ -19,18 +18,7 @@ function WorkingDays({ parent, data, setData }) { setData={setData} setIsDisable={setIsDisable} /> - +
); } diff --git a/data/education.json b/data/education.json new file mode 100644 index 0000000..d8f881a --- /dev/null +++ b/data/education.json @@ -0,0 +1,7 @@ +[ + { "label": "دیپلم", "id": "diploma" }, + { "label": "دیپلم تحصیلات تکمیلی", "id": "postgraduate_diploma" }, + { "label": "لیسانس", "id": "bachelor_s_degree" }, + { "label": "کارشناسی ارشد", "id": "master_s_degree" }, + { "label": "دکترا", "id": "doctorate" } +] diff --git a/services/response.js b/services/response.js index 0dcd8a4..c3ee5af 100644 --- a/services/response.js +++ b/services/response.js @@ -59,4 +59,5 @@ export const request = { removeTokenHead ), postAppointment: (data) => api.post(`api/v1/appointment`, data), + postDoctor: (data) => api.post("api/v1/doctor", data), };