@egov3/system-design 1.3.124 → 1.3.126

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.
Files changed (47) hide show
  1. package/dist/cjs/baseComponents/Modal/Modal.module.css.js +1 -1
  2. package/dist/cjs/components/Calendar/Body/CalendarBody.module.css.js +2 -2
  3. package/dist/cjs/components/Calendar/Body/index.js +17 -13
  4. package/dist/cjs/components/Calendar/Body/index.js.map +1 -1
  5. package/dist/cjs/components/Calendar/Calendar.module.css.js +22 -0
  6. package/dist/cjs/components/Calendar/Calendar.module.css.js.map +1 -0
  7. package/dist/cjs/components/Calendar/Header/CalendarHeader.module.css.js +2 -2
  8. package/dist/cjs/components/Calendar/Header/index.js +16 -11
  9. package/dist/cjs/components/Calendar/Header/index.js.map +1 -1
  10. package/dist/cjs/components/Calendar/index.js +68 -34
  11. package/dist/cjs/components/Calendar/index.js.map +1 -1
  12. package/dist/cjs/constants/i18n/Calendar.js +42 -0
  13. package/dist/cjs/constants/i18n/Calendar.js.map +1 -0
  14. package/dist/cjs/constants/i18n/index.js +2 -0
  15. package/dist/cjs/constants/i18n/index.js.map +1 -1
  16. package/dist/cjs/customHooks/useCalendar.js +47 -32
  17. package/dist/cjs/customHooks/useCalendar.js.map +1 -1
  18. package/dist/cjs/utils/calendar.js +64 -0
  19. package/dist/cjs/utils/calendar.js.map +1 -0
  20. package/dist/cjs/utils/date/getMonthNameProper.js +27 -2
  21. package/dist/cjs/utils/date/getMonthNameProper.js.map +1 -1
  22. package/dist/esm/baseComponents/Modal/Modal.module.css.js +1 -1
  23. package/dist/esm/components/Calendar/Body/CalendarBody.module.css.js +2 -2
  24. package/dist/esm/components/Calendar/Body/index.js +16 -12
  25. package/dist/esm/components/Calendar/Body/index.js.map +1 -1
  26. package/dist/esm/components/Calendar/Calendar.module.css.js +18 -0
  27. package/dist/esm/components/Calendar/Calendar.module.css.js.map +1 -0
  28. package/dist/esm/components/Calendar/Header/CalendarHeader.module.css.js +2 -2
  29. package/dist/esm/components/Calendar/Header/index.js +15 -10
  30. package/dist/esm/components/Calendar/Header/index.js.map +1 -1
  31. package/dist/esm/components/Calendar/index.js +68 -34
  32. package/dist/esm/components/Calendar/index.js.map +1 -1
  33. package/dist/esm/constants/i18n/Calendar.js +40 -0
  34. package/dist/esm/constants/i18n/Calendar.js.map +1 -0
  35. package/dist/esm/constants/i18n/index.js +2 -0
  36. package/dist/esm/constants/i18n/index.js.map +1 -1
  37. package/dist/esm/customHooks/useCalendar.js +46 -31
  38. package/dist/esm/customHooks/useCalendar.js.map +1 -1
  39. package/dist/esm/utils/calendar.js +54 -0
  40. package/dist/esm/utils/calendar.js.map +1 -0
  41. package/dist/esm/utils/date/getMonthNameProper.js +27 -2
  42. package/dist/esm/utils/date/getMonthNameProper.js.map +1 -1
  43. package/dist/types/components/Calendar/Body/index.d.ts +3 -1
  44. package/dist/types/components/Calendar/index.d.ts +19 -0
  45. package/dist/types/index.d.ts +3 -2
  46. package/dist/types/interfaces/Calendar.d.ts +7 -1
  47. package/package.json +1 -1
@@ -1,74 +1,88 @@
1
- import { useState, useRef, useMemo, useEffect } from 'react';
1
+ import { useState, useRef, useEffect } from 'react';
2
2
  import { PERIOD_KEYS } from '../constants/calendar/index.js';
3
+ import { clampCalendarVisibleDate, isCalendarMonthAfterDate, getCalendarDateWithoutTime, isSameCalendarDate } from '../utils/calendar.js';
3
4
  import { getDaysInMonth } from '../utils/date/getDaysInMonth.js';
4
5
 
5
6
  const TODAY = new Date();
