pixelize-design-library 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,6 +34,7 @@ var Button_1 = __importDefault(require("../Button/Button"));
34
34
  var TextInput_1 = __importDefault(require("../Input/TextInput"));
35
35
  var useCustomTheme_1 = require("../../Theme/useCustomTheme");
36
36
  var FormLabel_1 = require("../Common/FormLabel");
37
+ var TimePicker_1 = __importDefault(require("./TimePicker"));
37
38
  var inferPickerTypeFromFormat = function (formatStr) {
38
39
  var lower = formatStr.toLowerCase();
39
40
  var hasTime = lower.includes("hh") || lower.includes("mm") || lower.includes("ss");
@@ -44,47 +45,26 @@ var inferPickerTypeFromFormat = function (formatStr) {
44
45
  return "time";
45
46
  return "date";
46
47
  };
47
- var TimeSelector = function (_a) {
48
- var date = _a.date, onChange = _a.onChange;
49
- var theme = (0, useCustomTheme_1.useCustomTheme)();
50
- var handleTimeChange = function (e) {
51
- var _a = e.target.value.split(":").map(Number), hours = _a[0], minutes = _a[1];
52
- var updated = new Date(date);
53
- updated.setHours(hours);
54
- updated.setMinutes(minutes);
55
- onChange(updated);
56
- };
57
- return (react_1.default.createElement("input", { type: "time", value: (0, date_fns_1.format)(date, "HH:mm"), onChange: handleTimeChange, style: {
58
- marginTop: "0.5rem",
59
- width: "100%",
60
- background: theme.colors.background[500],
61
- border: "0.063rem solid ".concat(theme.colors.primary[500]),
62
- borderRadius: "0.25rem",
63
- fontSize: "1rem",
64
- padding: "0.5rem",
65
- color: theme.colors.text[500],
66
- } }));
67
- };
68
48
  function CustomDatePicker(props) {
69
- var id = props.id, name = props.name, label = props.label, isRequired = props.isRequired, isInformation = props.isInformation, informationMessage = props.informationMessage, error = props.error, errorMessage = props.errorMessage, helperText = props.helperText, _a = props.placeholderText, placeholderText = _a === void 0 ? "Select a date" : _a, _b = props.dateFormat, dateFormat = _b === void 0 ? "dd/MM/yyyy" : _b, pickerType = props.pickerType, minDate = props.minDate, maxDate = props.maxDate, disableFutureDates = props.disableFutureDates, disablePastDates = props.disablePastDates, isRange = props.isRange, autocomplete = props.autocomplete, disabled = props.disabled;
49
+ var id = props.id, name = props.name, label = props.label, isRequired = props.isRequired, isInformation = props.isInformation, informationMessage = props.informationMessage, error = props.error, errorMessage = props.errorMessage, helperText = props.helperText, _a = props.placeholderText, placeholderText = _a === void 0 ? "Select a date" : _a, _b = props.dateFormat, dateFormat = _b === void 0 ? "dd/MM/yyyy" : _b, pickerType = props.pickerType, minDate = props.minDate, maxDate = props.maxDate, disableFutureDates = props.disableFutureDates, disablePastDates = props.disablePastDates, isRange = props.isRange, _c = props.autoComplete, autoComplete = _c === void 0 ? "off" : _c, disabled = props.disabled, _d = props.width, width = _d === void 0 ? "100%" : _d;
70
50
  var theme = (0, useCustomTheme_1.useCustomTheme)();
71
- var _c = (0, react_2.useDisclosure)(), isOpen = _c.isOpen, onOpen = _c.onOpen, onClose = _c.onClose;
51
+ var _e = (0, react_2.useDisclosure)(), isOpen = _e.isOpen, onOpen = _e.onOpen, onClose = _e.onClose;
72
52
  var resolvedPickerType = pickerType !== null && pickerType !== void 0 ? pickerType : inferPickerTypeFromFormat(dateFormat);
73
53
  var inputRef = (0, react_1.useRef)(null);
74
54
  var today = new Date();
75
55
  var showDate = resolvedPickerType === "date" || resolvedPickerType === "datetime";
76
56
  var showTime = resolvedPickerType === "time" || resolvedPickerType === "datetime";
77
57
  var selectedDate = !isRange ? props.selectedDate : null;
78
- var _d = (0, react_1.useState)(isRange ? new Date() : selectedDate !== null && selectedDate !== void 0 ? selectedDate : new Date()), currentMonth = _d[0], setCurrentMonth = _d[1];
79
- var _e = (0, react_1.useState)(null), rangeStart = _e[0], setRangeStart = _e[1];
80
- var _f = (0, react_1.useState)(null), rangeEnd = _f[0], setRangeEnd = _f[1];
81
- var _g = (0, react_1.useState)(true), selectingStart = _g[0], setSelectingStart = _g[1];
82
- var _h = (0, react_1.useState)(selectedDate !== null && selectedDate !== void 0 ? selectedDate : null), tempDate = _h[0], setTempDate = _h[1];
83
- var _j = (0, react_1.useState)(rangeStart), tempRangeStart = _j[0], setTempRangeStart = _j[1];
84
- var _k = (0, react_1.useState)(rangeEnd), tempRangeEnd = _k[0], setTempRangeEnd = _k[1];
58
+ var _f = (0, react_1.useState)(isRange ? new Date() : selectedDate !== null && selectedDate !== void 0 ? selectedDate : new Date()), currentMonth = _f[0], setCurrentMonth = _f[1];
59
+ var _g = (0, react_1.useState)(null), rangeStart = _g[0], setRangeStart = _g[1];
60
+ var _h = (0, react_1.useState)(null), rangeEnd = _h[0], setRangeEnd = _h[1];
61
+ var _j = (0, react_1.useState)(true), selectingStart = _j[0], setSelectingStart = _j[1];
62
+ var _k = (0, react_1.useState)(selectedDate !== null && selectedDate !== void 0 ? selectedDate : null), tempDate = _k[0], setTempDate = _k[1];
63
+ var _l = (0, react_1.useState)(rangeStart), tempRangeStart = _l[0], setTempRangeStart = _l[1];
64
+ var _m = (0, react_1.useState)(rangeEnd), tempRangeEnd = _m[0], setTempRangeEnd = _m[1];
85
65
  (0, react_1.useEffect)(function () {
86
- if (!isRange) {
87
- setTempDate(selectedDate !== null && selectedDate !== void 0 ? selectedDate : null);
66
+ if (!isRange && selectedDate instanceof Date) {
67
+ setTempDate(new Date(selectedDate)); // clone with full time
88
68
  }
89
69
  }, [selectedDate, isRange]);
90
70
  var handleDaySelect = function (day) {
@@ -104,7 +84,12 @@ function CustomDatePicker(props) {
104
84
  }
105
85
  }
106
86
  else {
107
- setTempDate(updated);
87
+ setTempDate(function (prev) {
88
+ if (!prev)
89
+ return updated;
90
+ var newDateWithTime = new Date(updated.getFullYear(), updated.getMonth(), updated.getDate(), prev.getHours(), prev.getMinutes(), prev.getSeconds());
91
+ return newDateWithTime;
92
+ });
108
93
  }
109
94
  };
110
95
  var renderDays = function () {
@@ -158,7 +143,7 @@ function CustomDatePicker(props) {
158
143
  : tempDate
159
144
  ? (0, date_fns_1.format)(tempDate, dateFormat)
160
145
  : "";
161
- return (react_1.default.createElement(react_2.FormControl, { isInvalid: error },
146
+ return (react_1.default.createElement(react_2.Box, { width: width, position: "relative" },
162
147
  label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, isRequired: isRequired, isInformation: isInformation, informationMessage: informationMessage })),
163
148
  react_1.default.createElement(react_2.Popover, { isLazy: true, isOpen: isOpen, onClose: onClose, placement: "bottom-start", modifiers: [
164
149
  {
@@ -178,7 +163,7 @@ function CustomDatePicker(props) {
178
163
  ] },
179
164
  react_1.default.createElement(react_2.PopoverTrigger, null,
180
165
  react_1.default.createElement(react_2.Box, { onClick: onOpen },
181
- react_1.default.createElement(TextInput_1.default, { id: id, name: name, ref: inputRef, placeholder: placeholderText, value: displayValue, isReadOnly: true, error: error, errorMessage: errorMessage, helperText: helperText, autoComplete: autocomplete, isDisabled: disabled }))),
166
+ react_1.default.createElement(TextInput_1.default, { id: id, name: name, ref: inputRef, placeholder: placeholderText, value: displayValue, isReadOnly: true, error: error, errorMessage: errorMessage, helperText: helperText, autoComplete: autoComplete, isDisabled: disabled, width: width }))),
182
167
  react_1.default.createElement(react_2.PopoverContent, { width: "auto", p: 2 },
183
168
  react_1.default.createElement(react_2.PopoverBody, null,
184
169
  showDate && (react_1.default.createElement(react_1.default.Fragment, null,
@@ -190,17 +175,21 @@ function CustomDatePicker(props) {
190
175
  react_1.default.createElement(lucide_react_1.ChevronRightIcon, null))),
191
176
  react_1.default.createElement(react_2.Grid, { templateColumns: "repeat(7, 1fr)", gap: 1, fontWeight: "bold", mb: 1 }, ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map(function (day) { return (react_1.default.createElement(react_2.Box, { textAlign: "center", key: day }, day)); })),
192
177
  renderDays())),
193
- !isRange && showTime && tempDate && (react_1.default.createElement(TimeSelector, { date: tempDate, onChange: setTempDate })),
178
+ !isRange && showTime && tempDate && (react_1.default.createElement(TimePicker_1.default, { date: tempDate, dateFormat: dateFormat, onChange: function (updatedDate) {
179
+ setTempDate(updatedDate);
180
+ props.onChange(updatedDate);
181
+ } })),
194
182
  react_1.default.createElement(react_2.Box, { display: "flex", justifyContent: "space-between", mt: 3 },
195
183
  react_1.default.createElement(Button_1.default, { size: "sm", variant: "ghost", onClick: function () {
196
- setTempDate(null);
184
+ var now = new Date();
185
+ setTempDate(now);
197
186
  setTempRangeStart(null);
198
187
  setTempRangeEnd(null);
199
188
  setRangeStart(null);
200
189
  setRangeEnd(null);
201
190
  setSelectingStart(true);
202
191
  props.onChange(null);
203
- onClose();
192
+ onOpen();
204
193
  } }, "Clear"),
205
194
  react_1.default.createElement(Button_1.default, { size: "sm", colorScheme: "primary", onClick: function () {
206
195
  if (isRange && tempRangeStart && tempRangeEnd) {
@@ -211,7 +200,7 @@ function CustomDatePicker(props) {
211
200
  else if (!isRange && tempDate) {
212
201
  props.onChange(tempDate);
213
202
  }
214
- onClose(); // Close popover after confirming
203
+ onClose();
215
204
  } }, "OK")))))));
216
205
  }
217
206
  exports.default = CustomDatePicker;
@@ -16,12 +16,13 @@ export interface BaseDatePickerProps {
16
16
  maxDate?: Date;
17
17
  disableFutureDates?: boolean;
18
18
  disablePastDates?: boolean;
19
- autocomplete?: string;
19
+ autoComplete?: string;
20
20
  disabled?: boolean;
21
+ width?: string | number;
21
22
  }
22
23
  export interface SingleDatePickerProps extends BaseDatePickerProps {
23
24
  isRange?: false;
24
- selectedDate: Date | null;
25
+ selectedDate?: Date | null;
25
26
  onChange: (date: Date | null) => void;
26
27
  }
27
28
  export interface RangeDatePickerProps extends BaseDatePickerProps {
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface TimePickerProps {
3
+ date: Date;
4
+ onChange: (date: Date) => void;
5
+ dateFormat: string;
6
+ }
7
+ declare const TimePicker: React.FC<TimePickerProps>;
8
+ export default TimePicker;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ var react_1 = __importStar(require("react"));
27
+ var padZero = function (num) { return (num < 10 ? "0".concat(num) : "".concat(num)); };
28
+ var TimePicker = function (_a) {
29
+ var date = _a.date, onChange = _a.onChange, dateFormat = _a.dateFormat;
30
+ var is12HourFormat = /(hh|h).*a/i.test(dateFormat);
31
+ var _b = (0, react_1.useState)(date.getHours()), hour = _b[0], setHour = _b[1];
32
+ var _c = (0, react_1.useState)(date.getMinutes()), minute = _c[0], setMinute = _c[1];
33
+ var ampm = is12HourFormat ? (hour >= 12 ? "PM" : "AM") : "";
34
+ (0, react_1.useEffect)(function () {
35
+ setHour(date.getHours());
36
+ setMinute(date.getMinutes());
37
+ }, [date]);
38
+ var convertTo24Hour = function (hr, meridiem) {
39
+ if (meridiem === "AM") {
40
+ return hr === 12 ? 0 : hr;
41
+ }
42
+ else {
43
+ return hr === 12 ? 12 : hr + 12;
44
+ }
45
+ };
46
+ var updateTime = function (hrInput, min, meridiem) {
47
+ var newHour = is12HourFormat ? convertTo24Hour(hrInput, meridiem || ampm) : hrInput;
48
+ var newDate = new Date(date);
49
+ newDate.setHours(newHour);
50
+ newDate.setMinutes(min);
51
+ newDate.setSeconds(0);
52
+ newDate.setMilliseconds(0);
53
+ onChange(newDate);
54
+ };
55
+ var handleHourChange = function (e) {
56
+ var hr = parseInt(e.target.value || "1", 10);
57
+ if (is12HourFormat) {
58
+ hr = Math.max(1, Math.min(12, hr));
59
+ updateTime(hr, minute, ampm);
60
+ }
61
+ else {
62
+ hr = Math.max(0, Math.min(23, hr));
63
+ updateTime(hr, minute);
64
+ }
65
+ setHour(hr);
66
+ };
67
+ var handleMinuteChange = function (e) {
68
+ var min = parseInt(e.target.value || "0", 10);
69
+ min = Math.max(0, Math.min(59, min));
70
+ setMinute(min);
71
+ updateTime(hour, min, ampm);
72
+ };
73
+ var handleAmpmToggle = function (e) {
74
+ e.preventDefault();
75
+ var newMeridiem = ampm === "AM" ? "PM" : "AM";
76
+ var displayHr = hour % 12 === 0 ? 12 : hour % 12;
77
+ var newHr = convertTo24Hour(displayHr, newMeridiem);
78
+ setHour(newHr);
79
+ updateTime(newHr, minute, newMeridiem);
80
+ };
81
+ var displayHour = is12HourFormat ? (hour % 12 === 0 ? 12 : hour % 12) : hour;
82
+ return (react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "1.25rem" } },
83
+ react_1.default.createElement("input", { type: "number", value: padZero(displayHour), onChange: handleHourChange, min: is12HourFormat ? 1 : 0, max: is12HourFormat ? 12 : 23, style: { width: "3rem", textAlign: "center" } }),
84
+ ":",
85
+ react_1.default.createElement("input", { type: "number", value: padZero(minute), onChange: handleMinuteChange, min: 0, max: 59, style: { width: "3rem", textAlign: "center" } }),
86
+ is12HourFormat && (react_1.default.createElement("button", { onClick: function () { return handleAmpmToggle; }, style: { fontWeight: "bold", padding: "0.25rem 0.5rem" } }, ampm))));
87
+ };
88
+ exports.default = TimePicker;
@@ -52,7 +52,7 @@ var DatePick = function () {
52
52
  };
53
53
  return (react_1.default.createElement("div", null,
54
54
  react_1.default.createElement("h2", null, "Single Date Picker"),
55
- react_1.default.createElement(DatePicker_1.default, { selectedDate: selectedDate, onChange: handleDateChange, dateFormat: "dd/MM/yyyy", pickerType: "date" }),
55
+ react_1.default.createElement(DatePicker_1.default, { selectedDate: selectedDate, onChange: handleDateChange, dateFormat: "HH:mm", pickerType: "time", width: "300px" }),
56
56
  react_1.default.createElement("br", null),
57
57
  react_1.default.createElement("h2", null, "Date Range Picker"),
58
58
  react_1.default.createElement(DatePicker_1.default, { isRange: true, dateFormat: "dd/MM/yyyy", pickerType: "datetime", onChange: handleDateChange })));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelize-design-library",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",