hs-uix 2.1.1 → 2.2.0
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.
- package/README.md +3 -1
- package/common-components.d.ts +319 -68
- package/dist/calendar.js +355 -57
- package/dist/calendar.mjs +356 -57
- package/dist/common-components.js +3546 -88
- package/dist/common-components.mjs +3530 -84
- package/dist/datatable.js +108 -18
- package/dist/datatable.mjs +108 -18
- package/dist/experimental.js +2876 -0
- package/dist/experimental.mjs +2883 -0
- package/dist/feed.js +267 -38
- package/dist/feed.mjs +260 -37
- package/dist/filter.js +1379 -0
- package/dist/filter.mjs +1334 -0
- package/dist/form.js +222 -26
- package/dist/form.mjs +227 -27
- package/dist/index.js +3208 -287
- package/dist/index.mjs +3156 -283
- package/dist/kanban.js +282 -62
- package/dist/kanban.mjs +273 -61
- package/dist/safe.js +9207 -0
- package/dist/safe.mjs +9298 -0
- package/dist/utils.js +491 -75
- package/dist/utils.mjs +491 -75
- package/experimental.d.ts +1 -0
- package/filter.d.ts +1 -0
- package/index.d.ts +45 -3
- package/package.json +19 -1
- package/safe.d.ts +1 -0
- package/src/calendar/README.md +74 -5
- package/src/calendar/index.d.ts +95 -1
- package/src/common-components/README.md +140 -1
- package/src/datatable/README.md +0 -2
- package/src/experimental/README.md +126 -0
- package/src/experimental/index.d.ts +346 -0
- package/src/feed/README.md +69 -0
- package/src/feed/index.d.ts +103 -0
- package/src/filter/README.md +148 -0
- package/src/filter/index.d.ts +221 -0
- package/src/form/README.md +132 -4
- package/src/form/index.d.ts +82 -1
- package/src/kanban/README.md +119 -6
- package/src/kanban/index.d.ts +153 -2
- package/src/safe/README.md +108 -0
- package/src/safe/index.d.ts +158 -0
- package/src/utils/README.md +39 -0
- package/src/wizard/README.md +158 -0
- package/src/wizard/index.d.ts +138 -0
- package/utils.d.ts +17 -0
package/dist/calendar.js
CHANGED
|
@@ -343,7 +343,7 @@ var GENERATED_ICONS = {
|
|
|
343
343
|
"ZoomOut": { "viewBox": "0 0 32 32", "paths": ["M14.42 26.75c2.85 0 5.47-.97 7.56-2.6l-.03.02 5.28 5.34a1.619 1.619 0 0 0 2.76-1.15c0-.45-.18-.85-.47-1.14l-5.33-5.33c1.59-2.06 2.55-4.68 2.55-7.52C26.74 7.54 21.2 2 14.37 2S2 7.55 2 14.38s5.54 12.37 12.37 12.37h.05m0-21.55c5.06 0 9.16 4.1 9.16 9.16s-4.1 9.16-9.16 9.16-9.16-4.1-9.16-9.16c.01-5.05 4.11-9.14 9.16-9.15Zm-4.31 10.78h8.62c.89 0 1.62-.72 1.62-1.62s-.72-1.62-1.62-1.62h-8.62c-.89 0-1.62.72-1.62 1.62s.72 1.62 1.62 1.62"] }
|
|
344
344
|
};
|
|
345
345
|
|
|
346
|
-
// src/common-components/
|
|
346
|
+
// src/common-components/nativeIconNames.js
|
|
347
347
|
var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
|
|
348
348
|
"add",
|
|
349
349
|
"appointment",
|
|
@@ -355,12 +355,12 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
|
|
|
355
355
|
"block",
|
|
356
356
|
"book",
|
|
357
357
|
"bulb",
|
|
358
|
+
"callTranscript",
|
|
358
359
|
"calling",
|
|
359
360
|
"callingHangup",
|
|
360
361
|
"callingMade",
|
|
361
362
|
"callingMissed",
|
|
362
363
|
"callingVoicemail",
|
|
363
|
-
"callTranscript",
|
|
364
364
|
"campaigns",
|
|
365
365
|
"cap",
|
|
366
366
|
"checkCircle",
|
|
@@ -389,13 +389,13 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
|
|
|
389
389
|
"enroll",
|
|
390
390
|
"exclamation",
|
|
391
391
|
"exclamationCircle",
|
|
392
|
-
"facebook",
|
|
393
392
|
"faceHappy",
|
|
394
393
|
"faceHappyFilled",
|
|
395
394
|
"faceNeutral",
|
|
396
395
|
"faceNeutralFilled",
|
|
397
396
|
"faceSad",
|
|
398
397
|
"faceSadFilled",
|
|
398
|
+
"facebook",
|
|
399
399
|
"favoriteHollow",
|
|
400
400
|
"file",
|
|
401
401
|
"filledXCircleIcon",
|
|
@@ -536,6 +536,8 @@ var NATIVE_ICON_NAMES = /* @__PURE__ */ new Set([
|
|
|
536
536
|
"zoomIn",
|
|
537
537
|
"zoomOut"
|
|
538
538
|
]);
|
|
539
|
+
|
|
540
|
+
// src/common-components/Icon.js
|
|
539
541
|
var NATIVE_COLORS = /* @__PURE__ */ new Set(["inherit", "alert", "warning", "success"]);
|
|
540
542
|
var NATIVE_SIZE_TOKENS = {
|
|
541
543
|
sm: "sm",
|
|
@@ -748,6 +750,7 @@ var CollectionFilterControl = ({
|
|
|
748
750
|
{ key: name, direction: "row", align: "center", gap: "xs" },
|
|
749
751
|
h2(import_ui_extensions3.DateInput, {
|
|
750
752
|
name: `${controlName}-from`,
|
|
753
|
+
label: filter.fromLabel ?? labels.dateFrom,
|
|
751
754
|
placeholder: filter.fromLabel ?? labels.dateFrom,
|
|
752
755
|
format: "medium",
|
|
753
756
|
value: rangeValue.from ?? null,
|
|
@@ -756,6 +759,7 @@ var CollectionFilterControl = ({
|
|
|
756
759
|
h2(Icon, { name: "right", size: "sm" }),
|
|
757
760
|
h2(import_ui_extensions3.DateInput, {
|
|
758
761
|
name: `${controlName}-to`,
|
|
762
|
+
label: filter.toLabel ?? labels.dateTo,
|
|
759
763
|
placeholder: filter.toLabel ?? labels.dateTo,
|
|
760
764
|
format: "medium",
|
|
761
765
|
value: rangeValue.to ?? null,
|
|
@@ -1229,9 +1233,172 @@ var makeSpacerDataUri = (height = 24, width = 4) => {
|
|
|
1229
1233
|
return { src: toDataUri(svg), width, height };
|
|
1230
1234
|
};
|
|
1231
1235
|
|
|
1236
|
+
// src/calendar/rescheduleUtils.js
|
|
1237
|
+
var shiftDate = (date, shift) => {
|
|
1238
|
+
const d = toDate(date);
|
|
1239
|
+
if (!d) return null;
|
|
1240
|
+
if (!shift || typeof shift !== "object") return new Date(d);
|
|
1241
|
+
const days = (shift.days || 0) + (shift.weeks || 0) * 7;
|
|
1242
|
+
let next = days ? addDays(d, days) : new Date(d);
|
|
1243
|
+
const ms = (shift.hours || 0) * 36e5 + (shift.minutes || 0) * 6e4;
|
|
1244
|
+
if (ms) next = new Date(next.getTime() + ms);
|
|
1245
|
+
return next;
|
|
1246
|
+
};
|
|
1247
|
+
var shiftEvent = (range, shift) => {
|
|
1248
|
+
const start = toDate(range && range.start);
|
|
1249
|
+
if (!start) return null;
|
|
1250
|
+
const end = toDate(range && range.end) || start;
|
|
1251
|
+
return { start: shiftDate(start, shift), end: shiftDate(end, shift) };
|
|
1252
|
+
};
|
|
1253
|
+
var calendarDayDelta = (a, b) => Math.round((startOfDay(b).getTime() - startOfDay(a).getTime()) / MS_PER_DAY);
|
|
1254
|
+
var msIntoDay = (d) => ((d.getHours() * 60 + d.getMinutes()) * 60 + d.getSeconds()) * 1e3 + d.getMilliseconds();
|
|
1255
|
+
var rescheduleToStart = (range, newStart) => {
|
|
1256
|
+
const start = toDate(range && range.start);
|
|
1257
|
+
const target = toDate(newStart);
|
|
1258
|
+
if (!start || !target) return null;
|
|
1259
|
+
const end = toDate(range && range.end) || start;
|
|
1260
|
+
const dayDelta = calendarDayDelta(start, target);
|
|
1261
|
+
const timeDelta = msIntoDay(target) - msIntoDay(start);
|
|
1262
|
+
const endOnDay = addDays(end, dayDelta);
|
|
1263
|
+
if (!timeDelta) return { start: target, end: endOnDay };
|
|
1264
|
+
return {
|
|
1265
|
+
start: target,
|
|
1266
|
+
end: new Date(
|
|
1267
|
+
endOnDay.getFullYear(),
|
|
1268
|
+
endOnDay.getMonth(),
|
|
1269
|
+
endOnDay.getDate(),
|
|
1270
|
+
0,
|
|
1271
|
+
0,
|
|
1272
|
+
0,
|
|
1273
|
+
msIntoDay(endOnDay) + timeDelta
|
|
1274
|
+
)
|
|
1275
|
+
};
|
|
1276
|
+
};
|
|
1277
|
+
var applyDatePick = (start, value) => {
|
|
1278
|
+
if (!isDateValueObject(value)) return null;
|
|
1279
|
+
const s = toDate(start);
|
|
1280
|
+
return new Date(
|
|
1281
|
+
value.year,
|
|
1282
|
+
value.month,
|
|
1283
|
+
value.date,
|
|
1284
|
+
s ? s.getHours() : 0,
|
|
1285
|
+
s ? s.getMinutes() : 0,
|
|
1286
|
+
s ? s.getSeconds() : 0,
|
|
1287
|
+
s ? s.getMilliseconds() : 0
|
|
1288
|
+
);
|
|
1289
|
+
};
|
|
1290
|
+
var DEFAULT_RESCHEDULE_PRESETS = [
|
|
1291
|
+
{ label: "+1 hour", shift: { hours: 1 } },
|
|
1292
|
+
{ label: "+1 day", shift: { days: 1 } },
|
|
1293
|
+
{ label: "Next week", shift: { weeks: 1 } }
|
|
1294
|
+
];
|
|
1295
|
+
var normalizeRescheduleOptions = (options) => {
|
|
1296
|
+
if (!options) return [];
|
|
1297
|
+
if (options === true) return DEFAULT_RESCHEDULE_PRESETS;
|
|
1298
|
+
if (!Array.isArray(options)) return [];
|
|
1299
|
+
const out = [];
|
|
1300
|
+
for (const opt of options) {
|
|
1301
|
+
if (typeof opt === "function") {
|
|
1302
|
+
out.push({ label: opt.label || opt.name || "Reschedule", getStart: opt });
|
|
1303
|
+
} else if (opt && typeof opt === "object" && opt.label != null) {
|
|
1304
|
+
if (typeof opt.shift === "function") {
|
|
1305
|
+
out.push({ label: opt.label, getStart: opt.shift });
|
|
1306
|
+
} else if (typeof opt.getStart === "function") {
|
|
1307
|
+
out.push({ label: opt.label, getStart: opt.getStart });
|
|
1308
|
+
} else if (opt.shift && typeof opt.shift === "object") {
|
|
1309
|
+
out.push({ label: opt.label, shift: opt.shift });
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
return out;
|
|
1314
|
+
};
|
|
1315
|
+
var resolveRescheduleTarget = (range, option, fnArg) => {
|
|
1316
|
+
if (!range || !toDate(range.start) || !option) return null;
|
|
1317
|
+
if (typeof option.getStart === "function") {
|
|
1318
|
+
const next = toDate(option.getStart(fnArg !== void 0 ? fnArg : range));
|
|
1319
|
+
return next ? rescheduleToStart(range, next) : null;
|
|
1320
|
+
}
|
|
1321
|
+
if (option.shift && typeof option.shift === "object") {
|
|
1322
|
+
return shiftEvent(range, option.shift);
|
|
1323
|
+
}
|
|
1324
|
+
return null;
|
|
1325
|
+
};
|
|
1326
|
+
|
|
1327
|
+
// src/calendar/resourceLanes.js
|
|
1328
|
+
var resolveResourceId = (record, spec) => {
|
|
1329
|
+
if (record == null || spec == null) return null;
|
|
1330
|
+
const value = typeof spec === "function" ? spec(record) : record[spec];
|
|
1331
|
+
if (value == null || value === "") return null;
|
|
1332
|
+
return value;
|
|
1333
|
+
};
|
|
1334
|
+
var buildResourceLanes = (events, options = {}) => {
|
|
1335
|
+
const {
|
|
1336
|
+
resources,
|
|
1337
|
+
resourceLabels,
|
|
1338
|
+
getId,
|
|
1339
|
+
showUnassignedLane = true,
|
|
1340
|
+
unassignedLabel = "Unassigned"
|
|
1341
|
+
} = options;
|
|
1342
|
+
const labelFor = (id) => {
|
|
1343
|
+
if (resourceLabels && resourceLabels[id] != null) return resourceLabels[id];
|
|
1344
|
+
return String(id);
|
|
1345
|
+
};
|
|
1346
|
+
const lanes = [];
|
|
1347
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
1348
|
+
const addLane = (id, label, declared) => {
|
|
1349
|
+
const key = String(id);
|
|
1350
|
+
if (byKey.has(key)) return byKey.get(key);
|
|
1351
|
+
const lane = { id, key, label, events: [], unassigned: false, declared };
|
|
1352
|
+
byKey.set(key, lane);
|
|
1353
|
+
lanes.push(lane);
|
|
1354
|
+
return lane;
|
|
1355
|
+
};
|
|
1356
|
+
(resources || []).forEach((resource) => {
|
|
1357
|
+
if (resource == null) return;
|
|
1358
|
+
if (typeof resource === "object") {
|
|
1359
|
+
addLane(resource.id, resource.label != null ? resource.label : labelFor(resource.id), true);
|
|
1360
|
+
} else {
|
|
1361
|
+
addLane(resource, labelFor(resource), true);
|
|
1362
|
+
}
|
|
1363
|
+
});
|
|
1364
|
+
const unassigned = {
|
|
1365
|
+
id: null,
|
|
1366
|
+
key: "__unassigned__",
|
|
1367
|
+
label: unassignedLabel,
|
|
1368
|
+
events: [],
|
|
1369
|
+
unassigned: true,
|
|
1370
|
+
declared: false
|
|
1371
|
+
};
|
|
1372
|
+
(events || []).forEach((event) => {
|
|
1373
|
+
const id = getId ? getId(event) : null;
|
|
1374
|
+
if (id == null || id === "") {
|
|
1375
|
+
unassigned.events.push(event);
|
|
1376
|
+
return;
|
|
1377
|
+
}
|
|
1378
|
+
const lane = byKey.get(String(id)) || addLane(id, labelFor(id), false);
|
|
1379
|
+
lane.events.push(event);
|
|
1380
|
+
});
|
|
1381
|
+
if (showUnassignedLane && unassigned.events.length > 0) lanes.push(unassigned);
|
|
1382
|
+
return lanes;
|
|
1383
|
+
};
|
|
1384
|
+
var eventsIntersectingRange = (events, rangeStart, rangeEnd) => {
|
|
1385
|
+
const rs = rangeStart.getTime();
|
|
1386
|
+
const re = rangeEnd.getTime();
|
|
1387
|
+
return (events || []).filter((event) => {
|
|
1388
|
+
if (!event || !event.start) return false;
|
|
1389
|
+
const es = event.start.getTime();
|
|
1390
|
+
const ee = (event.end || event.start).getTime();
|
|
1391
|
+
return es <= re && ee >= rs;
|
|
1392
|
+
});
|
|
1393
|
+
};
|
|
1394
|
+
var laneEventsForDay = (events, day) => eventsIntersectingRange(events, startOfDay(day), endOfDay(day)).sort(
|
|
1395
|
+
(a, b) => a.start.getTime() - b.start.getTime()
|
|
1396
|
+
);
|
|
1397
|
+
|
|
1232
1398
|
// src/calendar/Calendar.jsx
|
|
1233
1399
|
var DEFAULT_MAX_EVENTS_PER_DAY = 3;
|
|
1234
1400
|
var ALL_VIEWS = ["month", "week", "day", "agenda"];
|
|
1401
|
+
var ALL_VIEWS_WITH_RESOURCE = ["month", "week", "day", "resource", "agenda"];
|
|
1235
1402
|
var DEFAULT_DAY_START_HOUR = 8;
|
|
1236
1403
|
var DEFAULT_DAY_END_HOUR = 20;
|
|
1237
1404
|
var DEFAULT_TIME_ZONES = [
|
|
@@ -1267,7 +1434,8 @@ var VIEW_LABELS = {
|
|
|
1267
1434
|
month: "Month",
|
|
1268
1435
|
week: "Week",
|
|
1269
1436
|
day: "Day",
|
|
1270
|
-
agenda: "Agenda"
|
|
1437
|
+
agenda: "Agenda",
|
|
1438
|
+
resource: "Resource"
|
|
1271
1439
|
};
|
|
1272
1440
|
var DEFAULT_LABELS3 = {
|
|
1273
1441
|
today: "Today",
|
|
@@ -1284,7 +1452,11 @@ var DEFAULT_LABELS3 = {
|
|
|
1284
1452
|
errorMessage: "An error occurred while loading events.",
|
|
1285
1453
|
dayDetailTitle: (label) => label,
|
|
1286
1454
|
open: "Open",
|
|
1287
|
-
allDay: "All day"
|
|
1455
|
+
allDay: "All day",
|
|
1456
|
+
reschedule: "Reschedule",
|
|
1457
|
+
pickDate: "Pick date",
|
|
1458
|
+
unassigned: "Unassigned",
|
|
1459
|
+
resource: "Resource"
|
|
1288
1460
|
};
|
|
1289
1461
|
var DEFAULT_EVENT_FIELDS = {
|
|
1290
1462
|
id: "id",
|
|
@@ -1340,8 +1512,9 @@ var truncateMonthLabel = (value, max) => {
|
|
|
1340
1512
|
var MONTH_COL_WIDTH = 160;
|
|
1341
1513
|
var TIMEGRID_DAY_COL = 150;
|
|
1342
1514
|
var TIMEGRID_DAY_COL_SINGLE = 560;
|
|
1515
|
+
var RESOURCE_LABEL_COL_WIDTH = "min";
|
|
1343
1516
|
var HOUR_SLOT_HEIGHT = 64;
|
|
1344
|
-
var EventDetail = ({ event, labels }) => {
|
|
1517
|
+
var EventDetail = ({ event, labels, reschedule, idSuffix = "" }) => {
|
|
1345
1518
|
const { start, end, title, subtitle, href } = event;
|
|
1346
1519
|
let when = "";
|
|
1347
1520
|
if (start) {
|
|
@@ -1355,11 +1528,27 @@ var EventDetail = ({ event, labels }) => {
|
|
|
1355
1528
|
when = `${formatDayTitle(start)} \u2013 ${formatDayTitle(end)}`;
|
|
1356
1529
|
}
|
|
1357
1530
|
}
|
|
1358
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" }, truncate: true }, title || "--"), when ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, when) : null, subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, subtitle) : null, href ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { href: href.url, external: href.external }, labels.open) : null)
|
|
1531
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" }, truncate: true }, title || "--"), when ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, when) : null, subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, subtitle) : null, href ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { href: href.url, external: href.external }, labels.open) : null, reschedule ? /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: "demibold" } }, labels.reschedule), reschedule.options.length > 0 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", gap: "xs", wrap: "wrap" }, reschedule.options.map((option, i) => /* @__PURE__ */ import_react5.default.createElement(
|
|
1532
|
+
import_ui_extensions5.Button,
|
|
1533
|
+
{
|
|
1534
|
+
key: `${option.label}-${i}`,
|
|
1535
|
+
size: "xs",
|
|
1536
|
+
variant: "secondary",
|
|
1537
|
+
onClick: () => reschedule.onPreset(event, option)
|
|
1538
|
+
},
|
|
1539
|
+
option.label
|
|
1540
|
+
))) : null, /* @__PURE__ */ import_react5.default.createElement(
|
|
1541
|
+
import_ui_extensions5.DateInput,
|
|
1542
|
+
{
|
|
1543
|
+
name: `cal-resched-${event.key}${idSuffix}`,
|
|
1544
|
+
label: labels.pickDate,
|
|
1545
|
+
onChange: (value) => reschedule.onPick(event, value)
|
|
1546
|
+
}
|
|
1547
|
+
)) : null);
|
|
1359
1548
|
};
|
|
1360
|
-
var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "") => {
|
|
1549
|
+
var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "", reschedule = null) => {
|
|
1361
1550
|
if (mode === "none") return void 0;
|
|
1362
|
-
const body = renderEventDetail ? renderEventDetail(event) : /* @__PURE__ */ import_react5.default.createElement(EventDetail, { event, labels });
|
|
1551
|
+
const body = renderEventDetail ? renderEventDetail(event) : /* @__PURE__ */ import_react5.default.createElement(EventDetail, { event, labels, reschedule, idSuffix });
|
|
1363
1552
|
const id = `cal-evt-${event.key}${idSuffix}`;
|
|
1364
1553
|
if (mode === "modal") {
|
|
1365
1554
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Modal, { id, title: event.title || labels.open, width: "small" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.ModalBody, null, body));
|
|
@@ -1369,17 +1558,17 @@ var buildOverlay = (event, mode, renderEventDetail, labels, idSuffix = "") => {
|
|
|
1369
1558
|
}
|
|
1370
1559
|
return /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id, placement: "bottom", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, body));
|
|
1371
1560
|
};
|
|
1372
|
-
var AgendaEventRow = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels }) => {
|
|
1561
|
+
var AgendaEventRow = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, reschedule }) => {
|
|
1373
1562
|
const variant = VALID_VARIANTS.has(event.color) ? event.color : "default";
|
|
1374
|
-
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-ag${day.getTime()}` : "");
|
|
1563
|
+
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-ag${day.getTime()}` : "", reschedule);
|
|
1375
1564
|
const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
|
|
1376
1565
|
const timeLabel = isAllDayEvent(event) ? labels.allDay : formatTime(event.start);
|
|
1377
1566
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 2 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: "demibold" } }, timeLabel))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 11 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant }), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { truncate: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { overlay, onClick: handleClick }, event.title || "--")))), event.subtitle ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Box, { flex: 4 }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", truncate: true }, event.subtitle))) : null);
|
|
1378
1567
|
};
|
|
1379
1568
|
var MONTH_SLOT_HEIGHT = 24;
|
|
1380
|
-
var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, monthEventStyle, monthEventMaxChars }) => {
|
|
1569
|
+
var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, monthEventStyle, monthEventMaxChars, reschedule, idScope = "" }) => {
|
|
1381
1570
|
const isStartDay = !day || !event.start || isSameDay(event.start, day);
|
|
1382
|
-
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-m${day.getTime()}` : "");
|
|
1571
|
+
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-m${idScope}${day.getTime()}` : "", reschedule);
|
|
1383
1572
|
const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
|
|
1384
1573
|
const variant = VALID_VARIANTS.has(event.color) ? event.color : "default";
|
|
1385
1574
|
const startHasTime = event.start && (event.start.getHours() !== 0 || event.start.getMinutes() !== 0);
|
|
@@ -1392,9 +1581,9 @@ var MonthChip = ({ event, day, overlayMode, renderEventDetail, onEventClick, lab
|
|
|
1392
1581
|
}
|
|
1393
1582
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Link, { overlay, onClick: handleClick }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.StatusTag, { variant: STATUS_VARIANT[variant] || "default" }, label));
|
|
1394
1583
|
};
|
|
1395
|
-
var DayListItem = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels }) => {
|
|
1584
|
+
var DayListItem = ({ event, day, overlayMode, renderEventDetail, onEventClick, labels, reschedule, idScope = "" }) => {
|
|
1396
1585
|
const handleClick = onEventClick ? () => onEventClick(event.raw, event) : void 0;
|
|
1397
|
-
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-more${day.getTime()}` : "-more");
|
|
1586
|
+
const overlay = buildOverlay(event, overlayMode, renderEventDetail, labels, day ? `-more${idScope}${day.getTime()}` : "-more", reschedule);
|
|
1398
1587
|
const href = event.href;
|
|
1399
1588
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Button, { variant: "transparent", size: "sm", href: href ? href.url : void 0, overlay, onClick: handleClick }, event.title || "--");
|
|
1400
1589
|
};
|
|
@@ -1459,6 +1648,40 @@ var Toolbar = ({
|
|
|
1459
1648
|
}
|
|
1460
1649
|
));
|
|
1461
1650
|
};
|
|
1651
|
+
var DayChipStack = ({ day, events, maxEventsPerDay, chipProps, labels, idScope = "" }) => {
|
|
1652
|
+
const slotSpacer = makeSpacerDataUri(MONTH_SLOT_HEIGHT, 1);
|
|
1653
|
+
const shown = events.slice(0, maxEventsPerDay);
|
|
1654
|
+
const hasOverflow = events.length > maxEventsPerDay;
|
|
1655
|
+
const heightSpacer = /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" });
|
|
1656
|
+
const slotRow = (key, content) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { key, direction: "row", align: "center", gap: "flush" }, heightSpacer, content);
|
|
1657
|
+
const slots = [];
|
|
1658
|
+
for (let i = 0; i < maxEventsPerDay; i++) {
|
|
1659
|
+
if (i < shown.length) {
|
|
1660
|
+
slots.push(slotRow(shown[i].key, /* @__PURE__ */ import_react5.default.createElement(MonthChip, { event: shown[i], day, idScope, ...chipProps })));
|
|
1661
|
+
} else {
|
|
1662
|
+
slots.push(/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: `sp-${i}`, src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" }));
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1665
|
+
if (hasOverflow) {
|
|
1666
|
+
slots.push(
|
|
1667
|
+
slotRow(
|
|
1668
|
+
"more",
|
|
1669
|
+
/* @__PURE__ */ import_react5.default.createElement(
|
|
1670
|
+
import_ui_extensions5.Link,
|
|
1671
|
+
{
|
|
1672
|
+
overlay: /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id: `cal-day-${idScope}${day.getTime()}`, placement: "top", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "center", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "bold" } }, String(events.length)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, labels.onThisDate)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), events.map((event, i) => /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, { key: event.key }, /* @__PURE__ */ import_react5.default.createElement(DayListItem, { event, day, idScope, ...chipProps }), i < events.length - 1 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null) : null)))))
|
|
1673
|
+
},
|
|
1674
|
+
labels.more(events.length - maxEventsPerDay)
|
|
1675
|
+
)
|
|
1676
|
+
)
|
|
1677
|
+
);
|
|
1678
|
+
} else {
|
|
1679
|
+
slots.push(
|
|
1680
|
+
/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: "more-sp", src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" })
|
|
1681
|
+
);
|
|
1682
|
+
}
|
|
1683
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, slots);
|
|
1684
|
+
};
|
|
1462
1685
|
var MonthView = ({
|
|
1463
1686
|
refDate,
|
|
1464
1687
|
now,
|
|
@@ -1473,43 +1696,21 @@ var MonthView = ({
|
|
|
1473
1696
|
}) => {
|
|
1474
1697
|
const headers = weekdayLabels(weekStartsOn, hideWeekends, true);
|
|
1475
1698
|
const today = now || /* @__PURE__ */ new Date();
|
|
1476
|
-
const slotSpacer = makeSpacerDataUri(MONTH_SLOT_HEIGHT, 1);
|
|
1477
1699
|
const renderCell = (day) => {
|
|
1478
1700
|
const dayEvents = eventsForDay(day);
|
|
1479
1701
|
const inMonth = isSameMonth(day, refDate);
|
|
1480
1702
|
const isToday = isSameDay(day, today);
|
|
1481
1703
|
if (renderDayCell) return renderDayCell(day, dayEvents);
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
} else {
|
|
1491
|
-
slots.push(/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: `sp-${i}`, src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" }));
|
|
1704
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, isToday ? /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant: "info" }) : null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: inMonth ? "demibold" : "regular" } }, String(day.getDate()))), /* @__PURE__ */ import_react5.default.createElement(
|
|
1705
|
+
DayChipStack,
|
|
1706
|
+
{
|
|
1707
|
+
day,
|
|
1708
|
+
events: dayEvents,
|
|
1709
|
+
maxEventsPerDay,
|
|
1710
|
+
chipProps,
|
|
1711
|
+
labels
|
|
1492
1712
|
}
|
|
1493
|
-
|
|
1494
|
-
if (hasOverflow) {
|
|
1495
|
-
slots.push(
|
|
1496
|
-
slotRow(
|
|
1497
|
-
"more",
|
|
1498
|
-
/* @__PURE__ */ import_react5.default.createElement(
|
|
1499
|
-
import_ui_extensions5.Link,
|
|
1500
|
-
{
|
|
1501
|
-
overlay: /* @__PURE__ */ import_react5.default.createElement(import_experimental.Popover, { id: `cal-day-${day.getTime()}`, placement: "top", variant: "longform" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Tile, { compact: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "center", align: "center", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "bold" } }, String(dayEvents.length)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, labels.onThisDate)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), dayEvents.map((event, i) => /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, { key: event.key }, /* @__PURE__ */ import_react5.default.createElement(DayListItem, { event, day, ...chipProps }), i < dayEvents.length - 1 ? /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null) : null)))))
|
|
1502
|
-
},
|
|
1503
|
-
labels.more(dayEvents.length - maxEventsPerDay)
|
|
1504
|
-
)
|
|
1505
|
-
)
|
|
1506
|
-
);
|
|
1507
|
-
} else {
|
|
1508
|
-
slots.push(
|
|
1509
|
-
/* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Image, { key: "more-sp", src: slotSpacer.src, width: slotSpacer.width, height: slotSpacer.height, alt: "" })
|
|
1510
|
-
);
|
|
1511
|
-
}
|
|
1512
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", align: "center", gap: "xs" }, isToday ? /* @__PURE__ */ import_react5.default.createElement(ColorDot, { variant: "info" }) : null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy", format: { fontWeight: inMonth ? "demibold" : "regular" } }, String(day.getDate()))), slots));
|
|
1713
|
+
)));
|
|
1513
1714
|
};
|
|
1514
1715
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Table, { bordered: true, flush: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHead, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, null, headers.map((h4) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { key: h4, width: "min", align: "center" }, h4.toUpperCase())))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableBody, null, weeks.map((week, wi) => {
|
|
1515
1716
|
const days = hideWeekends ? week.filter((d) => d.getDay() !== 0 && d.getDay() !== 6) : week;
|
|
@@ -1531,6 +1732,33 @@ var AgendaView = ({ rangeStart, rangeEnd, eventsForDay, chipProps, labels, rende
|
|
|
1531
1732
|
}
|
|
1532
1733
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "lg" }, days.map(({ day, events }) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { key: day.getTime(), direction: "column", gap: "sm" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "row", justify: "between", align: "end" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, formatDayTitle(day)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy" }, `${events.length} ${events.length === 1 ? "event" : "events"}`)), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Divider, null), events.map((event) => /* @__PURE__ */ import_react5.default.createElement(AgendaEventRow, { key: event.key, event, day, ...chipProps })))));
|
|
1533
1734
|
};
|
|
1735
|
+
var ResourceView = ({ days, now, lanes, maxEventsPerDay, chipProps, labels, renderEmptyState }) => {
|
|
1736
|
+
const today = now || /* @__PURE__ */ new Date();
|
|
1737
|
+
if (!lanes || lanes.length === 0) {
|
|
1738
|
+
if (renderEmptyState) return renderEmptyState({});
|
|
1739
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.EmptyState, { title: labels.noEventsTitle }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, null, labels.noEventsMessage));
|
|
1740
|
+
}
|
|
1741
|
+
const rangeStart = startOfDay(days[0]);
|
|
1742
|
+
const rangeEnd = endOfDay(days[days.length - 1]);
|
|
1743
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Table, { bordered: true, flush: true }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHead, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, null, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { width: RESOURCE_LABEL_COL_WIDTH }, String(labels.resource).toUpperCase()), days.map((day) => {
|
|
1744
|
+
const isToday = isSameDay(day, today);
|
|
1745
|
+
const label = `${formatWeekdayShort(day)} ${formatMonthShort(day)} ${day.getDate()}`;
|
|
1746
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableHeader, { key: day.getTime(), width: "min", align: "center" }, isToday ? `${label} \xB7 Today` : label);
|
|
1747
|
+
}))), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableBody, null, lanes.map((lane, laneIndex) => {
|
|
1748
|
+
const visible = eventsIntersectingRange(lane.events, rangeStart, rangeEnd);
|
|
1749
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableRow, { key: lane.key }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableCell, { width: RESOURCE_LABEL_COL_WIDTH }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { format: { fontWeight: "demibold" } }, lane.label), /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Text, { variant: "microcopy" }, `${visible.length} ${visible.length === 1 ? "event" : "events"}`))), days.map((day) => /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.TableCell, { key: day.getTime(), width: "min" }, /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.AutoGrid, { columnWidth: MONTH_COL_WIDTH, gap: "flush" }, /* @__PURE__ */ import_react5.default.createElement(
|
|
1750
|
+
DayChipStack,
|
|
1751
|
+
{
|
|
1752
|
+
day,
|
|
1753
|
+
events: laneEventsForDay(visible, day),
|
|
1754
|
+
maxEventsPerDay,
|
|
1755
|
+
chipProps,
|
|
1756
|
+
labels,
|
|
1757
|
+
idScope: `r${laneIndex}-`
|
|
1758
|
+
}
|
|
1759
|
+
)))));
|
|
1760
|
+
})));
|
|
1761
|
+
};
|
|
1534
1762
|
var formatTimedDuration = (start, end) => {
|
|
1535
1763
|
const mins = Math.max(0, Math.round(((end || start).getTime() - start.getTime()) / 6e4));
|
|
1536
1764
|
const h4 = Math.floor(mins / 60);
|
|
@@ -1578,7 +1806,8 @@ var TimeGridView = ({ days, now, hours, dayStartHour, dayEndHour, eventsForDay,
|
|
|
1578
1806
|
chipProps.overlayMode,
|
|
1579
1807
|
chipProps.renderEventDetail,
|
|
1580
1808
|
chipProps.labels,
|
|
1581
|
-
`-tg${mode}${hour}-${dayMs}
|
|
1809
|
+
`-tg${mode}${hour}-${dayMs}`,
|
|
1810
|
+
chipProps.reschedule
|
|
1582
1811
|
);
|
|
1583
1812
|
const handleClick = chipProps.onEventClick ? () => chipProps.onEventClick(e.raw, e) : void 0;
|
|
1584
1813
|
const variant = VALID_VARIANTS.has(e.color) ? e.color : "default";
|
|
@@ -1663,6 +1892,14 @@ var Calendar = (props) => {
|
|
|
1663
1892
|
// time grid (week / day)
|
|
1664
1893
|
dayStartHour = DEFAULT_DAY_START_HOUR,
|
|
1665
1894
|
dayEndHour = DEFAULT_DAY_END_HOUR,
|
|
1895
|
+
// resource / lane view (rows = resources, columns = the focused week's days)
|
|
1896
|
+
resources,
|
|
1897
|
+
resourceField,
|
|
1898
|
+
resourceLabels,
|
|
1899
|
+
showUnassignedLane = true,
|
|
1900
|
+
// drag-free reschedule (presets + date picker in the event-detail overlay)
|
|
1901
|
+
rescheduleOptions,
|
|
1902
|
+
onEventReschedule,
|
|
1666
1903
|
// timezone
|
|
1667
1904
|
timeZone: controlledTimeZone,
|
|
1668
1905
|
defaultTimeZone,
|
|
@@ -1701,10 +1938,12 @@ var Calendar = (props) => {
|
|
|
1701
1938
|
const fields = (0, import_react5.useMemo)(() => ({ ...DEFAULT_EVENT_FIELDS, ...eventFields || {} }), [eventFields]);
|
|
1702
1939
|
const [internalView, setInternalView] = (0, import_react5.useState)(defaultView);
|
|
1703
1940
|
const view = controlledView != null ? controlledView : internalView;
|
|
1941
|
+
const resourceEnabled = resources && resources.length > 0 || resourceField != null;
|
|
1704
1942
|
const enabledViews = (0, import_react5.useMemo)(() => {
|
|
1705
|
-
const
|
|
1706
|
-
|
|
1707
|
-
|
|
1943
|
+
const all = resourceEnabled ? ALL_VIEWS_WITH_RESOURCE : ALL_VIEWS;
|
|
1944
|
+
const base = viewsProp && viewsProp.length > 0 ? viewsProp : all;
|
|
1945
|
+
return base.filter((v) => all.includes(v));
|
|
1946
|
+
}, [viewsProp, resourceEnabled]);
|
|
1708
1947
|
const setView = (0, import_react5.useCallback)(
|
|
1709
1948
|
(next) => {
|
|
1710
1949
|
if (controlledView == null) setInternalView(next);
|
|
@@ -1729,7 +1968,9 @@ var Calendar = (props) => {
|
|
|
1729
1968
|
const focusedDate = (controlledFocusedDate != null ? toDate(controlledFocusedDate) : internalDate) || startOfDay(nowWall);
|
|
1730
1969
|
const stepFor = (0, import_react5.useCallback)(
|
|
1731
1970
|
(dir) => {
|
|
1732
|
-
if (view === "week" || view === "agenda"
|
|
1971
|
+
if (view === "week" || view === "agenda" || view === "resource") {
|
|
1972
|
+
return addDays(focusedDate, dir * 7);
|
|
1973
|
+
}
|
|
1733
1974
|
if (view === "day") return addDays(focusedDate, dir);
|
|
1734
1975
|
return addMonths(focusedDate, dir);
|
|
1735
1976
|
},
|
|
@@ -1756,7 +1997,7 @@ var Calendar = (props) => {
|
|
|
1756
1997
|
rangeEnd: endOfDay(flat[flat.length - 1])
|
|
1757
1998
|
};
|
|
1758
1999
|
}
|
|
1759
|
-
if (view === "week") {
|
|
2000
|
+
if (view === "week" || view === "resource") {
|
|
1760
2001
|
const days = buildWeekDays(focusedDate, weekStartsOn, hideWeekends);
|
|
1761
2002
|
return {
|
|
1762
2003
|
weeks: null,
|
|
@@ -1829,14 +2070,18 @@ var Calendar = (props) => {
|
|
|
1829
2070
|
);
|
|
1830
2071
|
const normalized = (0, import_react5.useMemo)(
|
|
1831
2072
|
() => (events || []).map((raw, index) => {
|
|
1832
|
-
const
|
|
1833
|
-
const
|
|
2073
|
+
const sourceStart = toDate(resolveField(raw, fields.start));
|
|
2074
|
+
const sourceEnd = toDate(resolveField(raw, fields.end));
|
|
2075
|
+
const start = toWallClock(sourceStart, timeZone);
|
|
2076
|
+
const endRaw = toWallClock(sourceEnd, timeZone);
|
|
1834
2077
|
const id = resolveField(raw, fields.id);
|
|
1835
2078
|
return {
|
|
1836
2079
|
key: id != null ? String(id) : `evt-${index}`,
|
|
1837
2080
|
id,
|
|
1838
2081
|
start,
|
|
1839
2082
|
end: endRaw || start,
|
|
2083
|
+
sourceStart,
|
|
2084
|
+
sourceEnd: sourceEnd || sourceStart,
|
|
1840
2085
|
title: resolveField(raw, fields.title),
|
|
1841
2086
|
subtitle: resolveField(raw, fields.subtitle),
|
|
1842
2087
|
color: resolveField(raw, fields.color),
|
|
@@ -1873,12 +2118,40 @@ var Calendar = (props) => {
|
|
|
1873
2118
|
}, [rangeKey]);
|
|
1874
2119
|
const title = (0, import_react5.useMemo)(() => {
|
|
1875
2120
|
if (view === "day") return formatDayTitle(focusedDate);
|
|
1876
|
-
if (view === "week" || view === "agenda") {
|
|
1877
|
-
const days = buildWeekDays(focusedDate, weekStartsOn, view
|
|
2121
|
+
if (view === "week" || view === "agenda" || view === "resource") {
|
|
2122
|
+
const days = buildWeekDays(focusedDate, weekStartsOn, view !== "agenda" && hideWeekends);
|
|
1878
2123
|
return formatRangeTitle(days[0], days[days.length - 1]);
|
|
1879
2124
|
}
|
|
1880
2125
|
return formatMonthTitle(focusedDate);
|
|
1881
2126
|
}, [view, focusedDate, weekStartsOn, hideWeekends]);
|
|
2127
|
+
const handleReschedulePreset = (0, import_react5.useCallback)(
|
|
2128
|
+
(event, option) => {
|
|
2129
|
+
const target = resolveRescheduleTarget(
|
|
2130
|
+
{ start: event.sourceStart, end: event.sourceEnd },
|
|
2131
|
+
option,
|
|
2132
|
+
event
|
|
2133
|
+
);
|
|
2134
|
+
if (target && onEventReschedule) onEventReschedule(event.raw, target, event);
|
|
2135
|
+
},
|
|
2136
|
+
[onEventReschedule]
|
|
2137
|
+
);
|
|
2138
|
+
const handleReschedulePick = (0, import_react5.useCallback)(
|
|
2139
|
+
(event, value) => {
|
|
2140
|
+
const newStart = applyDatePick(event.sourceStart, value);
|
|
2141
|
+
if (!newStart) return;
|
|
2142
|
+
const target = rescheduleToStart({ start: event.sourceStart, end: event.sourceEnd }, newStart);
|
|
2143
|
+
if (target && onEventReschedule) onEventReschedule(event.raw, target, event);
|
|
2144
|
+
},
|
|
2145
|
+
[onEventReschedule]
|
|
2146
|
+
);
|
|
2147
|
+
const reschedule = (0, import_react5.useMemo)(() => {
|
|
2148
|
+
if (!rescheduleOptions) return null;
|
|
2149
|
+
return {
|
|
2150
|
+
options: normalizeRescheduleOptions(rescheduleOptions),
|
|
2151
|
+
onPreset: handleReschedulePreset,
|
|
2152
|
+
onPick: handleReschedulePick
|
|
2153
|
+
};
|
|
2154
|
+
}, [rescheduleOptions, handleReschedulePreset, handleReschedulePick]);
|
|
1882
2155
|
const safeMonthEventStyle = MONTH_EVENT_STYLES.has(monthEventStyle) ? monthEventStyle : "statusTag";
|
|
1883
2156
|
const chipProps = {
|
|
1884
2157
|
overlayMode,
|
|
@@ -1886,8 +2159,19 @@ var Calendar = (props) => {
|
|
|
1886
2159
|
onEventClick,
|
|
1887
2160
|
labels,
|
|
1888
2161
|
monthEventStyle: safeMonthEventStyle,
|
|
1889
|
-
monthEventMaxChars
|
|
2162
|
+
monthEventMaxChars,
|
|
2163
|
+
reschedule
|
|
1890
2164
|
};
|
|
2165
|
+
const resourceLaneData = (0, import_react5.useMemo)(() => {
|
|
2166
|
+
if (view !== "resource") return null;
|
|
2167
|
+
return buildResourceLanes(queried, {
|
|
2168
|
+
resources,
|
|
2169
|
+
resourceLabels,
|
|
2170
|
+
getId: (e) => resolveResourceId(e.raw, resourceField),
|
|
2171
|
+
showUnassignedLane,
|
|
2172
|
+
unassignedLabel: labels.unassigned
|
|
2173
|
+
});
|
|
2174
|
+
}, [view, queried, resources, resourceLabels, resourceField, showUnassignedLane, labels]);
|
|
1891
2175
|
const timeZoneOptions = (0, import_react5.useMemo)(() => {
|
|
1892
2176
|
if (!showTimeZoneSelect) return null;
|
|
1893
2177
|
const base = (timeZoneOptionsProp && timeZoneOptionsProp.length ? timeZoneOptionsProp : DEFAULT_TIME_ZONES).map(
|
|
@@ -1948,6 +2232,19 @@ var Calendar = (props) => {
|
|
|
1948
2232
|
labels
|
|
1949
2233
|
}
|
|
1950
2234
|
);
|
|
2235
|
+
} else if (view === "resource") {
|
|
2236
|
+
body = /* @__PURE__ */ import_react5.default.createElement(
|
|
2237
|
+
ResourceView,
|
|
2238
|
+
{
|
|
2239
|
+
days: gridDays,
|
|
2240
|
+
now: nowWall,
|
|
2241
|
+
lanes: resourceLaneData,
|
|
2242
|
+
maxEventsPerDay,
|
|
2243
|
+
chipProps,
|
|
2244
|
+
labels,
|
|
2245
|
+
renderEmptyState
|
|
2246
|
+
}
|
|
2247
|
+
);
|
|
1951
2248
|
} else if (view === "week" || view === "day") {
|
|
1952
2249
|
body = /* @__PURE__ */ import_react5.default.createElement(
|
|
1953
2250
|
TimeGridView,
|
|
@@ -1977,6 +2274,7 @@ var Calendar = (props) => {
|
|
|
1977
2274
|
}
|
|
1978
2275
|
return /* @__PURE__ */ import_react5.default.createElement(import_ui_extensions5.Flex, { direction: "column", gap: "sm" }, toolbar, body);
|
|
1979
2276
|
};
|
|
2277
|
+
Calendar.displayName = "Calendar";
|
|
1980
2278
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1981
2279
|
0 && (module.exports = {
|
|
1982
2280
|
Calendar
|