Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

347 рядки
15 KiB

  1. // material-ui
  2. import {
  3. Button,
  4. Grid, TextField,
  5. Autocomplete,
  6. Typography
  7. } from '@mui/material';
  8. import MainCard from "components/MainCard";
  9. import { useForm } from "react-hook-form";
  10. import * as React from "react";
  11. import * as ComboData from "utils/ComboData";
  12. import * as DateUtils from "utils/DateUtils";
  13. import * as FormatUtils from "utils/FormatUtils";
  14. import {PNSPS_BUTTON_THEME} from "../../../themes/buttonConst";
  15. import {ThemeProvider} from "@emotion/react";
  16. import { useIntl } from "react-intl";
  17. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  18. const SearchDemandNoteForm = ({ applySearch, orgComboData, searchCriteria, issueComboData
  19. }) => {
  20. const [type, setType] = React.useState([]);
  21. const [orgSelected, setOrgSelected] = React.useState({});
  22. const [orgCombo, setOrgCombo] = React.useState();
  23. const [issueSelected, setIssueSelected] = React.useState({});
  24. const [issueCombo, setIssueCombo] = React.useState([]);
  25. const [selectedStatus, setSelectedStatus] = React.useState(ComboData.denmandNoteStatus[0]);
  26. const [minDate, setMinDate] = React.useState(searchCriteria.dateFrom);
  27. const [maxDate, setMaxDate] = React.useState(searchCriteria.dateTo);
  28. const [minDueDate, setMinDueDate] = React.useState(searchCriteria.dueDateFrom);
  29. const [maxDueDate, setMaxDueDate] = React.useState(searchCriteria.dueDateTo);
  30. const intl = useIntl();
  31. const { locale } = intl;
  32. const { reset, register, handleSubmit } = useForm()
  33. const onSubmit = (data) => {
  34. data.status = selectedStatus?.type;
  35. let typeArray = [];
  36. for (let i = 0; i < type.length; i++) {
  37. typeArray.push(type[i].label);
  38. }
  39. const temp = {
  40. appNo: data.appNo,
  41. issueId: issueSelected?.id,
  42. orgId: (orgSelected?.key && orgSelected?.key > 0) ? orgSelected?.key : "",
  43. dnNo: data.dnNo,
  44. dateFrom: data.dateFrom,
  45. dateTo: data.dateTo,
  46. dueDateFrom: data.dueDateFrom,
  47. dueDateTo: data.dueDateTo,
  48. status: (data?.status === '' || data?.status?.includes("all")) ? "" : data.status,
  49. };
  50. applySearch(temp);
  51. };
  52. React.useEffect(() => {
  53. if (orgComboData && orgComboData.length > 0) {
  54. setOrgCombo(orgComboData);
  55. }
  56. }, [orgComboData]);
  57. React.useEffect(() => {
  58. if (issueComboData && issueComboData.length > 0) {
  59. setIssueCombo(issueComboData);
  60. }
  61. }, [issueComboData]);
  62. function resetForm() {
  63. setType([]);
  64. setOrgSelected({});
  65. setIssueSelected({});
  66. setSelectedStatus(ComboData.denmandNoteStatus[0]);
  67. reset();
  68. }
  69. function getIssueLabel(data) {
  70. let issueYear = data.issueYear
  71. let volume = data.volume;
  72. let issueNo = data.issueNo;
  73. let issueDate = data.issueDate;
  74. if (locale === 'zh-HK') {
  75. return issueYear
  76. + " 第" + volume + "卷,"
  77. + " 第" + issueNo + "期,"
  78. + " " + DateUtils.dateFormat(issueDate, "YYYY年MM月DD日")
  79. + " (" + DateUtils.getWeekdayStr_ZH(issueDate) + ")";
  80. } else if (locale === 'zh-CN') {
  81. return issueYear
  82. + " 第" + volume + "卷,"
  83. + " 第" + issueNo + "期,"
  84. + " " + DateUtils.dateFormat(issueDate, "YYYY年MM月DD日")
  85. + " (" + DateUtils.getWeekdayStr_CN(issueDate) + ")";
  86. }
  87. return issueYear
  88. + " Vol. " + FormatUtils.zeroPad(volume, 3)
  89. + ", No. " + FormatUtils.zeroPad(issueNo, 2)
  90. + ", " + DateUtils.dateFormat(issueDate, "D MMM YYYY (ddd)");
  91. }
  92. return (
  93. <MainCard xs={12} md={12} lg={12}
  94. border={false}
  95. content={false}
  96. sx={{ backgroundColor: '#fff' }}
  97. >
  98. <form onSubmit={handleSubmit(onSubmit)}>
  99. <Grid container sx={{ backgroundColor: '#ffffff', ml: 2, mt: 1 }} width="98%">
  100. {/*row 1*/}
  101. <Grid item justifyContent="space-between" alignItems="center" sx={{mt:1, ml:3,mb:2.5}}>
  102. <Typography variant="pnspsFormHeader" >
  103. Search
  104. </Typography>
  105. </Grid>
  106. {/*row 2*/}
  107. <Grid container display="flex" alignItems={"center"}>
  108. <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}>
  109. <Autocomplete
  110. {...register("issueId")}
  111. disablePortal
  112. id="issueId"
  113. size="small"
  114. options={issueCombo}
  115. value={issueSelected}
  116. inputValue={(issueSelected?.id) ? getIssueLabel(issueSelected) : ""}
  117. getOptionLabel={(option) => getIssueLabel(option)}
  118. onChange={(event, newValue) => {
  119. setIssueSelected(newValue);
  120. }}
  121. renderInput={(params) => (
  122. <TextField {...params}
  123. label="Gazette Issue No."
  124. InputLabelProps={{
  125. shrink: true
  126. }}
  127. />
  128. )}
  129. />
  130. </Grid>
  131. <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}>
  132. <TextField
  133. fullWidth
  134. {...register("appNo")}
  135. id='appNo'
  136. label={"Application No."}
  137. defaultValue={searchCriteria.appNo}
  138. InputLabelProps={{
  139. shrink: true
  140. }}
  141. />
  142. </Grid>
  143. {
  144. orgCombo ?
  145. <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}>
  146. <Autocomplete
  147. {...register("orgId")}
  148. disablePortal
  149. id="orgId"
  150. size="small"
  151. options={orgCombo}
  152. value={orgSelected}
  153. inputValue={(orgSelected?.label) ? orgSelected?.label : ""}
  154. onChange={(event, newValue) => {
  155. setOrgSelected(newValue);
  156. }}
  157. renderInput={(params) => (
  158. <TextField {...params}
  159. label="BR No./ Organisation"
  160. InputLabelProps={{
  161. shrink: true
  162. }}
  163. />
  164. )}
  165. />
  166. </Grid>
  167. : <></>
  168. }
  169. <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}>
  170. <TextField
  171. fullWidth
  172. {...register("dnNo")}
  173. id='dnNo'
  174. label="DN No."
  175. defaultValue={searchCriteria.dnNo}
  176. InputLabelProps={{
  177. shrink: true
  178. }}
  179. />
  180. </Grid>
  181. <Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
  182. <Grid container spacing={1}>
  183. <Grid item xs={6}>
  184. <TextField
  185. fullWidth
  186. {...register("dateFrom")}
  187. id="dateFrom"
  188. type="date"
  189. label={"Issue Date(From)"}
  190. defaultValue={searchCriteria.dateFrom}
  191. InputProps={{ inputProps: { max: maxDate } }}
  192. onChange={(newValue) => {
  193. setMinDate(DateUtils.dateValue(newValue));
  194. }}
  195. InputLabelProps={{
  196. shrink: true
  197. }}
  198. />
  199. </Grid>
  200. <Grid item xs={6}>
  201. <TextField
  202. fullWidth
  203. InputLabelProps={{
  204. shrink: true
  205. }}
  206. {...register("dateTo")}
  207. InputProps={{ inputProps: { min: minDate } }}
  208. onChange={(newValue) => {
  209. setMaxDate(DateUtils.dateValue(newValue));
  210. }}
  211. id="dateTo"
  212. type="date"
  213. label={"Issue Date (To)"}
  214. defaultValue={searchCriteria.dateTo}
  215. />
  216. </Grid>
  217. </Grid>
  218. </Grid>
  219. <Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
  220. <Grid container spacing={1}>
  221. <Grid item xs={6}>
  222. <TextField
  223. fullWidth
  224. {...register("dueDateFrom")}
  225. id="dueDateFrom"
  226. type="date"
  227. label={"Due Date (From)"}
  228. defaultValue={searchCriteria.dueDateFrom}
  229. InputProps={{ inputProps: { max: maxDueDate } }}
  230. onChange={(newValue) => {
  231. setMinDueDate(DateUtils.dateValue(newValue));
  232. }}
  233. InputLabelProps={{
  234. shrink: true
  235. }}
  236. />
  237. </Grid>
  238. <Grid item xs={6}>
  239. <TextField
  240. fullWidth
  241. InputLabelProps={{
  242. shrink: true
  243. }}
  244. {...register("dueDateTo")}
  245. InputProps={{ inputProps: { min: minDueDate } }}
  246. onChange={(newValue) => {
  247. setMaxDueDate(DateUtils.dateValue(newValue));
  248. }}
  249. id="dueDateTo"
  250. type="date"
  251. label={"Due Date (To)"}
  252. defaultValue={searchCriteria.dueDateTo}
  253. />
  254. </Grid>
  255. </Grid>
  256. </Grid>
  257. <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}>
  258. <Autocomplete
  259. size="small"
  260. {...register("status")}
  261. id="status"
  262. options={ComboData.denmandNoteStatus}
  263. value={selectedStatus}
  264. onChange={(event, newValue) => {
  265. if(newValue==null){
  266. setSelectedStatus(ComboData.denmandNoteStatus[0]);
  267. }else{
  268. setSelectedStatus(newValue);
  269. }
  270. }}
  271. getOptionLabel={(option) => option.label}
  272. renderInput={(params) => (
  273. <TextField
  274. {...params}
  275. label="Status"
  276. InputLabelProps={{
  277. shrink: true
  278. }}
  279. />
  280. )}
  281. />
  282. </Grid>
  283. </Grid>
  284. {/*last row*/}
  285. <Grid container maxWidth justifyContent="flex-end">
  286. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  287. <Grid item sx={{ ml: 3, mb:3 }}>
  288. <Button
  289. variant="contained"
  290. color="cancel"
  291. onClick={resetForm}
  292. >
  293. Reset
  294. </Button>
  295. </Grid>
  296. <Grid item sx={{ ml: 3, mr: 3, mb:3}}>
  297. <Button
  298. variant="contained"
  299. type="submit"
  300. >
  301. Submit
  302. </Button>
  303. </Grid>
  304. </ThemeProvider>
  305. </Grid>
  306. </Grid>
  307. </form>
  308. </MainCard>
  309. );
  310. };
  311. export default SearchDemandNoteForm;