6
7
  const YEARS_BACK = 100;
7
- const isSameDate = (left, right) => left.getFullYear() === right.getFullYear() &&
8
- left.getMonth() === right.getMonth() &&
9
- left.getDate() === right.getDate();
10
- const buildCalendarDays = (month, year, selectedDate, selectedPeriodInterval, rangeStart, rangeEnd) => {
8
+ const getDateTimestamp = (date) => date ? getCalendarDateWithoutTime(date).getTime() : null;
9
+ const buildCalendarDays = ({ month, year, selectedDate, selectedPeriodInterval, rangeStart, rangeEnd, maxDate, }) => {
11
10
  const firstDayIndex = (new Date(year, month, 1).getDay() + 6) % 7;
12
11
  const daysInMonth = getDaysInMonth(month, year);
13
12
  const trailingDays = (7 - ((firstDayIndex + daysInMonth) % 7)) % 7;
14
13
  const cellCount = firstDayIndex + daysInMonth + trailingDays;
15
14
  const startDate = new Date(year, month, 1 - firstDayIndex);
15
+ const rangeStartTime = getDateTimestamp(rangeStart);
16
+ const rangeEndTime = getDateTimestamp(rangeEnd);
17
+ const maxDateTime = getDateTimestamp(maxDate);
18
+ const isDateInRange = (dateTime) => rangeStartTime !== null &&
19
+ rangeEndTime !== null &&
20
+ dateTime >= rangeStartTime &&
21
+ dateTime <= rangeEndTime;
22
+ const isDateDisabled = (dateTime) => {
23
+ if (maxDateTime !== null && dateTime > maxDateTime) {
24
+ return true;
25
+ }
26
+ if (selectedPeriodInterval === PERIOD_KEYS.from) {
27
+ return rangeEndTime !== null && dateTime > rangeEndTime;
28
+ }
29
+ return rangeStartTime !== null && dateTime < rangeStartTime;
30
+ };
16
31
  return Array.from({ length: cellCount }, (_, index) => {
17
32
  const date = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + index);
33
+ const dateTime = getCalendarDateWithoutTime(date).getTime();
18
34
  return {
19
35
  date,
20
36
  day: date.getDate(),
21
37
  isCurrentMonth: date.getMonth() === month,
22
- isToday: isSameDate(date, TODAY),
23
- isSelected: selectedDate ? isSameDate(date, selectedDate) : false,
24
- isInRange: Boolean(rangeStart &&
25
- rangeEnd &&
26
- date.getTime() >= rangeStart.getTime() &&
27
- date.getTime() <= rangeEnd.getTime()),
28
- isDisabled: Boolean((selectedPeriodInterval === PERIOD_KEYS.from &&
29
- rangeEnd &&
30
- date.getTime() > rangeEnd.getTime()) ||
31
- (selectedPeriodInterval === PERIOD_KEYS.to &&
32
- rangeStart &&
33
- date.getTime() < rangeStart.getTime())),
38
+ isToday: isSameCalendarDate(date, TODAY),
39
+ isSelected: selectedDate ? isSameCalendarDate(date, selectedDate) : false,
40
+ isInRange: isDateInRange(dateTime),
41
+ isDisabled: isDateDisabled(dateTime),
34
42
  };
35
43
  });
36
44
  };
