UNPKG

@wamra/gantt-task-react

Version:
1,548 lines (1,547 loc) 400 kB
import { jsx, jsxs, Fragment as Fragment$1 } from "react/jsx-runtime"; import * as React from "react"; import React__default, { memo, Fragment, useCallback, useMemo, useState, useEffect, useRef, useLayoutEffect } from "react"; import { UnfoldLess, UnfoldMore, UnfoldMoreDouble } from "@mui/icons-material"; import { createTheme, ThemeProvider, Tooltip as Tooltip$1, IconButton } from "@mui/material"; import Popper from "@mui/material/Popper"; import Paper from "@mui/material/Paper"; import ClickAwayListener from "@mui/material/ClickAwayListener"; import * as ReactDOM from "react-dom"; var formatDistanceLocale = { lessThanXSeconds: { one: "less than a second", other: "less than {{count}} seconds" }, xSeconds: { one: "1 second", other: "{{count}} seconds" }, halfAMinute: "half a minute", lessThanXMinutes: { one: "less than a minute", other: "less than {{count}} minutes" }, xMinutes: { one: "1 minute", other: "{{count}} minutes" }, aboutXHours: { one: "about 1 hour", other: "about {{count}} hours" }, xHours: { one: "1 hour", other: "{{count}} hours" }, xDays: { one: "1 day", other: "{{count}} days" }, aboutXWeeks: { one: "about 1 week", other: "about {{count}} weeks" }, xWeeks: { one: "1 week", other: "{{count}} weeks" }, aboutXMonths: { one: "about 1 month", other: "about {{count}} months" }, xMonths: { one: "1 month", other: "{{count}} months" }, aboutXYears: { one: "about 1 year", other: "about {{count}} years" }, xYears: { one: "1 year", other: "{{count}} years" }, overXYears: { one: "over 1 year", other: "over {{count}} years" }, almostXYears: { one: "almost 1 year", other: "almost {{count}} years" } }; var formatDistance = function formatDistance2(token, count2, options) { var result; var tokenValue = formatDistanceLocale[token]; if (typeof tokenValue === "string") { result = tokenValue; } else if (count2 === 1) { result = tokenValue.one; } else { result = tokenValue.other.replace("{{count}}", count2.toString()); } if (options !== null && options !== void 0 && options.addSuffix) { if (options.comparison && options.comparison > 0) { return "in " + result; } else { return result + " ago"; } } return result; }; const formatDistance$1 = formatDistance; function buildFormatLongFn(args) { return function() { var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; var width = options.width ? String(options.width) : args.defaultWidth; var format2 = args.formats[width] || args.formats[args.defaultWidth]; return format2; }; } var dateFormats = { full: "EEEE, MMMM do, y", long: "MMMM do, y", medium: "MMM d, y", short: "MM/dd/yyyy" }; var timeFormats = { full: "h:mm:ss a zzzz", long: "h:mm:ss a z", medium: "h:mm:ss a", short: "h:mm a" }; var dateTimeFormats = { full: "{{date}} 'at' {{time}}", long: "{{date}} 'at' {{time}}", medium: "{{date}}, {{time}}", short: "{{date}}, {{time}}" }; var formatLong = { date: buildFormatLongFn({ formats: dateFormats, defaultWidth: "full" }), time: buildFormatLongFn({ formats: timeFormats, defaultWidth: "full" }), dateTime: buildFormatLongFn({ formats: dateTimeFormats, defaultWidth: "full" }) }; const formatLong$1 = formatLong; var formatRelativeLocale = { lastWeek: "'last' eeee 'at' p", yesterday: "'yesterday at' p", today: "'today at' p", tomorrow: "'tomorrow at' p", nextWeek: "eeee 'at' p", other: "P" }; var formatRelative = function formatRelative2(token, _date, _baseDate, _options) { return formatRelativeLocale[token]; }; const formatRelative$1 = formatRelative; function buildLocalizeFn(args) { return function(dirtyIndex, options) { var context = options !== null && options !== void 0 && options.context ? String(options.context) : "standalone"; var valuesArray; if (context === "formatting" && args.formattingValues) { var defaultWidth = args.defaultFormattingWidth || args.defaultWidth; var width = options !== null && options !== void 0 && options.width ? String(options.width) : defaultWidth; valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; } else { var _defaultWidth = args.defaultWidth; var _width = options !== null && options !== void 0 && options.width ? String(options.width) : args.defaultWidth; valuesArray = args.values[_width] || args.values[_defaultWidth]; } var index2 = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; return valuesArray[index2]; }; } var eraValues = { narrow: ["B", "A"], abbreviated: ["BC", "AD"], wide: ["Before Christ", "Anno Domini"] }; var quarterValues = { narrow: ["1", "2", "3", "4"], abbreviated: ["Q1", "Q2", "Q3", "Q4"], wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"] }; var monthValues = { narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] }; var dayValues = { narrow: ["S", "M", "T", "W", "T", "F", "S"], short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] }; var dayPeriodValues = { narrow: { am: "a", pm: "p", midnight: "mi", noon: "n", morning: "morning", afternoon: "afternoon", evening: "evening", night: "night" }, abbreviated: { am: "AM", pm: "PM", midnight: "midnight", noon: "noon", morning: "morning", afternoon: "afternoon", evening: "evening", night: "night" }, wide: { am: "a.m.", pm: "p.m.", midnight: "midnight", noon: "noon", morning: "morning", afternoon: "afternoon", evening: "evening", night: "night" } }; var formattingDayPeriodValues = { narrow: { am: "a", pm: "p", midnight: "mi", noon: "n", morning: "in the morning", afternoon: "in the afternoon", evening: "in the evening", night: "at night" }, abbreviated: { am: "AM", pm: "PM", midnight: "midnight", noon: "noon", morning: "in the morning", afternoon: "in the afternoon", evening: "in the evening", night: "at night" }, wide: { am: "a.m.", pm: "p.m.", midnight: "midnight", noon: "noon", morning: "in the morning", afternoon: "in the afternoon", evening: "in the evening", night: "at night" } }; var ordinalNumber = function ordinalNumber2(dirtyNumber, _options) { var number = Number(dirtyNumber); var rem100 = number % 100; if (rem100 > 20 || rem100 < 10) { switch (rem100 % 10) { case 1: return number + "st"; case 2: return number + "nd"; case 3: return number + "rd"; } } return number + "th"; }; var localize = { ordinalNumber, era: buildLocalizeFn({ values: eraValues, defaultWidth: "wide" }), quarter: buildLocalizeFn({ values: quarterValues, defaultWidth: "wide", argumentCallback: function argumentCallback(quarter) { return quarter - 1; } }), month: buildLocalizeFn({ values: monthValues, defaultWidth: "wide" }), day: buildLocalizeFn({ values: dayValues, defaultWidth: "wide" }), dayPeriod: buildLocalizeFn({ values: dayPeriodValues, defaultWidth: "wide", formattingValues: formattingDayPeriodValues, defaultFormattingWidth: "wide" }) }; const localize$1 = localize; function buildMatchFn(args) { return function(string) { var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var width = options.width; var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; var matchResult = string.match(matchPattern); if (!matchResult) { return null; } var matchedString = matchResult[0]; var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function(pattern) { return pattern.test(matchedString); }) : findKey(parsePatterns, function(pattern) { return pattern.test(matchedString); }); var value; value = args.valueCallback ? args.valueCallback(key) : key; value = options.valueCallback ? options.valueCallback(value) : value; var rest = string.slice(matchedString.length); return { value, rest }; }; } function findKey(object, predicate) { for (var key in object) { if (object.hasOwnProperty(key) && predicate(object[key])) { return key; } } return void 0; } function findIndex(array, predicate) { for (var key = 0; key < array.length; key++) { if (predicate(array[key])) { return key; } } return void 0; } function buildMatchPatternFn(args) { return function(string) { var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var matchResult = string.match(args.matchPattern); if (!matchResult) return null; var matchedString = matchResult[0]; var parseResult = string.match(args.parsePattern); if (!parseResult) return null; var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; value = options.valueCallback ? options.valueCallback(value) : value; var rest = string.slice(matchedString.length); return { value, rest }; }; } var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; var parseOrdinalNumberPattern = /\d+/i; var matchEraPatterns = { narrow: /^(b|a)/i, abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, wide: /^(before christ|before common era|anno domini|common era)/i }; var parseEraPatterns = { any: [/^b/i, /^(a|c)/i] }; var matchQuarterPatterns = { narrow: /^[1234]/i, abbreviated: /^q[1234]/i, wide: /^[1234](th|st|nd|rd)? quarter/i }; var parseQuarterPatterns = { any: [/1/i, /2/i, /3/i, /4/i] }; var matchMonthPatterns = { narrow: /^[jfmasond]/i, abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i }; var parseMonthPatterns = { narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i], any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i] }; var matchDayPatterns = { narrow: /^[smtwf]/i, short: /^(su|mo|tu|we|th|fr|sa)/i, abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i }; var parseDayPatterns = { narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] }; var matchDayPeriodPatterns = { narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i }; var parseDayPeriodPatterns = { any: { am: /^a/i, pm: /^p/i, midnight: /^mi/i, noon: /^no/i, morning: /morning/i, afternoon: /afternoon/i, evening: /evening/i, night: /night/i } }; var match = { ordinalNumber: buildMatchPatternFn({ matchPattern: matchOrdinalNumberPattern, parsePattern: parseOrdinalNumberPattern, valueCallback: function valueCallback(value) { return parseInt(value, 10); } }), era: buildMatchFn({ matchPatterns: matchEraPatterns, defaultMatchWidth: "wide", parsePatterns: parseEraPatterns, defaultParseWidth: "any" }), quarter: buildMatchFn({ matchPatterns: matchQuarterPatterns, defaultMatchWidth: "wide", parsePatterns: parseQuarterPatterns, defaultParseWidth: "any", valueCallback: function valueCallback2(index2) { return index2 + 1; } }), month: buildMatchFn({ matchPatterns: matchMonthPatterns, defaultMatchWidth: "wide", parsePatterns: parseMonthPatterns, defaultParseWidth: "any" }), day: buildMatchFn({ matchPatterns: matchDayPatterns, defaultMatchWidth: "wide", parsePatterns: parseDayPatterns, defaultParseWidth: "any" }), dayPeriod: buildMatchFn({ matchPatterns: matchDayPeriodPatterns, defaultMatchWidth: "any", parsePatterns: parseDayPeriodPatterns, defaultParseWidth: "any" }) }; const match$1 = match; var locale = { code: "en-US", formatDistance: formatDistance$1, formatLong: formatLong$1, formatRelative: formatRelative$1, localize: localize$1, match: match$1, options: { weekStartsOn: 0, firstWeekContainsDate: 1 } }; const enDateLocale = locale; var ViewMode = /* @__PURE__ */ ((ViewMode2) => { ViewMode2["Hour"] = "Hour"; ViewMode2["QuarterDay"] = "Quarter Day"; ViewMode2["HalfDay"] = "Half Day"; ViewMode2["Day"] = "Day"; ViewMode2["TwoDays"] = "Two Days"; ViewMode2["Week"] = "Week"; ViewMode2["Month"] = "Month"; ViewMode2["QuarterYear"] = "QuarterYear"; ViewMode2["Year"] = "Year"; return ViewMode2; })(ViewMode || {}); var GanttDateRoundingTimeUnit = /* @__PURE__ */ ((GanttDateRoundingTimeUnit2) => { GanttDateRoundingTimeUnit2[GanttDateRoundingTimeUnit2["MINUTE"] = 0] = "MINUTE"; GanttDateRoundingTimeUnit2[GanttDateRoundingTimeUnit2["HOUR"] = 1] = "HOUR"; GanttDateRoundingTimeUnit2[GanttDateRoundingTimeUnit2["DAY"] = 2] = "DAY"; return GanttDateRoundingTimeUnit2; })(GanttDateRoundingTimeUnit || {}); function toInteger(dirtyNumber) { if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) { return NaN; } var number = Number(dirtyNumber); if (isNaN(number)) { return number; } return number < 0 ? Math.ceil(number) : Math.floor(number); } function requiredArgs(required, args) { if (args.length < required) { throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present"); } } function _typeof$3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof2(obj2) { return typeof obj2; }; } else { _typeof$3 = function _typeof2(obj2) { return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; }; } return _typeof$3(obj); } function toDate(argument) { requiredArgs(1, arguments); var argStr = Object.prototype.toString.call(argument); if (argument instanceof Date || _typeof$3(argument) === "object" && argStr === "[object Date]") { return new Date(argument.getTime()); } else if (typeof argument === "number" || argStr === "[object Number]") { return new Date(argument); } else { if ((typeof argument === "string" || argStr === "[object String]") && typeof console !== "undefined") { console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"); console.warn(new Error().stack); } return /* @__PURE__ */ new Date(NaN); } } function addMonths(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var date = toDate(dirtyDate); var amount = toInteger(dirtyAmount); if (isNaN(amount)) { return /* @__PURE__ */ new Date(NaN); } if (!amount) { return date; } var dayOfMonth = date.getDate(); var endOfDesiredMonth = new Date(date.getTime()); endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0); var daysInMonth = endOfDesiredMonth.getDate(); if (dayOfMonth >= daysInMonth) { return endOfDesiredMonth; } else { date.setFullYear(endOfDesiredMonth.getFullYear(), endOfDesiredMonth.getMonth(), dayOfMonth); return date; } } function addYears(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addMonths(dirtyDate, amount * 12); } function addDays(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var date = toDate(dirtyDate); var amount = toInteger(dirtyAmount); if (isNaN(amount)) { return /* @__PURE__ */ new Date(NaN); } if (!amount) { return date; } date.setDate(date.getDate() + amount); return date; } function addMilliseconds(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var timestamp = toDate(dirtyDate).getTime(); var amount = toInteger(dirtyAmount); return new Date(timestamp + amount); } var MILLISECONDS_IN_HOUR = 36e5; function addHours(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR); } function subYears(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addYears(dirtyDate, -amount); } function subMonths(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addMonths(dirtyDate, -amount); } function subDays(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addDays(dirtyDate, -amount); } function subHours(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addHours(dirtyDate, -amount); } function addWeeks(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); var days = amount * 7; return addDays(dirtyDate, days); } function subWeeks(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addWeeks(dirtyDate, -amount); } function startOfYear(dirtyDate) { requiredArgs(1, arguments); var cleanDate = toDate(dirtyDate); var date = /* @__PURE__ */ new Date(0); date.setFullYear(cleanDate.getFullYear(), 0, 1); date.setHours(0, 0, 0, 0); return date; } function startOfMonth(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); date.setDate(1); date.setHours(0, 0, 0, 0); return date; } function startOfDay(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); date.setHours(0, 0, 0, 0); return date; } function startOfHour(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); date.setMinutes(0, 0, 0); return date; } var defaultOptions = {}; function getDefaultOptions() { return defaultOptions; } function startOfWeek(dirtyDate, options) { var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); var defaultOptions2 = getDefaultOptions(); var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions2.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions2.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0); if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); } var date = toDate(dirtyDate); var day = date.getDay(); var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; date.setDate(date.getDate() - diff); date.setHours(0, 0, 0, 0); return date; } function startOfQuarter(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var currentMonth = date.getMonth(); var month = currentMonth - currentMonth % 3; date.setMonth(month, 1); date.setHours(0, 0, 0, 0); return date; } function getTimezoneOffsetInMilliseconds(date) { var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); utcDate.setUTCFullYear(date.getFullYear()); return date.getTime() - utcDate.getTime(); } var MILLISECONDS_IN_DAY$1 = 864e5; function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var startOfDayLeft = startOfDay(dirtyDateLeft); var startOfDayRight = startOfDay(dirtyDateRight); var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft); var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight); return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY$1); } function compareLocalAsc(dateLeft, dateRight) { var diff = dateLeft.getFullYear() - dateRight.getFullYear() || dateLeft.getMonth() - dateRight.getMonth() || dateLeft.getDate() - dateRight.getDate() || dateLeft.getHours() - dateRight.getHours() || dateLeft.getMinutes() - dateRight.getMinutes() || dateLeft.getSeconds() - dateRight.getSeconds() || dateLeft.getMilliseconds() - dateRight.getMilliseconds(); if (diff < 0) { return -1; } else if (diff > 0) { return 1; } else { return diff; } } function differenceInDays(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var sign = compareLocalAsc(dateLeft, dateRight); var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)); dateLeft.setDate(dateLeft.getDate() - sign * difference); var isLastDayNotFull = Number(compareLocalAsc(dateLeft, dateRight) === -sign); var result = sign * (difference - isLastDayNotFull); return result === 0 ? 0 : result; } var millisecondsInMinute = 6e4; var millisecondsInHour = 36e5; function differenceInMilliseconds(dateLeft, dateRight) { requiredArgs(2, arguments); return toDate(dateLeft).getTime() - toDate(dateRight).getTime(); } var roundingMap = { ceil: Math.ceil, round: Math.round, floor: Math.floor, trunc: function trunc(value) { return value < 0 ? Math.ceil(value) : Math.floor(value); } // Math.trunc is not supported by IE }; var defaultRoundingMethod = "trunc"; function getRoundingMethod(method) { return method ? roundingMap[method] : roundingMap[defaultRoundingMethod]; } function differenceInHours(dateLeft, dateRight, options) { requiredArgs(2, arguments); var diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour; return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear(); var monthDiff = dateLeft.getMonth() - dateRight.getMonth(); return yearDiff * 12 + monthDiff; } function compareAsc(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var diff = dateLeft.getTime() - dateRight.getTime(); if (diff < 0) { return -1; } else if (diff > 0) { return 1; } else { return diff; } } function endOfDay(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); date.setHours(23, 59, 59, 999); return date; } function endOfMonth(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var month = date.getMonth(); date.setFullYear(date.getFullYear(), month + 1, 0); date.setHours(23, 59, 59, 999); return date; } function isLastDayOfMonth(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); return endOfDay(date).getTime() === endOfMonth(date).getTime(); } function differenceInMonths(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var sign = compareAsc(dateLeft, dateRight); var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight)); var result; if (difference < 1) { result = 0; } else { if (dateLeft.getMonth() === 1 && dateLeft.getDate() > 27) { dateLeft.setDate(30); } dateLeft.setMonth(dateLeft.getMonth() - sign * difference); var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign; if (isLastDayOfMonth(toDate(dirtyDateLeft)) && difference === 1 && compareAsc(dirtyDateLeft, dateRight) === 1) { isLastMonthNotFull = false; } result = sign * (difference - Number(isLastMonthNotFull)); } return result === 0 ? 0 : result; } function differenceInWeeks(dateLeft, dateRight, options) { requiredArgs(2, arguments); var diff = differenceInDays(dateLeft, dateRight) / 7; return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } function differenceInCalendarYears(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); return dateLeft.getFullYear() - dateRight.getFullYear(); } function differenceInYears(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var sign = compareAsc(dateLeft, dateRight); var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)); dateLeft.setFullYear(1584); dateRight.setFullYear(1584); var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign; var result = sign * (difference - Number(isLastYearNotFull)); return result === 0 ? 0 : result; } function differenceInQuarters(dateLeft, dateRight, options) { requiredArgs(2, arguments); var diff = differenceInMonths(dateLeft, dateRight) / 3; return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } const getDatesDiff = (dateFrom, dateTo, viewMode) => { switch (viewMode) { case ViewMode.Day: return differenceInDays(dateFrom, dateTo); case ViewMode.TwoDays: return Math.round(differenceInDays(dateFrom, dateTo) / 2); case ViewMode.HalfDay: return Math.round(differenceInHours(dateFrom, dateTo) / 12); case ViewMode.QuarterDay: return Math.round(differenceInHours(dateFrom, dateTo) / 6); case ViewMode.Hour: return differenceInHours(dateFrom, dateTo); case ViewMode.Month: return differenceInMonths(dateFrom, dateTo); case ViewMode.Week: return differenceInWeeks(dateFrom, dateTo); case ViewMode.QuarterYear: return differenceInQuarters(dateFrom, dateTo); case ViewMode.Year: return differenceInYears(dateFrom, dateTo); default: throw new Error("Unknown view mode"); } }; const ganttDateRange = (tasks, viewMode, preStepsCount) => { let minTaskDate = null; let maxTaskDate = null; for (const task of tasks) { if (task.type !== "empty") { if (!minTaskDate || task.start < minTaskDate) { minTaskDate = task.start; } if (!maxTaskDate || task.end > maxTaskDate) { maxTaskDate = task.end; } } } if (!minTaskDate || !maxTaskDate) { return [/* @__PURE__ */ new Date(), /* @__PURE__ */ new Date(), 2]; } let newStartDate = null; let newEndDate = null; switch (viewMode) { case ViewMode.Year: newStartDate = subYears(minTaskDate, preStepsCount); newStartDate = startOfYear(newStartDate); newEndDate = addYears(maxTaskDate, 1); newEndDate = startOfYear(newEndDate); break; case ViewMode.QuarterYear: newStartDate = subMonths(minTaskDate, preStepsCount * 3); newStartDate = startOfQuarter(newStartDate); newEndDate = addMonths(maxTaskDate, 3); newEndDate = startOfQuarter(addMonths(newEndDate, 3)); break; case ViewMode.Month: newStartDate = subMonths(minTaskDate, preStepsCount); newStartDate = startOfMonth(newStartDate); newEndDate = addYears(maxTaskDate, 1); newEndDate = startOfYear(newEndDate); break; case ViewMode.Week: newStartDate = startOfWeek(minTaskDate); newStartDate = subWeeks(newStartDate, preStepsCount); newEndDate = startOfDay(maxTaskDate); newEndDate = addMonths(newEndDate, 1.5); break; case ViewMode.TwoDays: newStartDate = startOfDay(minTaskDate); newStartDate = subDays(newStartDate, preStepsCount); newEndDate = startOfDay(maxTaskDate); newEndDate = addDays(newEndDate, 19); break; case ViewMode.Day: newStartDate = startOfDay(minTaskDate); newStartDate = subDays(newStartDate, preStepsCount); newEndDate = startOfDay(maxTaskDate); newEndDate = addDays(newEndDate, 30); break; case ViewMode.QuarterDay: newStartDate = startOfDay(minTaskDate); newStartDate = subHours(newStartDate, preStepsCount * 6); newEndDate = startOfDay(maxTaskDate); newEndDate = addHours(newEndDate, 66); break; case ViewMode.HalfDay: newStartDate = startOfDay(minTaskDate); newStartDate = subHours(newStartDate, preStepsCount * 12); newEndDate = startOfDay(maxTaskDate); newEndDate = addHours(newEndDate, 108); break; case ViewMode.Hour: newStartDate = startOfHour(minTaskDate); newStartDate = subHours(newStartDate, preStepsCount); newEndDate = startOfDay(maxTaskDate); newEndDate = addDays(newEndDate, 1); break; } return [ newStartDate, minTaskDate, getDatesDiff(newEndDate, newStartDate, viewMode) ]; }; const getWeekNumberISO8601 = (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()) / 6048e5)).toString(); if (weekNumber.length === 1) { return `0${weekNumber}`; } else { return weekNumber; } }; const getDaysInMonth = (month, year) => { return new Date(year, month + 1, 0).getDate(); }; const ganttTable_Header = "_ganttTable_Header_7mmcq_1"; const ganttTable_HeaderSeparator = "_ganttTable_HeaderSeparator_7mmcq_8"; const ganttTable_HeaderContent = "_ganttTable_HeaderContent_7mmcq_15"; const ganttTable_HeaderTitle = "_ganttTable_HeaderTitle_7mmcq_21"; const ganttTable_HeaderItem = "_ganttTable_HeaderItem_7mmcq_25"; const resizer = "_resizer_7mmcq_38"; const styles$j = { ganttTable_Header, ganttTable_HeaderSeparator, ganttTable_HeaderContent, ganttTable_HeaderTitle, ganttTable_HeaderItem, resizer }; const taskListHeaderAction = "_taskListHeaderAction_j1iwy_1"; const style$1 = { taskListHeaderAction }; const TaskListHeaderActions = ({ onCollapseAll, onExpandFirstLevel, onExpandAll, colors }) => { let themeOptions = { palette: { primary: { main: colors.barLabelColor // Maps to a primary color (e.g., task bar background) }, secondary: { main: colors.barLabelColor // Maps to a secondary color (e.g., task progress) }, background: { default: colors.evenTaskBackgroundColor, // Background color for even tasks paper: colors.oddTaskBackgroundColor // Background color for odd tasks or paper elements }, text: { primary: colors.barLabelColor, // Main text color (bar labels, etc.) secondary: colors.barLabelColor // Context menu text color } }, components: { MuiButton: { styleOverrides: { root: { color: colors.barLabelColor // Use the bar label color for button text } } }, MuiTooltip: { styleOverrides: { tooltip: { backgroundColor: colors.contextMenuBgColor, // Tooltip background color color: colors.contextMenuTextColor // Tooltip text color } } }, MuiSvgIcon: { styleOverrides: { root: { color: colors.barLabelColor, // Apply primary icon color to all icons "&.MuiSvgIcon-colorSecondary": { color: colors.barLabelWhenOutsideColor // Apply secondary color to icons } } } } } }; const materialLightTheme = createTheme(themeOptions); return /* @__PURE__ */ jsx(ThemeProvider, { theme: materialLightTheme, children: /* @__PURE__ */ jsxs("div", { className: style$1.taskListHeaderAction, children: [ /* @__PURE__ */ jsx(Tooltip$1, { title: "Collapse All", children: /* @__PURE__ */ jsx(IconButton, { onClick: onCollapseAll, children: /* @__PURE__ */ jsx(UnfoldLess, {}) }) }), /* @__PURE__ */ jsx(Tooltip$1, { title: "Expand First Level", children: /* @__PURE__ */ jsx(IconButton, { onClick: onExpandFirstLevel, children: /* @__PURE__ */ jsx(UnfoldMore, {}) }) }), /* @__PURE__ */ jsx(Tooltip$1, { title: "Expand All", children: /* @__PURE__ */ jsx(IconButton, { onClick: onExpandAll, children: /* @__PURE__ */ jsx(UnfoldMoreDouble, {}) }) }) ] }) }); }; const TaskListHeaderDefaultInner = (props) => { const { headerHeight, fontFamily, fontSize, columns, canResizeColumns, onColumnResizeStart, onCollapseAll, onExpandFirstLevel, onExpandAll, colors } = props; return /* @__PURE__ */ jsx( "div", { className: styles$j.ganttTable_Header, style: { height: headerHeight, fontFamily, fontSize }, children: columns.map(({ title, width, canResize }, index2) => { return /* @__PURE__ */ jsxs(Fragment, { children: [ index2 > 0 && /* @__PURE__ */ jsx( "div", { className: styles$j.ganttTable_HeaderSeparator, style: { height: headerHeight * 0.5, marginTop: headerHeight * 0.2 } } ), /* @__PURE__ */ jsxs( "div", { "data-testid": `table-column-header-${title}`, className: styles$j.ganttTable_HeaderItem, style: { minWidth: width, maxWidth: width }, children: [ /* @__PURE__ */ jsxs("div", { className: styles$j.ganttTable_HeaderContent, children: [ /* @__PURE__ */ jsx("div", { className: styles$j.ganttTable_HeaderTitle, children: title }), title === "Name" && /* @__PURE__ */ jsx( TaskListHeaderActions, { onCollapseAll, onExpandFirstLevel, onExpandAll, colors } ) ] }), canResizeColumns && canResize !== false && /* @__PURE__ */ jsx( "div", { "data-testid": `table-column-header-resize-handle-${title}`, className: styles$j.resizer, onMouseDown: (event) => { onColumnResizeStart(index2, event.clientX); }, onTouchStart: (event) => { const firstTouch = event.touches[0]; if (firstTouch) { onColumnResizeStart(index2, firstTouch.clientX); } } } ) ] } ) ] }, index2); }) } ); }; const TaskListHeaderDefault = memo(TaskListHeaderDefaultInner); const checkHasChildren = (task, childTasksMap) => { const { id, comparisonLevel = 1 } = task; const childIdsByLevel = childTasksMap.get(comparisonLevel); if (!childIdsByLevel) { return false; } const childs = childIdsByLevel.get(id); if (!childs) { return false; } return childs.length > 0; }; const taskListTableRow = "_taskListTableRow_w35p0_1"; const taskListTableRowGrabbing = "_taskListTableRowGrabbing_w35p0_7"; const cut = "_cut_w35p0_11"; const taskListCell = "_taskListCell_w35p0_15"; const taskListCellInner = "_taskListCellInner_w35p0_24"; const dropAfter = "_dropAfter_w35p0_29"; const dropAfterLighten = "_dropAfterLighten_w35p0_41"; const dropBefore = "_dropBefore_w35p0_53"; const dropBeforeLighten = "_dropBeforeLighten_w35p0_64"; const styles$i = { taskListTableRow, taskListTableRowGrabbing, cut, taskListCell, taskListCellInner, dropAfter, dropAfterLighten, dropBefore, dropBeforeLighten }; const TaskListTableRowInner = ({ canMoveTasks, colors, columns, dateSetup, dependencyMap, depth, distances, fullRowHeight, getTaskCurrentState, handleAddTask, handleDeleteTasks, handleEditTask, handleMoveTaskBefore, handleMoveTaskAfter, handleMoveTasksInside, handleOpenContextMenu, hasChildren, icons = void 0, indexStr, isClosed, isCut, isEven, isSelected, isShowTaskNumbers, onClick, onExpanderClick, scrollToTask, selectTaskOnMouseDown, style: style2 = void 0, task, tasks, draggedTask, setDraggedTask }) => { const { id, comparisonLevel = 1 } = task; const onRootMouseDown = useCallback( (event) => { if (event.button !== 0) { return; } if (task.type !== "empty") { scrollToTask(task); } selectTaskOnMouseDown(task.id, event); onClick(task); }, [scrollToTask, selectTaskOnMouseDown, task] ); const onContextMenu = useCallback( (event) => { event.preventDefault(); handleOpenContextMenu(task, event.clientX, event.clientY); }, [handleOpenContextMenu, task] ); const isDraggedTaskAncestorOfDropTarget = (draggedItem) => { let idToTaskIndex = new Map(tasks.map((task2, index2) => [task2.id, index2])); let parentId = task.parent; const parentsId = []; while (parentId) { parentsId.push(parentId); parentId = tasks[idToTaskIndex.get(parentId)].parent; } return parentsId.includes(draggedItem.id); }; const dependencies = useMemo(() => { const dependenciesAtLevel = dependencyMap.get(comparisonLevel); if (!dependenciesAtLevel) { return []; } const dependenciesByTask = dependenciesAtLevel.get(id); if (!dependenciesByTask) { return []; } return dependenciesByTask.map(({ source }) => source); }, [comparisonLevel, dependencyMap, id]); const columnData = useMemo( () => ({ canMoveTasks, dateSetup, dependencies, depth, distances, handleDeleteTasks, handleAddTask, handleEditTask, hasChildren, icons, indexStr, isClosed, isShowTaskNumbers, onExpanderClick, task, //: task.type === "empty" ? task : getTaskCurrentState(task), colors }), [ canMoveTasks, dateSetup, dependencies, depth, distances, getTaskCurrentState, handleDeleteTasks, handleAddTask, handleEditTask, hasChildren, icons, indexStr, isClosed, isShowTaskNumbers, onExpanderClick, task, colors ] ); const dropPreviewOffset = distances.nestedTaskNameOffset * depth + distances.expandIconWidth; const [hoveringState, setHoveringState] = useState({ hoveringBefore: false, hoveringInside: false, hoveringAfter: false }); let backgroundColor = isSelected ? colors.selectedTaskBackgroundColor : isEven && !hoveringState.hoveringInside ? colors.evenTaskBackgroundColor : colors.oddTaskBackgroundColor; if (hoveringState.hoveringInside && !hoveringState.hoveringAfter && !hoveringState.hoveringBefore) { backgroundColor = colors.taskDragColor; } const handleDragStart = (event) => { setDraggedTask(task); event.dataTransfer.setData("draggedTask", task == null ? void 0 : task.id); }; const handleDragOver = (event) => { event.preventDefault(); }; const handleDragEnd = () => { setDraggedTask(null); }; const canDropBefore = () => { let canDropBefore2 = false; if (draggedTask) { const hoveringOnBrother = draggedTask.parent === task.parent && tasks.findIndex((t2) => t2.id === draggedTask.id) === tasks.findIndex((t2) => t2.id === task.id) - 1; if (!hoveringOnBrother && draggedTask.id !== task.id) { canDropBefore2 = !isDraggedTaskAncestorOfDropTarget(draggedTask); } } return canDropBefore2; }; const dropBefore2 = () => { if (canDropBefore()) { handleMoveTaskBefore(task, draggedTask); } setHoveringState({ hoveringBefore: false, hoveringInside: false, hoveringAfter: false }); }; const canDropAfter = () => { let canDropAfter2 = false; if (draggedTask) { const hoveringOnBrother = draggedTask.parent === task.parent && tasks.findIndex((t2) => t2.id === draggedTask.id) === tasks.findIndex((t2) => t2.id === task.id) + 1; if (!hoveringOnBrother && draggedTask.id !== task.id) { canDropAfter2 = !isDraggedTaskAncestorOfDropTarget(draggedTask); } } return canDropAfter2; }; const dropAfter2 = () => { if (canDropAfter()) { handleMoveTaskAfter(task, draggedTask); } setHoveringState({ hoveringBefore: false, hoveringInside: false, hoveringAfter: false }); }; const canDropInside = () => { let canDropInside2 = false; if (task.type !== "empty" && task.type !== "milestone") { if (draggedTask) { if (!isDraggedTaskAncestorOfDropTarget(draggedTask)) { canDropInside2 = draggedTask.id !== id || (draggedTask.comparisonLevel || 1) !== comparisonLevel; } } } return canDropInside2; }; const dropInside = () => { if (canDropInside() && task.type !== "empty") { handleMoveTasksInside(task, [draggedTask]); } setHoveringState({ hoveringBefore: false, hoveringInside: false, hoveringAfter: false }); }; return /* @__PURE__ */ jsxs( "div", { className: `${styles$i.taskListTableRow} ${isCut ? styles$i.cut : ""}`, onMouseDown: onRootMouseDown, style: { height: fullRowHeight, backgroundColor, ...style2 }, onContextMenu, draggable: true, onDragStart: handleDragStart, onDragOver: handleDragOver, onDragEnd: handleDragEnd, children: [ columns.map((column, index2) => { const { Cell, width } = column; return /* @__PURE__ */ jsx( "div", { className: styles$i.taskListCell, style: { minWidth: width, maxWidth: width }, children: /* @__PURE__ */ jsx( "div", { className: styles$i.taskListCellInner, onDragEnter: () => { setHoveringState({ hoveringBefore: false, hoveringInside: canDropInside(), hoveringAfter: false }); }, onDragLeave: () => { setHoveringState((prevState) => { return { ...prevState, hoveringInside: false }; }); }, onDragOver: (event) => { event.preventDefault(); event.dataTransfer.dropEffect = canDropInside() ? "move" : "none"; }, onDrop: dropInside, style: { height: Math.max(0, fullRowHeight - 2 * 8) }, children: /* @__PURE__ */ jsx( "div", { style: { pointerEvents: hoveringState.hoveringInside ? "none" : "auto" }, children: /* @__PURE__ */ jsx(Cell, { data: columnData }) } ) } ) }, index2 ); }), /* @__PURE__ */ jsx( "div", { "data-testid": `table-row-drop-before-${task.name}`, className: `${styles$i.dropBefore} ${hoveringState.hoveringBefore ? styles$i.dropBeforeLighten : ""}`, style: { left: dropPreviewOffset, backgroundColor: hoveringState.hoveringBefore ? colors.taskDragColor : void 0, color: hoveringState.hoveringBefore ? colors.taskDragColor : void 0 }, onDragEnter: (event) => { event.preventDefault(); setHoveringState({ hoveringBefore: canDropBefore(), hoveringInside: false, hoveringAfter: false }); }, onDragLeave: () => { setHoveringState((prevState) => { return { ...prevState, hoveringBefore: false }; }); }, onDragOver: (event) => { event.preventDefault(); event.dataTransfer.dropEffect = canDropBefore() ? "move" : "none"; }, onDrop: dropBefore2 } ), /* @__PURE__ */ jsx( "div", { "data-testid": `table-row-drop-after-${task.name}`, className: `${styles$i.dropAfter} ${hoveringState.hoveringAfter ? styles$i.dropBeforeLighten : ""}`, style: { left: dropPreviewOffset, backgroundColor: hoveringState.hoveringAfter ? colors.taskDragColor : void 0, color: hoveringState.hoveringAfter ? colors.taskDragColor : void 0 }, onDragEnter: () => setHoveringState({ hoveringBefore: false, hoveringInside: false, hoveringAfter: canDropAfter() }), onDragLeave: () => setHoveringState((prevState) => { return { ...prevState, hoveringAfter: false }; }), onDragOver: (event) => { event.preventDefault(); event.dataTransfer.dropEffect = canDropAfter() ? "move" : "none"; }, onDrop: dropAfter2 } ) ] } ); }; const TaskListTableRow = memo(TaskListTableRowInner); const taskListWrapper = "_taskListWrapper_yx1w7_1"; const styles$h = { taskListWrapper }; const TaskListTableDefaultInner = ({ canMoveTasks, childTasksMap, colors, columns, cutIdsMirror, dateSetup, dependencyMap, distances, fontFamily, fontSize, fullRowHeight, getTaskCurrentState, handleAddTask, handleDeleteTasks, handleEditTask, handleMoveTaskBefore, handleMoveTaskAfter, handleMoveTasksInside, handleOpenContextMenu, icons, isShowTaskNumbers, mapTaskToNestedIndex, onClick, onExpanderClick, renderedIndexes, scrollToTask, selectTaskOnMouseDown, selectedIdsMirror, tasks }) => { const renderedTasks = useMemo( /** * TO DO: maybe consider tasks on other levels? */ () => tasks.filter((task) => !task.comparisonLevel || task.comparisonLevel === 1), [tasks] ); const [draggedTask, setDraggedTask] = useState(null); const renderedListWithOffset = useMemo(() => { if (!renderedIndexes) { return null; } const [start, end] = renderedIndexes; const renderedList = []; for (let index2 = start; index2 <= end; ++index2) { const task = renderedTasks[index2]; if (!task) { break; } const { id, comparisonLevel = 1 } = task; const indexesOnLevel = mapTaskToNestedIndex.get(comparisonLevel); if (!indexesOnLevel) { throw new Error(`Indexes are not found for level ${comparisonLevel}`); } const taskIndex = indexesOnLevel.get(id); if (!taskIndex) { throw new Error(`Index is not found for task ${id}`); } const [depth, indexStr] = taskIndex; renderedList.push( /* @__PURE__ */ jsx( TaskListTableRow, { canMoveTasks, colors, columns, dateSetup, dependencyMap, depth, distances, fullRowHeight, getTaskCurrentState, handleAddTask, handleDeleteTasks, handleEditTask, handleMoveTaskBefore, handleMoveTaskAfter, handleMoveTasksInside, handleOpenContextMenu, hasChildren: checkHasChildren(task, childTasksMap), icons, indexStr, isClosed: Boolean(task == null ? void 0 : task.hideChildren), isCut: cutIdsMirror[id], isEven: index2 % 2 === 1,