From 0db121150d0d054f77e2cf89ececf55053728af5 Mon Sep 17 00:00:00 2001 From: ehsan Date: Thu, 25 Sep 2025 17:06:57 +0330 Subject: [PATCH] update field doctors, cities, states and specialties --- app/component/ProfressDetail.js | 12 +- app/component/modalSearchCity/ButtonFilter.js | 2 +- .../clinic/components/about/images/List.js | 2 + components/clinics/head/AutoSearch.js | 105 +++++++++ components/clinics/head/FilterButton.js | 33 +++ components/clinics/head/SearchBar.js | 49 ++-- components/clinics/index.js | 12 +- .../cards/comments/chart/index.js | 2 +- components/doctors/search/AutoComplete.js | 18 +- components/doctors/search/SearchField.js | 8 +- components/doctors/search/index.js | 1 - components/home/search/modal/index.js | 7 + data/city.json | 71 +++--- data/specialties.json | 212 +++++++++--------- data/state.json | 2 +- 15 files changed, 336 insertions(+), 200 deletions(-) create mode 100644 components/clinics/head/AutoSearch.js create mode 100644 components/clinics/head/FilterButton.js diff --git a/app/component/ProfressDetail.js b/app/component/ProfressDetail.js index 3df210b..705111e 100644 --- a/app/component/ProfressDetail.js +++ b/app/component/ProfressDetail.js @@ -1,11 +1,19 @@ import { numberToArStyle } from "@/helper"; import { LinearProgress } from "@mui/material"; -function ProgressDetail({ data }) { +const label = [ + "برخورد مناسب پزشک", + "تشخیص درست", + "زمان انتظار در مطب", + "مهارت پزشک", + "نظافت مطب", +]; + +function ProgressDetail({ data, idx }) { return (
  • - {data.label} + {label[idx]}

    - {selected.city || "شهر"} + {(selected.city !== "نوبت 724" ? selected.city : false) || "شهر"}

    diff --git a/components/clinic/components/about/images/List.js b/components/clinic/components/about/images/List.js index 3cf12ab..eaec453 100644 --- a/components/clinic/components/about/images/List.js +++ b/components/clinic/components/about/images/List.js @@ -4,6 +4,8 @@ import Img from "./Img"; function List({ data }) { const images_clinic = data.images_clinic; + console.log(data); + return (
    diff --git a/components/clinics/head/AutoSearch.js b/components/clinics/head/AutoSearch.js new file mode 100644 index 0000000..a36cbc9 --- /dev/null +++ b/components/clinics/head/AutoSearch.js @@ -0,0 +1,105 @@ +import { Autocomplete, TextField } from "@mui/material"; +import { useEffect, useRef, useState } from "react"; + +function AutoSearch({ + data, + noneBg, + inputValue, + placeholder, + handleSearch, + setInputValue, + setSelectedOption, + debounce = 500, +}) { + const typingTimeoutRef = useRef(null); + const [localInput, setLocalInput] = useState(inputValue || ""); + + useEffect(() => { + setLocalInput(inputValue || ""); + }, [inputValue]); + + useEffect(() => { + return () => { + if (typingTimeoutRef.current) clearTimeout(typingTimeoutRef.current); + }; + }, []); + + const onInputChange = (_, newInputValue) => { + setLocalInput(newInputValue); + + if (setInputValue) setInputValue(newInputValue); + + if (typingTimeoutRef.current) clearTimeout(typingTimeoutRef.current); + typingTimeoutRef.current = setTimeout(() => { + handleSearch(newInputValue); + }, debounce); + }; + + const onChange = (_, newValue) => { + if (typingTimeoutRef.current) { + clearTimeout(typingTimeoutRef.current); + typingTimeoutRef.current = null; + } + + const val = newValue + ? typeof newValue === "string" + ? newValue + : newValue.name + : ""; + setLocalInput(val); + setSelectedOption && setSelectedOption(newValue); + handleSearch(val); + if (setInputValue) setInputValue(val); + }; + + return ( + + typeof option === "string" ? option : option.name + } + disableClearable + inputValue={localInput} + className="!w-full" + onInputChange={onInputChange} + onChange={onChange} + renderOption={(props, option) => ( +
  • + {option.name} +
  • + )} + sx={{ + "& .MuiAutocomplete-input": { + background: noneBg ? "" : "#ffffff !important", + }, + }} + renderInput={(params) => ( + + )} + /> + ); +} + +export default AutoSearch; diff --git a/components/clinics/head/FilterButton.js b/components/clinics/head/FilterButton.js new file mode 100644 index 0000000..3acbbda --- /dev/null +++ b/components/clinics/head/FilterButton.js @@ -0,0 +1,33 @@ +import SearchD from "@/components/icons/SearchD"; +import { Button } from "@mui/material"; +import { useState } from "react"; + +function FilterButton({ setFilteredClinics }) { + const [loading, setLoading] = useState(false); + const filterData = () => { + setLoading(true) + }; + + return ( + + ); +} + +export default FilterButton; diff --git a/components/clinics/head/SearchBar.js b/components/clinics/head/SearchBar.js index 93d513a..c049da3 100644 --- a/components/clinics/head/SearchBar.js +++ b/components/clinics/head/SearchBar.js @@ -1,18 +1,34 @@ -import { Button, ButtonGroup, TextField } from "@mui/material"; -import SearchD from "@/components/icons/SearchD"; +import { ButtonGroup } from "@mui/material"; import { useState } from "react"; import ButtonFilter from "@/app/component/modalSearchCity/ButtonFilter"; -import AutoCompleteSearch from "@/components/searchHead/smSearch/AutoCompleteSearch"; import ModalSearchCity from "@/components/home/search/modal"; +import AutoSearch from "./AutoSearch"; +import { useRouter } from "next/navigation"; +import FilterButton from "./FilterButton"; function SearchBar({ - selected, - setSelected, - specialties, state, - handleSearch, + selected, + specialties, + setSelected, + setFilteredClinics, }) { const [open, setOpen] = useState(false); + const router = useRouter(); + + const handleSearch = (e) => { + const specialty = specialties.find((item) => item.name === e); + const searchParams = new URLSearchParams(window.location.search); + + if (specialty) { + searchParams.set("specialty", specialty.name); + setSelected({ ...selected, specialty: specialty.name }); + } else { + e ? searchParams.set("specialty", e) : searchParams.delete("specialty"); + setSelected({ ...selected, specialty: e }); + } + router.push(`?${searchParams.toString()}`); + }; return ( - - + ); } diff --git a/components/clinics/index.js b/components/clinics/index.js index 7342e2d..2e310b8 100644 --- a/components/clinics/index.js +++ b/components/clinics/index.js @@ -5,25 +5,17 @@ import { useState } from "react"; import List from "./list"; import SearchBar from "./head/SearchBar"; import HeadPageList from "@/app/component/head"; -import { useRouter } from "next/navigation"; import specialtiesData from "@/data/specialties.json"; function ClinicsPage({ clinics, matchedCity, matchedState }) { - const router = useRouter(); const [filteredClinics, setFilteredClinics] = useState(clinics); const [selected, setSelected] = useState({ province: matchedState?.name || "", city: matchedCity?.name || "", + specialty: "", }); - const handleSearch = (value) => { - // const current = new URLSearchParams(window.location.search); - // current.set("search", value); - // const queryString = current.toString(); - // router.push(`/clinics?${queryString}`); - }; - return (
    diff --git a/components/doctor/detailDoctor/cards/comments/chart/index.js b/components/doctor/detailDoctor/cards/comments/chart/index.js index 8702ed1..2310a73 100644 --- a/components/doctor/detailDoctor/cards/comments/chart/index.js +++ b/components/doctor/detailDoctor/cards/comments/chart/index.js @@ -55,7 +55,7 @@ function Chart({ comments, doctor }) {
      {Object.values(doctor?.average_rate?.averages).map((item, idx) => ( - + ))}
    diff --git a/components/doctors/search/AutoComplete.js b/components/doctors/search/AutoComplete.js index 4127521..83c5eac 100644 --- a/components/doctors/search/AutoComplete.js +++ b/components/doctors/search/AutoComplete.js @@ -5,22 +5,20 @@ function AutoComplete({ data, noneBg, clearText, - inputValue, // مقدار کنترل‌شده از والد (اختیاری) + inputValue, placeholder, - handleSearch, // تابعی که باید با مقدار جستجو صدا زده بشه - setInputValue, // اختیاری: اگه والد دوست داره همون‌وقت مقدار رو بگیره + handleSearch, + setInputValue, setSelectedOption, - debounce = 500, // قابل تنظیم + debounce = 500, }) { const typingTimeoutRef = useRef(null); const [localInput, setLocalInput] = useState(inputValue || ""); - // همگام‌سازی وقتی والد مقدار کنترل‌شده رو تغییر میده (مثلاً بعد از انتخاب گزینه) useEffect(() => { setLocalInput(inputValue || ""); }, [inputValue]); - // پاک‌کردن تایمر هنگام unmount useEffect(() => { return () => { if (typingTimeoutRef.current) clearTimeout(typingTimeoutRef.current); @@ -28,13 +26,10 @@ function AutoComplete({ }, []); const onInputChange = (_, newInputValue) => { - // نمایش آنی تایپ کاربر setLocalInput(newInputValue); - // اختیاری: اگر والد خواست همون‌جا مقدار رو بگیره if (setInputValue) setInputValue(newInputValue); - // پاک کردن تایمر قبلی و ست کردن تایمر جدید برای debounce if (typingTimeoutRef.current) clearTimeout(typingTimeoutRef.current); typingTimeoutRef.current = setTimeout(() => { handleSearch(newInputValue); @@ -42,7 +37,6 @@ function AutoComplete({ }; const onChange = (_, newValue) => { - // انتخاب از لیست — مقدار رو فوراً پردازش کن if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); typingTimeoutRef.current = null; @@ -55,7 +49,7 @@ function AutoComplete({ : ""; setLocalInput(val); setSelectedOption && setSelectedOption(newValue); - handleSearch(val); // اجرای فوری روی انتخاب + handleSearch(val); if (setInputValue) setInputValue(val); }; @@ -67,7 +61,7 @@ function AutoComplete({ typeof option === "string" ? option : option.name } disableClearable - inputValue={localInput} // ← نمایش آنی از local state + inputValue={localInput} className="!w-full" onInputChange={onInputChange} onChange={onChange} diff --git a/components/doctors/search/SearchField.js b/components/doctors/search/SearchField.js index a6f4fc7..ee5b433 100644 --- a/components/doctors/search/SearchField.js +++ b/components/doctors/search/SearchField.js @@ -3,7 +3,7 @@ import { useRouter } from "next/navigation"; import specialties from "@/data/specialties.json"; import AutoComplete from "./AutoComplete"; -function SearchField({ filter, setFilter, updateData, setDataInURL }) { +function SearchField({ filter, setFilter, setDataInURL }) { const router = useRouter(); const clearText = () => { @@ -17,7 +17,6 @@ function SearchField({ filter, setFilter, updateData, setDataInURL }) { }, }; setFilter(newFilter); - // setDataInURL(newFilter); }; const handleSearch = (e) => { @@ -34,7 +33,6 @@ function SearchField({ filter, setFilter, updateData, setDataInURL }) { dataUrl.specialty = findName.name; newFilter.category = itemParent; newFilter.specialty = findName; - // updateData("name", e); } else { dataUrl.specialty = findName.name; newFilter.category = findName; @@ -50,8 +48,6 @@ function SearchField({ filter, setFilter, updateData, setDataInURL }) { router.push(`?${searchParams.toString()}`); newFilter.name = e; setFilter(newFilter); - // const newFilter = { ...filter, [name]: e }; - // setFilter(newFilter); } else { let newFilter = filter; @@ -65,7 +61,6 @@ function SearchField({ filter, setFilter, updateData, setDataInURL }) { router.push(`?${searchParams.toString()}`); } newFilter.name = e; - // updateData("name", e); setFilter(newFilter); setDataInURL(newFilter); } @@ -78,7 +73,6 @@ function SearchField({ filter, setFilter, updateData, setDataInURL }) { clearText={clearText} inputValue={filter.name} handleSearch={handleSearch} - // handleSearch={(e) => updateData("name", e)} placeholder="جستجوی نام پزشک، تخصص، بیماری ..." />
    diff --git a/components/doctors/search/index.js b/components/doctors/search/index.js index eef89cc..f414c0c 100644 --- a/components/doctors/search/index.js +++ b/components/doctors/search/index.js @@ -39,7 +39,6 @@ function SearchBar({ filter, sendReq, setFilter, updateData, setDataInURL }) { { + const searchParams = new URLSearchParams(window.location.search); + if (name === "province") { setSelected({ ...selected, province: event, city: "" }); + searchParams.set("state", event); } else { setSelected({ ...selected, [name]: event }); + searchParams.set("city", event); } + router.push(`?${searchParams.toString()}`); }; return ( diff --git a/data/city.json b/data/city.json index b84d9b2..fcaa394 100644 --- a/data/city.json +++ b/data/city.json @@ -1,6 +1,6 @@ [ { - "id": "32", + "id": "101", "email": "nobat724@gmail.com", "type": "2", "province_id": "1", @@ -21,7 +21,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به تبریز نوبت می‌باشد." }, { - "id": "33", + "id": "102", "email": "nobat724@gmail.com", "type": "2", "province_id": "2", @@ -42,7 +42,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به ارومیه نوبت می‌باشد." }, { - "id": "34", + "id": "103", "email": "nobat724@gmail.com", "type": "2", "province_id": "3", @@ -63,7 +63,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به اردبیل نوبت می‌باشد." }, { - "id": "35", + "id": "104", "email": "nobat724@gmail.com", "type": "2", "province_id": "4", @@ -84,7 +84,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به اصفهان نوبت می‌باشد." }, { - "id": "36", + "id": "105", "email": "nobat724@gmail.com", "type": "2", "province_id": "5", @@ -105,7 +105,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به کرج نوبت می‌باشد." }, { - "id": "37", + "id": "106", "email": "nobat724@gmail.com", "type": "2", "province_id": "6", @@ -126,7 +126,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به ایلام نوبت می‌باشد." }, { - "id": "38", + "id": "107", "email": "nobat724@gmail.com", "type": "2", "province_id": "7", @@ -147,7 +147,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به بوشهر نوبت می‌باشد." }, { - "id": "39", + "id": "108", "email": "nobat724@gmail.com", "type": "2", "province_id": "8", @@ -168,7 +168,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به تهران نوبت می‌باشد." }, { - "id": "40", + "id": "109", "email": "nobat724@gmail.com", "type": "2", "province_id": "9", @@ -189,7 +189,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به شهرکرد نوبت می‌باشد." }, { - "id": "41", + "id": "110", "email": "nobat724@gmail.com", "type": "2", "province_id": "10", @@ -210,7 +210,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به بیرجند نوبت می‌باشد." }, { - "id": "42", + "id": "111", "email": "nobat724@gmail.com", "type": "2", "province_id": "11", @@ -231,7 +231,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به مشهد نوبت می‌باشد." }, { - "id": "43", + "id": "112", "email": "nobat724@gmail.com", "type": "2", "province_id": "12", @@ -252,7 +252,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به بجنورد نوبت می‌باشد." }, { - "id": "44", + "id": "113", "email": "nobat724@gmail.com", "type": "2", "province_id": "13", @@ -273,7 +273,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به اهواز نوبت می‌باشد." }, { - "id": "45", + "id": "114", "email": "nobat724@gmail.com", "type": "2", "province_id": "14", @@ -294,7 +294,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به زنجان نوبت می‌باشد." }, { - "id": "46", + "id": "115", "email": "nobat724@gmail.com", "type": "2", "province_id": "15", @@ -315,7 +315,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به سمنان نوبت می‌باشد." }, { - "id": "47", + "id": "116", "email": "nobat724@gmail.com", "type": "2", "province_id": "16", @@ -336,7 +336,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به زاهدان نوبت می‌باشد." }, { - "id": "48", + "id": "117", "email": "nobat724@gmail.com", "type": "2", "province_id": "17", @@ -357,7 +357,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به شیراز نوبت می‌باشد." }, { - "id": "49", + "id": "118", "email": "nobat724@gmail.com", "type": "2", "province_id": "18", @@ -378,7 +378,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به قزوین نوبت می‌باشد." }, { - "id": "50", + "id": "119", "email": "nobat724@gmail.com", "type": "2", "province_id": "19", @@ -399,7 +399,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به قم نوبت می‌باشد." }, { - "id": "51", + "id": "120", "email": "nobat724@gmail.com", "type": "2", "province_id": "20", @@ -420,7 +420,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به سنندج نوبت می‌باشد." }, { - "id": "52", + "id": "121", "email": "nobat724@gmail.com", "type": "2", "province_id": "21", @@ -441,7 +441,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به کرمان نوبت می‌باشد." }, { - "id": "53", + "id": "122", "email": "nobat724@gmail.com", "type": "2", "province_id": "22", @@ -462,7 +462,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به کرمانشاه نوبت می‌باشد." }, { - "id": "54", + "id": "123", "email": "nobat724@gmail.com", "type": "2", "province_id": "23", @@ -483,7 +483,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به یاسوج نوبت می‌باشد." }, { - "id": "64", + "id": "124", "email": "nobat724@gmail.com", "type": "2", "province_id": "23", @@ -504,7 +504,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به یاسوج نوبت می‌باشد." }, { - "id": "55", + "id": "125", "email": "nobat724@gmail.com", "type": "2", "province_id": "24", @@ -525,7 +525,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به گرگان نوبت می‌باشد." }, { - "id": "56", + "id": "126", "email": "nobat724@gmail.com", "type": "2", "province_id": "25", @@ -546,7 +546,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به رشت نوبت می‌باشد." }, { - "id": "57", + "id": "127", "email": "nobat724@gmail.com", "type": "2", "province_id": "26", @@ -567,7 +567,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به خرم‌آباد نوبت می‌باشد." }, { - "id": "58", + "id": "128", "email": "nobat724@gmail.com", "type": "2", "province_id": "27", @@ -588,7 +588,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به ساری نوبت می‌باشد." }, { - "id": "59", + "id": "129", "email": "nobat724@gmail.com", "type": "2", "province_id": "28", @@ -609,7 +609,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به اراک نوبت می‌باشد." }, { - "id": "60", + "id": "130", "email": "nobat724@gmail.com", "type": "2", "province_id": "29", @@ -630,7 +630,7 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به بندرعباس نوبت می‌باشد." }, { - "id": "61", + "id": "131", "email": "nobat724@gmail.com", "type": "2", "province_id": "30", @@ -651,10 +651,10 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به همدان نوبت می‌باشد." }, { - "id": "62", + "id": "132", "email": "nobat724@gmail.com", "type": "2", - "province_id": "31", + "province_id": "100", "name": "یزد", "site_name": "یزد نوبت", "slogan": "نوبت‌گیری آنلاین پزشکان یزد، در هر ساعت از روز", @@ -672,10 +672,9 @@ "footerDisclaimer": "تمامی حقوق این سایت متعلق به یزد نوبت می‌باشد." }, { - "id": "63", + "id": "600", "email": "nobat724@gmail.com", "type": "2", - "province_id": "32", "name": "نوبت 724", "site_name": "نوبت 724", "slogan": "دیگه نوبت گرفتن کار سختی نیست !", @@ -692,4 +691,4 @@ "footerDescription": "نوبت 724، سامانه جامع نوبت‌دهی پزشکی برای تمامی شهرها. رزرو نوبت از پزشکان و مراکز درمانی معتبر بدون نیاز به مراجعه حضوری.", "footerDisclaimer": "تمامی حقوق این سایت متعلق به نوبت 724 می‌باشد." } -] \ No newline at end of file +] diff --git a/data/specialties.json b/data/specialties.json index 6720455..8b78b5a 100644 --- a/data/specialties.json +++ b/data/specialties.json @@ -1,346 +1,346 @@ [ { - "id": "500", + "id": "601", "name": "پزشکی عمومی", "parent": null }, { - "id": "501", + "id": "602", "name": "داخلی", "parent": null }, { - "id": "502", + "id": "603", "name": "داخلی عمومی", - "parent": "501" + "parent": "602" }, { - "id": "503", + "id": "604", "name": "قلب و عروق", - "parent": "501" + "parent": "602" }, { - "id": "504", + "id": "605", "name": "گوارش و کبد", - "parent": "501" + "parent": "602" }, { - "id": "505", + "id": "606", "name": "غدد و متابولیسم", - "parent": "501" + "parent": "602" }, { - "id": "506", + "id": "607", "name": "خون و انکولوژی", - "parent": "501" + "parent": "602" }, { - "id": "507", + "id": "608", "name": "ریه (پولمونولوژی)", - "parent": "501" + "parent": "602" }, { - "id": "508", + "id": "609", "name": "کلیه و مجاری ادراری (نفرولوژی)", - "parent": "501" + "parent": "602" }, { - "id": "509", + "id": "610", "name": "روماتولوژی (بیماری‌های مفاصل)", - "parent": "501" + "parent": "602" }, { - "id": "510", + "id": "611", "name": "نورولوژی (عصبی)", - "parent": "501" + "parent": "602" }, { - "id": "511", + "id": "612", "name": "جراحی", "parent": null }, { - "id": "512", + "id": "613", "name": "جراحی عمومی", - "parent": "511" + "parent": "612" }, { - "id": "513", + "id": "614", "name": "جراحی مغز و اعصاب", - "parent": "511" + "parent": "612" }, { - "id": "514", + "id": "615", "name": "جراحی قلب و عروق", - "parent": "511" + "parent": "612" }, { - "id": "515", + "id": "616", "name": "جراحی عروق", - "parent": "511" + "parent": "612" }, { - "id": "516", + "id": "617", "name": "جراحی ارتوپدی (استخوان و مفاصل)", - "parent": "511" + "parent": "612" }, { - "id": "517", + "id": "618", "name": "جراحی پلاستیک و ترمیمی", - "parent": "511" + "parent": "612" }, { - "id": "518", + "id": "619", "name": "جراحی چشم", - "parent": "511" + "parent": "612" }, { - "id": "519", + "id": "620", "name": "جراحی گوش، حلق و بینی (ENT)", - "parent": "511" + "parent": "612" }, { - "id": "520", + "id": "621", "name": "جراحی کودکان", - "parent": "511" + "parent": "612" }, { - "id": "521", + "id": "622", "name": "جراحی دستگاه گوارش", - "parent": "511" + "parent": "612" }, { - "id": "522", + "id": "623", "name": "جراحی توراکس (قفسه سینه)", - "parent": "511" + "parent": "612" }, { - "id": "523", + "id": "624", "name": "جراحی دست", - "parent": "511" + "parent": "612" }, { - "id": "524", + "id": "625", "name": "جراحی فک و صورت", - "parent": "511" + "parent": "612" }, { - "id": "525", + "id": "626", "name": "زنان و زایمان", "parent": null }, { - "id": "526", + "id": "627", "name": "اطفال (کودکان)", "parent": null }, { - "id": "527", + "id": "628", "name": "روانپزشکی", "parent": null }, { - "id": "528", + "id": "629", "name": "روانپزشکی عمومی", - "parent": "527" + "parent": "628" }, { - "id": "529", + "id": "630", "name": "روانپزشکی کودکان و نوجوانان", - "parent": "527" + "parent": "628" }, { - "id": "530", + "id": "631", "name": "روانپزشکی سالمندان", - "parent": "527" + "parent": "628" }, { - "id": "531", + "id": "632", "name": "پوست و مو (درماتولوژی)", "parent": null }, { - "id": "532", + "id": "633", "name": "چشم‌ پزشکی", "parent": null }, { - "id": "533", + "id": "634", "name": "گوش، حلق و بینی", "parent": null }, { - "id": "534", + "id": "635", "name": "اورولوژی (مجاری ادراری و تناسلی)", "parent": null }, { - "id": "535", + "id": "636", "name": "رادیولوژی", "parent": null }, { - "id": "536", + "id": "637", "name": "رادیولوژی تشخیصی", - "parent": "535" + "parent": "636" }, { - "id": "537", + "id": "638", "name": "رادیولوژی مداخله‌ای", - "parent": "535" + "parent": "636" }, { - "id": "538", + "id": "639", "name": "نوار قلب و الکتروفیزیولوژی", - "parent": "535" + "parent": "636" }, { - "id": "539", + "id": "640", "name": "پاتولوژی (آسیب‌شناسی)", "parent": null }, { - "id": "540", + "id": "641", "name": "انکولوژی (سرطان‌شناسی)", "parent": null }, { - "id": "541", + "id": "642", "name": "انکولوژی پزشکی", - "parent": "540" + "parent": "641" }, { - "id": "542", + "id": "643", "name": "انکولوژی رادیوتراپی", - "parent": "540" + "parent": "641" }, { - "id": "543", + "id": "644", "name": "طب فیزیکی و توانبخشی", "parent": null }, { - "id": "544", + "id": "645", "name": "دندانپزشکی", "parent": null }, { - "id": "545", + "id": "646", "name": "عمومی", - "parent": "544" + "parent": "645" }, { - "id": "546", + "id": "647", "name": "ارتودنسی", - "parent": "544" + "parent": "645" }, { - "id": "547", + "id": "648", "name": "جراحی فک و صورت", - "parent": "544" + "parent": "645" }, { - "id": "548", + "id": "649", "name": "پریودنتولوژی (بیماری‌های لثه)", - "parent": "544" + "parent": "645" }, { - "id": "549", + "id": "650", "name": "اندودنتولوژی (درمان ریشه)", - "parent": "544" + "parent": "645" }, { - "id": "550", + "id": "651", "name": "پروتز دندان", - "parent": "544" + "parent": "645" }, { - "id": "551", + "id": "652", "name": "دندانپزشکی کودکان", - "parent": "544" + "parent": "645" }, { - "id": "552", + "id": "653", "name": "طب اورژانس", "parent": null }, { - "id": "553", + "id": "654", "name": "پزشکی خانواده", "parent": null }, { - "id": "554", + "id": "655", "name": "طب ورزشی", "parent": null }, { - "id": "555", + "id": "656", "name": "پزشکی هسته‌ای", "parent": null }, { - "id": "556", + "id": "657", "name": "پزشکی قانونی", "parent": null }, { - "id": "557", + "id": "658", "name": "پزشکی اجتماعی", "parent": null }, { - "id": "558", + "id": "659", "name": "طب سالمندان", "parent": null }, { - "id": "559", + "id": "660", "name": "نوروسرجری (جراحی مغز و اعصاب)", "parent": null }, { - "id": "560", + "id": "661", "name": "پزشکی شغلی", "parent": null }, { - "id": "561", + "id": "662", "name": "اندوکرینولوژی (غدد درون‌ریز)", "parent": null }, { - "id": "562", + "id": "663", "name": "میکروبیولوژی و ویروس‌شناسی پزشکی", "parent": null }, { - "id": "563", + "id": "664", "name": "ایمونولوژی (سیستم ایمنی)", "parent": null }, { - "id": "564", + "id": "665", "name": "بیماری‌های عفونی", "parent": null }, { - "id": "565", + "id": "666", "name": "گوش، حلق و بینی", "parent": null }, { - "id": "566", + "id": "667", "name": "نورولوژی (عصبی)", "parent": null }, { - "id": "567", + "id": "668", "name": "پزشکی خواب", "parent": null }, { - "id": "568", + "id": "1500", "name": "سکته مغزی", "parent": null } diff --git a/data/state.json b/data/state.json index 3200021..97ada55 100644 --- a/data/state.json +++ b/data/state.json @@ -120,7 +120,7 @@ "name": "همدان" }, { - "id": "31", + "id": "100", "name": "یزد" } ]