37
- const useCalendar = ({ month, year, selectedDate, selectedPeriodInterval, rangeStart, rangeEnd, onMonthChange, }) => {
38
- const [visibleDate, setVisibleDate] = useState(() => new Date(year, month, 1));
45
+ const useCalendar = ({ month, year, selectedDate, selectedPeriodInterval, rangeStart, rangeEnd, maxDate, onMonthChange, }) => {
46
+ const [visibleDate, setVisibleDate] = useState(() => clampCalendarVisibleDate(new Date(year, month, 1), maxDate));
39
47
  const [isYearPickerOpen, setIsYearPickerOpen] = useState(false);
40
48
  const yearListRef = useRef(null);
41
49
  const visibleMonth = visibleDate.getMonth();
42
50
  const visibleYear = visibleDate.getFullYear();
43
- const days = useMemo(() => buildCalendarDays(visibleMonth, visibleYear, selectedDate, selectedPeriodInterval, rangeStart, rangeEnd), [
44
- visibleMonth,
45
- visibleYear,
46
- rangeEnd,
47
- rangeStart,
51
+ const days = buildCalendarDays({
52
+ month: visibleMonth,
53
+ year: visibleYear,
48
54
  selectedDate,
49
55
  selectedPeriodInterval,
50
- ]);
51
- const maxYear = TODAY.getFullYear();
56
+ rangeStart,
57
+ rangeEnd,
58
+ maxDate,
59
+ });
60
+ const maxYear = maxDate?.getFullYear() ?? TODAY.getFullYear();
52
61
  const minYear = maxYear - YEARS_BACK;
53
62
  const years = Array.from({ length: maxYear - minYear + 1 }, (_, index) => maxYear - index);
63
+ const isNextMonthDisabled = Boolean(maxDate && isCalendarMonthAfterDate(visibleMonth + 1, visibleYear, maxDate));
54
64
  const changeMonth = (offset) => {
55
65
  setVisibleDate((current) => {
56
66
  const next = new Date(current.getFullYear(), current.getMonth() + offset, 1);
57
- onMonthChange?.(next);
58
- return next;
67
+ const clampedNext = clampCalendarVisibleDate(next, maxDate);
68
+ if (clampedNext.getTime() === current.getTime()) {
69
+ return current;
70
+ }
71
+ onMonthChange?.(clampedNext);
72
+ return clampedNext;
59
73
  });
60
74
  };
61
75
  const pickYear = (pickedYear) => {
62
76
  setVisibleDate((current) => {
63
- const next = new Date(pickedYear, current.getMonth(), 1);
77
+ const next = clampCalendarVisibleDate(new Date(pickedYear, current.getMonth(), 1), maxDate);
64
78
  onMonthChange?.(next);
65
79
  return next;
66
80
  });
67
81
  setIsYearPickerOpen(false);
68
82
  };
69
83
  useEffect(() => {
70
- setVisibleDate(new Date(year, month, 1));
71
- }, [month, year]);
84
+ setVisibleDate(clampCalendarVisibleDate(new Date(year, month, 1), maxDate));
85
+ }, [month, maxDate, year]);
72
86
  useEffect(() => {
73
87
  if (!isYearPickerOpen || !yearListRef.current) {
74
88
  return;
@@ -82,6 +96,7 @@ const useCalendar = ({ month, year, selectedDate, selectedPeriodInterval, rangeS
82
96
  visibleMonth,
83
97
  visibleYear,
84
98
  isYearPickerOpen,
99
+ isNextMonthDisabled,
85
100
  setIsYearPickerOpen,
86
101
  yearListRef,
87
102
  changeMonth,
@@ -1 +1 @@
1
- {"version":3,"file":"useCalendar.js","sources":["../../../src/customHooks/useCalendar.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCalendar.js","sources":["../../../src/customHooks/useCalendar.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { convertType } from './date/convertType.js';
2
+
3
+ const formatCalendarDate = (date) => {
4
+ if (!date) {
5
+ return "";
6
+ }
7
+ return `${convertType.day.toString(date.getDate())}.${convertType.month.toString(date.getMonth())}.${date.getFullYear()}`;
8
+ };
9
+ const normalizeCalendarDate = (value) => {
10
+ if (!value) {
11
+ return null;
12
+ }
13
+ const normalizedDate = value instanceof Date ? value : new Date(value);
14
+ return Number.isNaN(normalizedDate.getTime()) ? null : normalizedDate;
15
+ };
16
+ const getCalendarDateWithoutTime = (date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());
17
+ const isSameCalendarDate = (left, right) => left.getFullYear() === right.getFullYear() &&
18
+ left.getMonth() === right.getMonth() &&
19
+ left.getDate() === right.getDate();
20
+ const isCalendarDateAfter = (date, maxDate) => {
21
+ if (!date || !maxDate) {
22
+ return false;
23
+ }
24
+ return (getCalendarDateWithoutTime(date).getTime() >
25
+ getCalendarDateWithoutTime(maxDate).getTime());
26
+ };
27
+ const getPeriodDateKey = (periodKey) => `${periodKey}Date`;
28
+ const updateSelectedPeriod = (currentPeriod, selectedPeriodInterval, nextDate) => {
29
+ const periodDateKey = getPeriodDateKey(selectedPeriodInterval);
30
+ const currentDate = currentPeriod[periodDateKey];
31
+ const isSameDate = currentDate
32
+ ? isSameCalendarDate(currentDate, nextDate)
33
+ : false;
34
+ const nextPeriod = {
35
+ ...currentPeriod,
36
+ [periodDateKey]: isSameDate ? null : nextDate,
37
+ };
38
+ return {
39
+ ...nextPeriod,
40
+ periodSelected: Boolean(nextPeriod.fromDate && nextPeriod.toDate),
41
+ };
42
+ };
43
+ const isCalendarMonthAfterDate = (month, year, date) => year > date.getFullYear() ||
44
+ (year === date.getFullYear() && month > date.getMonth());
45
+ const clampCalendarVisibleDate = (date, maxDate) => {
46
+ if (!maxDate ||
47
+ !isCalendarMonthAfterDate(date.getMonth(), date.getFullYear(), maxDate)) {
48
+ return date;
49
+ }
50
+ return new Date(maxDate.getFullYear(), maxDate.getMonth(), 1);
51
+ };
52
+
53
+ export { clampCalendarVisibleDate, formatCalendarDate, getCalendarDateWithoutTime, getPeriodDateKey, isCalendarDateAfter, isCalendarMonthAfterDate, isSameCalendarDate, normalizeCalendarDate, updateSelectedPeriod };
54
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sources":["../../../src/utils/calendar.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,7 +1,32 @@
1
1
  import { currentYear } from './index.js';
2
2
 
3
- const getMonthNameProper = (month) => {
4
- const monthName = new Date(currentYear, month).toLocaleString("ru-RU", {
3
+ const localeByLang = {
4
+ ru: "ru-RU",
5
+ kk: "kk-KZ",
6
+ en: "en-US",
7
+ };
8
+ const monthNamesByLang = {
9
+ kk: [
10
+ "Қаңтар",
11
+ "Ақпан",
12
+ "Наурыз",
13
+ "Сәуір",
14
+ "Мамыр",
15
+ "Маусым",
16
+ "Шілде",
17
+ "Тамыз",
18
+ "Қыркүйек",
19
+ "Қазан",
20
+ "Қараша",
21
+ "Желтоқсан",
22
+ ],
23
+ };
24
+ const getMonthNameProper = (month, lang) => {
25
+ const translatedMonthName = monthNamesByLang[lang]?.[month];
26
+ if (translatedMonthName) {
27
+ return translatedMonthName;
28
+ }
29
+ const monthName = new Date(currentYear, month).toLocaleString(localeByLang[lang], {
5
30
  month: "long",
6
31
  });
7
32
  return monthName.charAt(0).toUpperCase() + monthName.slice(1);
@@ -1 +1 @@
1
- {"version":3,"file":"getMonthNameProper.js","sources":["../../../../src/utils/date/getMonthNameProper.tsx"],"sourcesContent":[null],"names":[],"mappings":";;AAEO,MAAM,kBAAkB,GAAG,CAAC,KAAa,KAAY;AAC1D,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;AACrE,QAAA,KAAK,EAAE,MAAM;AACd,KAAA,CAAC;AACF,IAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D;;;;"}
1
+ {"version":3,"file":"getMonthNameProper.js","sources":["../../../../src/utils/date/getMonthNameProper.tsx"],"sourcesContent":[null],"names":[],"mappings":";;AAGA,MAAM,YAAY,GAAuC;AACvD,IAAA,EAAE,EAAE,OAAO;AACX,IAAA,EAAE,EAAE,OAAO;AACX,IAAA,EAAE,EAAE,OAAO;CACZ;AAED,MAAM,gBAAgB,GAAkD;AACtE,IAAA,EAAE,EAAE;QACF,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,UAAU;QACV,OAAO;QACP,QAAQ;QACR,WAAW;AACZ,KAAA;CACF;MAEY,kBAAkB,GAAG,CAChC,KAAa,EACb,IAAwB,KACd;IACV,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAE3D,IAAA,IAAI,mBAAmB,EAAE;AACvB,QAAA,OAAO,mBAAmB;AAC3B,IAAA;AAED,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,cAAc,CAC3D,YAAY,CAAC,IAAI,CAAC,EAClB;AACE,QAAA,KAAK,EAAE,MAAM;AACd,KAAA,CACF;AACD,IAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D;;;;"}
@@ -1,11 +1,13 @@
1
1
  import { TPeriodKeys } from '../../../interfaces/Calendar.js';
2
+ import { ILangProps } from '../../../interfaces/common/index.js';
2
3
 
3
- interface ICalendarBodyProps {
4
+ interface ICalendarBodyProps extends ILangProps {
4
5
  month?: number;
5
6
  year?: number;
6
7
  selectedDate?: Date | null;
7
8
  rangeStart?: Date | null;
8
9
  rangeEnd?: Date | null;
10
+ maxDate?: Date | null;
9
11
  selectedPeriodInterval?: TPeriodKeys;
10
12
  onDayClick?: (date: Date) => void;
11
13
  onMonthChange?: (date: Date) => void;
@@ -0,0 +1,19 @@
1
+ import { Dispatch, SetStateAction } from 'react';
2
+ import { TCalendarMode, ISelectedPeriod, TPeriodKeys } from '../../interfaces/Calendar.js';
3
+ import { ILangProps } from '../../interfaces/common/index.js';
4
+
5
+ interface ICalendarProps extends ILangProps {
6
+ mode?: TCalendarMode;
7
+ isOpen?: boolean;
8
+ setIsOpen?: Dispatch<SetStateAction<boolean>>;
9
+ title?: string;
10
+ maxDate?: Date | null;
11
+ selectedDate?: Date | null;
12
+ selectedPeriod?: ISelectedPeriod;
13
+ defaultPeriodInterval?: TPeriodKeys;
14
+ onDateChange?: (date: Date | null) => void;
15
+ onPeriodChange?: (period: ISelectedPeriod) => void;
16
+ onSave?: (value: Date | null | ISelectedPeriod) => void;
17
+ }
18
+
19
+ export type { ICalendarProps };
@@ -1,4 +1,5 @@
1
1
  import { ICalendarBodyProps } from './components/Calendar/Body/index.js';
2
+ import { ICalendarProps } from './components/Calendar/index.js';
2
3
  import { INotificationWrapperProps } from './components/Notification/Wrapper/index.js';
3
4
  import { INotificationComponentProps } from './components/Notification/Item/index.js';
4
5
  import { IServiceCardComponentProps } from './components/ServiceCardComponent/index.js';
@@ -100,8 +101,8 @@ declare const SystemDesign: {
100
101
  ServiceCardComponent: ({ handleOrderService, badge, isNew, title, }: IServiceCardComponentProps) => react_jsx_runtime.JSX.Element;
101
102
  NotificationItem: ({ type, text, onClick, }: INotificationComponentProps) => react_jsx_runtime.JSX.Element;
102
103
  NotificationWrapper: ({ items, removeNotificationData, }: INotificationWrapperProps) => react_jsx_runtime.JSX.Element | null;
103
- Calendar: () => react_jsx_runtime.JSX.Element;
104
- CalendarBody: ({ month, year, selectedDate, rangeStart, rangeEnd, selectedPeriodInterval, onDayClick, onMonthChange, }: ICalendarBodyProps) => react_jsx_runtime.JSX.Element;
104
+ Calendar: ({ mode, isOpen, setIsOpen, lang, title, maxDate, selectedDate, selectedPeriod, defaultPeriodInterval, onDateChange, onPeriodChange, onSave, }: ICalendarProps) => react_jsx_runtime.JSX.Element;
105
+ CalendarBody: ({ lang, month, year, selectedDate, rangeStart, rangeEnd, maxDate, selectedPeriodInterval, onDayClick, onMonthChange, }: ICalendarBodyProps) => react_jsx_runtime.JSX.Element;
105
106
  };
106
107
  };
107
108
 
@@ -1,7 +1,13 @@
1
+ interface ISelectedPeriod {
2
+ fromDate?: Date | null;
3
+ toDate?: Date | null;
4
+ periodSelected: boolean;
5
+ }
6
+ type TCalendarMode = "default" | "period";
1
7
  interface IPeriodKeys {
2
8
  from: "from";
3
9
  to: "to";
4
10
  }
5
11
  type TPeriodKeys = keyof IPeriodKeys;
6
12
 
7
- export type { IPeriodKeys, TPeriodKeys };
13
+ export type { IPeriodKeys, ISelectedPeriod, TCalendarMode, TPeriodKeys };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@egov3/system-design",
3
- "version": "1.3.124",
3
+ "version": "1.3.126",
4
4
  "type": "module",
5
5
  "main": "dist/cjs/index.js",
6
6
  "types": "dist/types/index.d.ts",