* fix: bug * test: kanban test * test: gantt block test * test: gantt test * test: gantt test * test: gantt test * refactor: convert parameters to destructured object * test: add tests choices * test: add tests media * test: add tests for datetime in creating form * feat(plugin-mock-collection): generate faker time * test: add tests for datetime in editing form * test: add tests for datetime in details form * test: gantt block test * test: gantt test * test: gantt test * test: gantt test * fix: bug * feat: improve code * test: add tests for relation fields * refactor: style improve * fix: rename SchemaSettings * fix: type bug * refactor: useDesinger() * fix: bug * fix: bug * fix: build tip * refactor: kanban setting * refactor: gantt setting * refactor: bulk update setting * refactor: bulk update setting * refactor: bulk edit settings * refactor: duplicate settings * refactor: print action setting * refactor: duplicate settings * refactor: bulk update refactor * refactor: bulk update refactor * fix: designableState * fix: bug * fix: designable * refactor: bulk update * fix: designable * test: add tests for relation fields * test: add tests for relation fields * test: add tests for relation fields * feat: client api doc * test: add tests for relation fields * test: avoid errors * test: make tests passing * fix: bug * test: gantt test * test: make tests passing * test: add tests for advanced fields * test: increase e2e timeout-minutes to 60 * fix: bug * fix: improve code * feat: add schema initailizer component demos * test: make tests passing * fix: schema settings demos * feat: shallowMerge & deepMerge * test: reduce number of tests * test: make tests passing * feat: updates * fix: add Initializer Internal * demos: useSchemaSettingsRender * test: make tests passing * test: make tests passing * test: bulk update test * refactor: useSchemaToolbar * fix: improve docs * fix: bug * test: duplicate action test * test: duplicate action test * test: duplicate action test * test: duplicate action test * chore: upgrade dumi theme * test: make tests passing * test: add tests for linkage rules * test: add test for form data templates * test: add tests for default value * test: reduce number of tests * refactor: bulk edit setting * test: bulk edit action test * test: bulk edit action test * fix: dn.deepMerge * fix: bug * test: bulk edit action test * test: kanban test * refactor: bulk update version * refactor: print action version * fix: bug * fix: toolbar * fix: docs ssr * test: add tests for system fields * test: add tests for actions * fix: bug * test: add tests for lazy loading of variables * test: make testing more stable * test: bulk edit test * test: bulk update action test * fix: update docs * test: print test * test: kanban test * test: kanban test * refactor: duplicate version * fix: merge bug * refactor: bulk update * fix: merge bug * refactor: bulk edit * refactor: import * refactor: export action * refactor: code improve * refactor: kanban code improve * fix: merge bug * refactor: readPrettyFormActionInitializers * test: print action test * test: print action test * refactor: print action * test: action test * refactor: gantt date change * style: gantt style improve * test: gantt &bulkUpdate test * test: bulk update test * test: duplicate action test * test: print action test * test: bulk edit action test * test: gantt block test * test: kanban block test * test: test file name * test: test file name * test: bulk update action tst * refactor: rename test file name * refactor: bulk update action * refactor: gantt test * fix: block template * fix: block template * fix: useFieldModeOptions * refactor: code improve * fix: merge bug --------- Co-authored-by: dream2023 <1098626505@qq.com> Co-authored-by: Rain <958414905@qq.com> Co-authored-by: chenos <chenlinxh@gmail.com>
204 lines
7.1 KiB
TypeScript
204 lines
7.1 KiB
TypeScript
import { Task, ViewMode } from '../types/public-types';
|
|
|
|
const DateTimeFormat = Intl.DateTimeFormat;
|
|
type DateTimeFormat = typeof DateTimeFormat;
|
|
//@ts-ignore
|
|
const DateTimeFormatOptions = Intl.DateTimeFormatOptions;
|
|
type DateTimeFormatOptions = typeof DateTimeFormatOptions;
|
|
type DateHelperScales = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';
|
|
|
|
const intlDTCache = {};
|
|
export const getCachedDateTimeFormat = (
|
|
locString: string | string[],
|
|
opts: DateTimeFormatOptions = {},
|
|
): DateTimeFormat => {
|
|
const key = JSON.stringify([locString, opts]);
|
|
let dtf = intlDTCache[key];
|
|
if (!dtf) {
|
|
dtf = new Intl.DateTimeFormat(locString, opts);
|
|
intlDTCache[key] = dtf;
|
|
}
|
|
return dtf;
|
|
};
|
|
|
|
export const addToDate = (date: Date, quantity: number, scale: DateHelperScales) => {
|
|
const newDate = new Date(
|
|
date.getFullYear() + (scale === 'year' ? quantity : 0),
|
|
date.getMonth() + (scale === 'month' ? quantity : 0),
|
|
date.getDate() + (scale === 'day' ? quantity : 0),
|
|
date.getHours() + (scale === 'hour' ? quantity : 0),
|
|
date.getMinutes() + (scale === 'minute' ? quantity : 0),
|
|
date.getSeconds() + (scale === 'second' ? quantity : 0),
|
|
date.getMilliseconds() + (scale === 'millisecond' ? quantity : 0),
|
|
);
|
|
return newDate;
|
|
};
|
|
|
|
export const startOfDate = (date: Date, scale: DateHelperScales) => {
|
|
const scores = ['millisecond', 'second', 'minute', 'hour', 'day', 'month', 'year'];
|
|
|
|
const shouldReset = (_scale: DateHelperScales) => {
|
|
const maxScore = scores.indexOf(scale);
|
|
return scores.indexOf(_scale) <= maxScore;
|
|
};
|
|
const newDate = new Date(
|
|
date?.getFullYear(),
|
|
shouldReset('year') ? 0 : date.getMonth(),
|
|
shouldReset('month') ? 1 : date.getDate(),
|
|
shouldReset('day') ? 0 : date.getHours(),
|
|
shouldReset('hour') ? 0 : date.getMinutes(),
|
|
shouldReset('minute') ? 0 : date.getSeconds(),
|
|
shouldReset('second') ? 0 : date.getMilliseconds(),
|
|
);
|
|
return newDate;
|
|
};
|
|
|
|
export const ganttDateRange = (tasks: Task[], viewMode: ViewMode, preStepsCount: number) => {
|
|
let newStartDate: Date = tasks[0]?.start || new Date();
|
|
let newEndDate: Date = tasks[0]?.start || new Date();
|
|
for (const task of tasks) {
|
|
if (task.start < newStartDate) {
|
|
newStartDate = task.start;
|
|
}
|
|
if (task.end > newEndDate) {
|
|
newEndDate = task.end;
|
|
}
|
|
}
|
|
switch (viewMode) {
|
|
case ViewMode.Year:
|
|
newStartDate = addToDate(newStartDate, -1, 'year');
|
|
newStartDate = startOfDate(newStartDate, 'year');
|
|
newEndDate = addToDate(newEndDate, 1, 'year');
|
|
newEndDate = startOfDate(newEndDate, 'year');
|
|
break;
|
|
case ViewMode.QuarterYear:
|
|
newStartDate = addToDate(newStartDate, -3, 'month');
|
|
newStartDate = startOfDate(newStartDate, 'month');
|
|
newEndDate = addToDate(newEndDate, 3, 'year');
|
|
newEndDate = startOfDate(newEndDate, 'year');
|
|
break;
|
|
case ViewMode.Month:
|
|
newStartDate = addToDate(newStartDate, -1 * preStepsCount, 'month');
|
|
newStartDate = startOfDate(newStartDate, 'month');
|
|
newEndDate = addToDate(newEndDate, 1, 'year');
|
|
newEndDate = startOfDate(newEndDate, 'year');
|
|
break;
|
|
case ViewMode.Week:
|
|
newStartDate = startOfDate(newStartDate, 'day');
|
|
newStartDate = addToDate(getMonday(newStartDate), -7 * preStepsCount, 'day');
|
|
newEndDate = startOfDate(newEndDate, 'day');
|
|
newEndDate = addToDate(newEndDate, 1.5, 'month');
|
|
break;
|
|
case ViewMode.Day:
|
|
newStartDate = startOfDate(newStartDate, 'day');
|
|
newStartDate = addToDate(newStartDate, -1 * preStepsCount, 'day');
|
|
newEndDate = startOfDate(newEndDate, 'day');
|
|
newEndDate = addToDate(newEndDate, 19, 'day');
|
|
break;
|
|
case ViewMode.QuarterDay:
|
|
newStartDate = startOfDate(newStartDate, 'day');
|
|
newStartDate = addToDate(newStartDate, -1 * preStepsCount, 'day');
|
|
newEndDate = startOfDate(newEndDate, 'day');
|
|
newEndDate = addToDate(newEndDate, 66, 'hour'); // 24(1 day)*3 - 6
|
|
break;
|
|
case ViewMode.HalfDay:
|
|
newStartDate = startOfDate(newStartDate, 'day');
|
|
newStartDate = addToDate(newStartDate, -1 * preStepsCount, 'day');
|
|
newEndDate = startOfDate(newEndDate, 'day');
|
|
newEndDate = addToDate(newEndDate, 108, 'hour'); // 24(1 day)*5 - 12
|
|
break;
|
|
case ViewMode.Hour:
|
|
newStartDate = startOfDate(newStartDate, 'hour');
|
|
newStartDate = addToDate(newStartDate, -1 * preStepsCount, 'hour');
|
|
newEndDate = startOfDate(newEndDate, 'day');
|
|
newEndDate = addToDate(newEndDate, 1, 'day');
|
|
break;
|
|
}
|
|
return [newStartDate, newEndDate];
|
|
};
|
|
|
|
export const seedDates = (startDate: Date, endDate: Date, viewMode: ViewMode) => {
|
|
let currentDate: Date = new Date(startDate);
|
|
const dates: Date[] = [currentDate];
|
|
while (currentDate < endDate) {
|
|
switch (viewMode) {
|
|
case ViewMode.Year:
|
|
currentDate = addToDate(currentDate, 1, 'year');
|
|
break;
|
|
case ViewMode.QuarterYear:
|
|
currentDate = addToDate(currentDate, 3, 'month');
|
|
break;
|
|
case ViewMode.Month:
|
|
currentDate = addToDate(currentDate, 1, 'month');
|
|
break;
|
|
case ViewMode.Week:
|
|
currentDate = addToDate(currentDate, 7, 'day');
|
|
break;
|
|
case ViewMode.Day:
|
|
currentDate = addToDate(currentDate, 1, 'day');
|
|
break;
|
|
case ViewMode.HalfDay:
|
|
currentDate = addToDate(currentDate, 12, 'hour');
|
|
break;
|
|
case ViewMode.QuarterDay:
|
|
currentDate = addToDate(currentDate, 6, 'hour');
|
|
break;
|
|
case ViewMode.Hour:
|
|
currentDate = addToDate(currentDate, 1, 'hour');
|
|
break;
|
|
}
|
|
dates.push(currentDate);
|
|
}
|
|
return dates;
|
|
};
|
|
|
|
export const getLocaleMonth = (date: Date, locale: string) => {
|
|
let bottomValue = getCachedDateTimeFormat(locale, {
|
|
month: 'long',
|
|
//@ts-ignore
|
|
}).format(date);
|
|
bottomValue = bottomValue.replace(bottomValue[0], bottomValue[0].toLocaleUpperCase());
|
|
return bottomValue;
|
|
};
|
|
|
|
export const getLocalDayOfWeek = (date: Date, locale: string, format?: 'long' | 'short' | 'narrow' | undefined) => {
|
|
let bottomValue = getCachedDateTimeFormat(locale, {
|
|
weekday: format,
|
|
//@ts-ignore
|
|
}).format(date);
|
|
bottomValue = bottomValue.replace(bottomValue[0], bottomValue[0].toLocaleUpperCase());
|
|
return bottomValue;
|
|
};
|
|
|
|
/**
|
|
* Returns monday of current week
|
|
* @param date date for modify
|
|
*/
|
|
const getMonday = (date: Date) => {
|
|
const day = date.getDay();
|
|
const diff = date.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday
|
|
return new Date(date.setDate(diff));
|
|
};
|
|
|
|
export const getWeekNumberISO8601 = (date: Date) => {
|
|
const tmpDate = new Date(date.valueOf());
|
|
const dayNumber = (tmpDate.getDay() + 6) % 7;
|
|
tmpDate.setDate(tmpDate.getDate() - dayNumber + 3);
|
|
const firstThursday = tmpDate.valueOf();
|
|
tmpDate.setMonth(0, 1);
|
|
if (tmpDate.getDay() !== 4) {
|
|
tmpDate.setMonth(0, 1 + ((4 - tmpDate.getDay() + 7) % 7));
|
|
}
|
|
const weekNumber = (1 + Math.ceil((firstThursday - tmpDate.valueOf()) / 604800000)).toString();
|
|
|
|
if (weekNumber.length === 1) {
|
|
return `0${weekNumber}`;
|
|
} else {
|
|
return weekNumber;
|
|
}
|
|
};
|
|
|
|
export const getDaysInMonth = (month: number, year: number) => {
|
|
return new Date(year, month + 1, 0).getDate();
|
|
};
|