This is an automated email from the ASF dual-hosted git repository. ppawar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new 570dae218 ATLAS-5046: [React UI] Fix Duplicate Display Issues in Calendar: Month/Year and Time Selection (#365) 570dae218 is described below commit 570dae2181bc1c03e0fee0374d54d6445911553b Author: Brijesh Bhalala <32086209+brijesh...@users.noreply.github.com> AuthorDate: Fri Jun 6 13:15:21 2025 +0530 ATLAS-5046: [React UI] Fix Duplicate Display Issues in Calendar: Month/Year and Time Selection (#365) --- dashboard/package-lock.json | 85 ++------------- dashboard/package.json | 3 +- .../src/components/DatePicker/CustomDatePicker.tsx | 41 +++++++ .../src/components/DatePicker/CustomHeader.tsx | 118 +++++++++++++++++++++ dashboard/src/components/Forms/FormDatepicker.tsx | 8 +- .../TagFilters/TagCustomValueEditor.tsx | 23 ++-- .../TypeFilters/TypeCustomValueEditor.tsx | 54 ++-------- .../src/components/ShowMore/DrawerBodyChipView.tsx | 2 +- dashboard/src/index.scss | 8 +- dashboard/src/styles/customdatepPicker.scss | 38 +++++++ .../Audits/AuditsFilter/AuditFilters.tsx | 32 ++++-- .../src/views/Classification/AddValidityPeriod.tsx | 28 ++--- .../PropertiesTab/BMAttributesFields.tsx | 14 +-- 13 files changed, 270 insertions(+), 184 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 6b0e58a96..616bf9a3d 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -15,7 +15,6 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.15.13", "@mui/material": "^5.15.13", - "@mui/x-date-pickers": "^7.16.0", "@mui/x-tree-view": "^7.0.0", "@react-querybuilder/material": "^8.0.0", "@reduxjs/toolkit": "^2.2.6", @@ -33,7 +32,7 @@ "moment-timezone": "^0.5.45", "platform": "^1.3.4", "react": "^18.3.1", - "react-datepicker": "^7.5.0", + "react-datepicker": "^8.4.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-hook-form": "^7.53.0", @@ -1754,72 +1753,6 @@ } } }, - "node_modules/@mui/x-date-pickers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.2.tgz", - "integrity": "sha512-GRbLE31bBktJptittYk5L5SdwOOcDdVAIrXfyYYQ6xq8CR69Sbi/y6WkSDL+FDuymM/UQa7f5UmHb6r81aDVWA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", - "@mui/x-internals": "7.29.0", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", - "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2 || ^3.0.0", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } - } - }, "node_modules/@mui/x-internals": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz", @@ -5269,9 +5202,9 @@ } }, "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", "funding": { "type": "github", @@ -9076,14 +9009,14 @@ } }, "node_modules/react-datepicker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.6.0.tgz", - "integrity": "sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.4.0.tgz", + "integrity": "sha512-6nPDnj8vektWCIOy9ArS3avus9Ndsyz5XgFCJ7nBxXASSpBdSL6lG9jzNNmViPOAOPh6T5oJyGaXuMirBLECag==", "license": "MIT", "dependencies": { - "@floating-ui/react": "^0.27.0", + "@floating-ui/react": "^0.27.3", "clsx": "^2.1.1", - "date-fns": "^3.6.0" + "date-fns": "^4.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", diff --git a/dashboard/package.json b/dashboard/package.json index e01b11683..e452e7d1c 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -17,7 +17,6 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.15.13", "@mui/material": "^5.15.13", - "@mui/x-date-pickers": "^7.16.0", "@mui/x-tree-view": "^7.0.0", "@react-querybuilder/material": "^8.0.0", "@reduxjs/toolkit": "^2.2.6", @@ -35,7 +34,7 @@ "moment-timezone": "^0.5.45", "platform": "^1.3.4", "react": "^18.3.1", - "react-datepicker": "^7.5.0", + "react-datepicker": "^8.4.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-hook-form": "^7.53.0", diff --git a/dashboard/src/components/DatePicker/CustomDatePicker.tsx b/dashboard/src/components/DatePicker/CustomDatePicker.tsx new file mode 100644 index 000000000..8409660cb --- /dev/null +++ b/dashboard/src/components/DatePicker/CustomDatePicker.tsx @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import CustomHeader from "./CustomHeader"; + +const CustomDatepicker = (props: { + [x: string]: any; + selected?: any; + onChange?: any; +}) => { + const { selected, onChange, ...rest } = props; + + return ( + <DatePicker + selected={selected} + onChange={onChange} + timeInputLabel="" + renderCustomHeader={(headerProps) => <CustomHeader {...headerProps} />} + dateFormat="MM/dd/yyyy h:mm:ss aa" + {...rest} + /> + ); +}; + +export default CustomDatepicker; diff --git a/dashboard/src/components/DatePicker/CustomHeader.tsx b/dashboard/src/components/DatePicker/CustomHeader.tsx new file mode 100644 index 000000000..2fd6d0025 --- /dev/null +++ b/dashboard/src/components/DatePicker/CustomHeader.tsx @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FormControl, IconButton, NativeSelect, Stack } from "@mui/material"; +import { getYear, getMonth } from "date-fns"; +import ArrowBackIosIcon from "@mui/icons-material/ArrowBackIos"; +import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos"; + +const years = Array.from( + { length: 100 }, + (_, i) => new Date().getFullYear() - 50 + i +); +const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" +]; + +type CustomHeaderProps = { + date: Date; + changeYear: (year: number) => void; + changeMonth: (month: number) => void; + decreaseMonth: () => void; + increaseMonth: () => void; + prevMonthButtonDisabled: boolean; + nextMonthButtonDisabled: boolean; +}; + +const CustomHeader = ({ + date, + changeYear, + changeMonth, + decreaseMonth, + increaseMonth, + prevMonthButtonDisabled, + nextMonthButtonDisabled +}: CustomHeaderProps) => { + return ( + <Stack + direction="row" + spacing={1} + alignItems="center" + justifyContent="center" + sx={{ margin: 1 }} + > + <IconButton + size="small" + onClick={decreaseMonth} + disabled={prevMonthButtonDisabled} + > + <ArrowBackIosIcon fontSize="inherit" /> + </IconButton> + <Stack minWidth={"60px"}> + <FormControl fullWidth> + <NativeSelect + value={getYear(date)} + onChange={({ target: { value } }) => changeYear(parseInt(value))} + > + {" "} + {years.map((year) => ( + <option className="text-center" key={year} value={year}> + {year} + </option> + ))} + </NativeSelect> + </FormControl> + </Stack> + + <FormControl fullWidth> + <NativeSelect + value={months[getMonth(date)]} + onChange={({ target: { value } }) => + changeMonth(months.indexOf(value)) + } + > + {months.map((month) => ( + <option className="text-center" key={month} value={month}> + {month} + </option> + ))} + </NativeSelect> + </FormControl> + + <IconButton + size="small" + onClick={increaseMonth} + disabled={nextMonthButtonDisabled} + > + <ArrowForwardIosIcon fontSize="inherit" /> + </IconButton> + </Stack> + ); +}; + +export default CustomHeader; diff --git a/dashboard/src/components/Forms/FormDatepicker.tsx b/dashboard/src/components/Forms/FormDatepicker.tsx index 20338d541..eae6882c2 100644 --- a/dashboard/src/components/Forms/FormDatepicker.tsx +++ b/dashboard/src/components/Forms/FormDatepicker.tsx @@ -21,7 +21,7 @@ import { Controller } from "react-hook-form"; import { LightTooltip } from "@components/muiComponents"; import moment from "moment-timezone"; import { useEffect, useState } from "react"; -import DatePicker from "react-datepicker"; +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; const FormDatepicker = ({ data, control, fieldName }: any) => { const { name, isOptional, typeName } = data; @@ -71,17 +71,15 @@ const FormDatepicker = ({ data, control, fieldName }: any) => { </LightTooltip> </div> <div className="w-100"> - <DatePicker + <CustomDatepicker showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown selected={ value && moment(value).isValid() ? moment(value).toDate() : moment().toDate() } - onChange={(date) => { + onChange={(date: { getTime: () => any }) => { onChange(date ? date.getTime() : null); }} ref={ref} diff --git a/dashboard/src/components/QueryBuilder/TagFilters/TagCustomValueEditor.tsx b/dashboard/src/components/QueryBuilder/TagFilters/TagCustomValueEditor.tsx index 720abbd00..3b1805771 100644 --- a/dashboard/src/components/QueryBuilder/TagFilters/TagCustomValueEditor.tsx +++ b/dashboard/src/components/QueryBuilder/TagFilters/TagCustomValueEditor.tsx @@ -15,6 +15,7 @@ * limitations under the License. */ +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; import { useAppSelector } from "@hooks/reducerHook"; import { Autocomplete, TextField } from "@mui/material"; @@ -22,7 +23,6 @@ import { timeRangeOptions } from "@utils/Enum"; import { isEmpty } from "@utils/Utils"; import moment from "moment"; import { useState } from "react"; -import DatePicker from "react-datepicker"; import { ValueEditorProps, ValueEditor } from "react-querybuilder"; export const TagCustomValueEditor = (props: ValueEditorProps) => { @@ -117,16 +117,13 @@ export const TagCustomValueEditor = (props: ValueEditorProps) => { ))} </select> {showDatePicker && ( - <DatePicker + <CustomDatepicker selectsRange - showTimeSelect timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown startDate={ moment(startDate).isValid() ? moment(startDate).toDate() @@ -153,22 +150,18 @@ export const TagCustomValueEditor = (props: ValueEditorProps) => { } if (props.inputType == "datetime-local") { + if (!selectedDateValue) { + const now = moment(); + setSelectedDateValue(now); + props.handleOnChange(now.valueOf()); + } return ( - <DatePicker - showTimeSelect + <CustomDatepicker timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown - startDate={ - moment(startDate).isValid() ? moment(startDate).toDate() : undefined - } - endDate={ - moment(endDate).isValid() ? moment(endDate).toDate() : undefined - } selected={ selectedDateValue && moment(selectedDateValue).isValid() ? moment(selectedDateValue).toDate() diff --git a/dashboard/src/components/QueryBuilder/TypeFilters/TypeCustomValueEditor.tsx b/dashboard/src/components/QueryBuilder/TypeFilters/TypeCustomValueEditor.tsx index 2dcd00245..b50bc2925 100644 --- a/dashboard/src/components/QueryBuilder/TypeFilters/TypeCustomValueEditor.tsx +++ b/dashboard/src/components/QueryBuilder/TypeFilters/TypeCustomValueEditor.tsx @@ -15,13 +15,13 @@ * limitations under the License. */ +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; import { useAppSelector } from "@hooks/reducerHook"; import { Autocomplete, TextField } from "@mui/material"; import { timeRangeOptions } from "@utils/Enum"; import { isEmpty } from "@utils/Utils"; import moment from "moment"; import { useState } from "react"; -import DatePicker from "react-datepicker"; import { ValueEditorProps, ValueEditor } from "react-querybuilder"; export const TypeCustomValueEditor = (props: ValueEditorProps) => { @@ -155,13 +155,14 @@ export const TypeCustomValueEditor = (props: ValueEditorProps) => { ))} </select> {showDatePicker && ( - <DatePicker + <CustomDatepicker selectsRange - showTimeSelect + timeIntervals={1} + timeFormat="hh:mm aa" + timeCaption="Time" + shoowTimeInput showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown startDate={ moment(startDate).isValid() ? moment(startDate).toDate() @@ -184,6 +185,7 @@ export const TypeCustomValueEditor = (props: ValueEditorProps) => { props.handleOnChange(""); } }} + selected={undefined} /> )} </div> @@ -197,15 +199,12 @@ export const TypeCustomValueEditor = (props: ValueEditorProps) => { props.handleOnChange(now.valueOf()); } return ( - <DatePicker - showTimeSelect + <CustomDatepicker timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown selected={ selectedDateValue && moment(selectedDateValue).isValid() ? moment(selectedDateValue).toDate() @@ -222,42 +221,5 @@ export const TypeCustomValueEditor = (props: ValueEditorProps) => { ); } - if (props.inputType == "datetime-local") { - if (selectedDateValue) { - const now = moment(); - setSelectedDateValue(now); - props.handleOnChange(now.toISOString()); - } - return ( - <DatePicker - showTimeSelect - timeIntervals={1} - timeFormat="hh:mm aa" - timeCaption="Time" - showPopperArrow={false} - popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown - startDate={ - moment(startDate).isValid() ? moment(startDate).toDate() : undefined - } - endDate={ - moment(endDate).isValid() ? moment(endDate).toDate() : undefined - } - selected={ - selectedDateValue && moment(selectedDateValue).isValid() - ? moment(selectedDateValue).toDate() - : moment().toDate() - } - onChange={(date: Date | null) => { - const value = date ? moment(date) : moment(); - setSelectedDateValue(value); - props.handleOnChange(value.valueOf()); - }} - dateFormat="MM/dd/yyyy h:mm:ss aa" - showTimeInput - /> - ); - } return <ValueEditor {...props} />; }; diff --git a/dashboard/src/components/ShowMore/DrawerBodyChipView.tsx b/dashboard/src/components/ShowMore/DrawerBodyChipView.tsx index 23ed21060..df40faf6b 100644 --- a/dashboard/src/components/ShowMore/DrawerBodyChipView.tsx +++ b/dashboard/src/components/ShowMore/DrawerBodyChipView.tsx @@ -25,7 +25,7 @@ import IconButton from "@mui/material/IconButton"; import Stack from "@mui/material/Stack"; import Chip from "@mui/material/Chip"; import Typography from "@mui/material/Typography"; -import { ClearIcon } from "@mui/x-date-pickers/icons"; +import ClearIcon from "@mui/icons-material/Clear"; import { fetchDetailPageData } from "@redux/slice/detailPageSlice"; import { fetchGlossaryDetails } from "@redux/slice/glossaryDetailsSlice"; import { fetchGlossaryData } from "@redux/slice/glossarySlice"; diff --git a/dashboard/src/index.scss b/dashboard/src/index.scss index edb0a7bae..9c7cfd0a5 100644 --- a/dashboard/src/index.scss +++ b/dashboard/src/index.scss @@ -33,12 +33,8 @@ @use "@styles/stats.scss" as *; @use "@styles/filters.scss" as *; @use "@styles/errorPage.scss" as *; - -// body { -// margin: 0; -// padding: 0; -// box-sizing: border-box; -// } +@use "@styles/errorPage.scss" as *; +@use "@styles/customdatepPicker.scss" as *; @font-face { font-family: "Source Sans 3"; diff --git a/dashboard/src/styles/customdatepPicker.scss b/dashboard/src/styles/customdatepPicker.scss new file mode 100644 index 000000000..a3ef5bae1 --- /dev/null +++ b/dashboard/src/styles/customdatepPicker.scss @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.react-datepicker__month-container { + width: 100% !important; +} +.react-datepicker__input-time-container { + width: 100% !important; + margin: 0 0 10px 0 !important; + display: flex !important; + flex-direction: column !important; + align-items: center; +} + +.react-datepicker__input-time-container + .react-datepicker-time__input-container + .react-datepicker-time__input { + margin: 0 !important; +} + +.custom-time-input svg { + width: 0.875em !important; + height: 0.875em !important; +} diff --git a/dashboard/src/views/Administrator/Audits/AuditsFilter/AuditFilters.tsx b/dashboard/src/views/Administrator/Audits/AuditsFilter/AuditFilters.tsx index 036d6ffb6..0248b5292 100644 --- a/dashboard/src/views/Administrator/Audits/AuditsFilter/AuditFilters.tsx +++ b/dashboard/src/views/Administrator/Audits/AuditsFilter/AuditFilters.tsx @@ -44,6 +44,7 @@ import { GlobalQueryState, isEmpty } from "@utils/Utils"; import { attributeFilter } from "@utils/CommonViewFunction"; import { cloneDeep } from "@utils/Helper"; import { timeRangeOptions } from "@utils/Enum"; +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; const customOperators: Operator[] = [ ...defaultOperators, @@ -80,6 +81,7 @@ const CustomValueEditor: React.FC<ValueEditorProps> = (props) => { return ( <div> <select + className="rule-operators" value={value} onChange={(e) => handleTimeRangeChange(e.target.value)} > @@ -91,13 +93,14 @@ const CustomValueEditor: React.FC<ValueEditorProps> = (props) => { ))} </select> {showDatePicker && ( - <DatePicker + <CustomDatepicker selectsRange - showTimeSelect + timeIntervals={1} + timeFormat="hh:mm aa" + timeCaption="Time" + shoowTimeInput showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown startDate={ moment(startDate).isValid() ? moment(startDate).toDate() @@ -107,10 +110,20 @@ const CustomValueEditor: React.FC<ValueEditorProps> = (props) => { moment(endDate).isValid() ? moment(endDate).toDate() : undefined } onChange={(update: [Date | null, Date | null] | null) => { - setDateRange(update); - props.handleOnChange(update).join(","); + const safeUpdate: [Date | null, Date | null] = update ?? [ + null, + null + ]; + setDateRange(safeUpdate); + if (safeUpdate[0] && safeUpdate[1]) { + const startEpoch = moment(safeUpdate[0]).valueOf(); + const endEpoch = moment(safeUpdate[1]).valueOf(); + props.handleOnChange(`${startEpoch},${endEpoch}`); + } else { + props.handleOnChange(""); + } }} - isClearable={true} + selected={undefined} /> )} </div> @@ -119,15 +132,12 @@ const CustomValueEditor: React.FC<ValueEditorProps> = (props) => { if (props.inputType == "datetime-local") { return ( - <DatePicker - showTimeSelect + <CustomDatepicker timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown selected={ selectedDateValue && moment(selectedDateValue).isValid() ? moment(selectedDateValue).toDate() diff --git a/dashboard/src/views/Classification/AddValidityPeriod.tsx b/dashboard/src/views/Classification/AddValidityPeriod.tsx index 5aa227cf6..5e3a41fab 100644 --- a/dashboard/src/views/Classification/AddValidityPeriod.tsx +++ b/dashboard/src/views/Classification/AddValidityPeriod.tsx @@ -30,10 +30,10 @@ import AddIcon from "@mui/icons-material/Add"; import moment from "moment"; import ClearOutlinedIcon from "@mui/icons-material/ClearOutlined"; import { useAppSelector } from "@hooks/reducerHook"; -import DatePicker from "react-datepicker"; // Start Date Picker Component import { Control } from "react-hook-form"; +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; interface StartDatePickerProps { control: Control<any>; @@ -48,18 +48,19 @@ const StartDatePicker = ({ control, name }: StartDatePickerProps) => ( render={({ field: { onChange, value, ref } }) => ( <Stack minWidth={210}> <InputLabel required={true}>Start Time</InputLabel> - <DatePicker - showTimeSelect + <CustomDatepicker timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown - selected={value ? moment(value).toDate() : null} + selected={ + value && moment(value).isValid() + ? moment(value).toDate() + : moment().toDate() + } ref={ref} - onChange={(date) => { + onChange={(date: { toISOString: () => any }) => { onChange(date ? date.toISOString() : null); }} showTimeInput @@ -84,18 +85,19 @@ const EndDatePicker = ({ control, name }: EndDatePickerProps) => ( render={({ field: { onChange, value, ref } }) => ( <Stack minWidth={210}> <InputLabel required={true}>End Time</InputLabel> - <DatePicker - showTimeSelect + <CustomDatepicker timeIntervals={1} timeFormat="hh:mm aa" timeCaption="Time" showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown - selected={value ? moment(value).toDate() : null} + selected={ + value && moment(value).isValid() + ? moment(value).toDate() + : moment().toDate() + } ref={ref} - onChange={(date) => { + onChange={(date: { toISOString: () => any }) => { onChange(date ? date.toISOString() : null); }} showTimeInput diff --git a/dashboard/src/views/DetailPage/EntityDetailTabs/PropertiesTab/BMAttributesFields.tsx b/dashboard/src/views/DetailPage/EntityDetailTabs/PropertiesTab/BMAttributesFields.tsx index 99dc5c0fd..ad5852095 100644 --- a/dashboard/src/views/DetailPage/EntityDetailTabs/PropertiesTab/BMAttributesFields.tsx +++ b/dashboard/src/views/DetailPage/EntityDetailTabs/PropertiesTab/BMAttributesFields.tsx @@ -15,6 +15,7 @@ * limitations under the License. */ +import CustomDatepicker from "@components/DatePicker/CustomDatePicker"; import { useAppSelector } from "@hooks/reducerHook"; import { Select, @@ -27,7 +28,6 @@ import { } from "@mui/material"; import { isEmpty } from "@utils/Utils"; import moment from "moment"; -import DatePicker from "react-datepicker"; import { Controller } from "react-hook-form"; import ReactQuill from "react-quill-new"; @@ -79,35 +79,31 @@ const BMAttributesFields = ({ obj, control, index }: any) => { } return typeName === "date" ? ( - <DatePicker + <CustomDatepicker showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown selected={ value && moment(value).isValid() ? moment(value).toDate() : moment().toDate() } - onChange={(date) => { + onChange={(date: { getTime: () => any }) => { onChange(date ? date.getTime() : null); }} ref={ref} dateFormat="MM/dd/yyyy" /> ) : ( - <DatePicker + <CustomDatepicker showPopperArrow={false} popperProps={{ strategy: "fixed" }} - showYearDropdown - showMonthDropdown selectsMultiple selectedDates={ Array.isArray(value) ? value.map((d: string | number | Date) => new Date(d)) : [] } - onChange={(dates) => { + onChange={(dates: any[]) => { onChange( Array.isArray(dates) ? dates.map((date) => date.getTime())