monthFoundation.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. // import { cssClasses, strings } from './constants';
  3. import getMonthTable, { WeekStartNumber } from './_utils/getMonthTable';
  4. import getDayOfWeek from './_utils/getDayOfWeek';
  5. import { format } from 'date-fns';
  6. import isNullOrUndefined from '../utils/isNullOrUndefined';
  7. export interface MonthFoundationProps {
  8. forwardRef: any;
  9. month: Date;
  10. selected: Set<string>;
  11. rangeStart: string;
  12. rangeEnd: string;
  13. offsetRangeStart: string;
  14. offsetRangeEnd: string;
  15. onDayClick: (day: MonthDayInfo) => void;
  16. onDayHover: (day: MonthDayInfo) => void;
  17. weekStartsOn: WeekStartNumber;
  18. disabledDate: (day: Date, options?: { rangeStart: string; rangeEnd: string }) => boolean;
  19. weeksRowNum: number;
  20. onWeeksRowNumChange: (weeksRowNum: number) => void;
  21. renderDate: () => void;
  22. renderFullDate: () => void;
  23. hoverDay: string; // Real-time hover date
  24. startDateOffset: () => void;
  25. endDateOffset: () => void;
  26. rangeInputFocus: string | boolean;
  27. focusRecordsRef: any;
  28. locale: any;
  29. localeCode: string;
  30. multiple: boolean;
  31. }
  32. export type MonthDayInfo = {
  33. dayNumber: number;
  34. dayNumberFull?: string;
  35. fullDate: string;
  36. } | {
  37. dayNumber: string;
  38. dayNumberFull?: string;
  39. fullDate: string;
  40. };
  41. export interface MonthInfo {
  42. weeks: Array<MonthDayInfo[]>;
  43. monthText: string ;
  44. month?: Date;
  45. }
  46. export interface MonthFoundationState {
  47. weekdays: string[];
  48. month: MonthInfo;
  49. todayText: string;
  50. weeksRowNum: number;
  51. }
  52. export interface MonthTable {
  53. monthText: string;
  54. weeks: unknown;
  55. month: unknown;
  56. }
  57. export interface MonthAdapter extends DefaultAdapter<MonthFoundationProps, MonthFoundationState>{
  58. updateToday: (todayText: string) => void;
  59. setWeekDays: (weekdays: string[]) => void;
  60. setWeeksRowNum: (weeksRowNum: number, callback?: () => void) => void;
  61. updateMonthTable: (month: MonthInfo) => void;
  62. notifyDayClick: MonthFoundationProps['onDayClick'];
  63. notifyDayHover: MonthFoundationProps['onDayHover'];
  64. notifyWeeksRowNumChange: MonthFoundationProps['onWeeksRowNumChange'];
  65. }
  66. export default class CalendarMonthFoundation extends BaseFoundation<MonthAdapter> {
  67. constructor(adapter: MonthAdapter) {
  68. super({ ...adapter });
  69. }
  70. init() {
  71. this._getToday();
  72. this.getMonthTable();
  73. }
  74. _getToday() {
  75. const today = new Date();
  76. const todayText = format(today, 'yyyy-MM-dd');
  77. this._adapter.updateToday(todayText);
  78. }
  79. getMonthTable() {
  80. const month: Date = this._adapter.getProp('month');
  81. const weeksRowNum = this.getState('weeksRowNum');
  82. if (month) {
  83. this.updateWeekDays();
  84. const weekStartsOn: WeekStartNumber = this._adapter.getProp('weekStartsOn');
  85. const monthTable = getMonthTable(month, weekStartsOn);
  86. const { weeks } = monthTable;
  87. this._adapter.updateMonthTable(monthTable);
  88. if (isNullOrUndefined(weeksRowNum)) {
  89. this._adapter.setWeeksRowNum(weeks.length);
  90. } else if (Array.isArray(weeks) && weeks.length !== weeksRowNum) {
  91. this._adapter.setWeeksRowNum(weeks.length, () => {
  92. this._adapter.notifyWeeksRowNumChange(weeks.length);
  93. });
  94. }
  95. }
  96. }
  97. updateWeekDays() {
  98. const weekStartsOn = this._adapter.getProp('weekStartsOn');
  99. const weekdays = getDayOfWeek({ weekStartsOn });
  100. this._adapter.setWeekDays(weekdays);
  101. }
  102. // eslint-disable-next-line @typescript-eslint/no-empty-function
  103. destroy() {}
  104. handleClick(day: MonthDayInfo) {
  105. this._adapter.notifyDayClick(day);
  106. }
  107. handleHover(day?: MonthDayInfo) {
  108. this._adapter.notifyDayHover(day);
  109. }
  110. }