@activecollab/components 2.0.408 → 2.0.409

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/cjs/components/Icons/collection/Project.js +98 -0
  2. package/dist/cjs/components/Icons/collection/Project.js.map +1 -0
  3. package/dist/cjs/components/Icons/collection/Task.js +61 -0
  4. package/dist/cjs/components/Icons/collection/Task.js.map +1 -0
  5. package/dist/cjs/components/Icons/collection/index.js +14 -0
  6. package/dist/cjs/components/Icons/collection/index.js.map +1 -1
  7. package/dist/cjs/presentation/stackedCard/content/NoteCard.js +7 -3
  8. package/dist/cjs/presentation/stackedCard/content/NoteCard.js.map +1 -1
  9. package/dist/cjs/presentation/stackedCard/content/ProjectCard.js +136 -0
  10. package/dist/cjs/presentation/stackedCard/content/ProjectCard.js.map +1 -0
  11. package/dist/cjs/presentation/stackedCard/content/TaskCard.js +183 -56
  12. package/dist/cjs/presentation/stackedCard/content/TaskCard.js.map +1 -1
  13. package/dist/cjs/presentation/stackedCard/content/index.js +11 -0
  14. package/dist/cjs/presentation/stackedCard/content/index.js.map +1 -1
  15. package/dist/cjs/presentation/stackedCard/content/shared.js +66 -19
  16. package/dist/cjs/presentation/stackedCard/content/shared.js.map +1 -1
  17. package/dist/cjs/presentation/whiteboard/bottomDock.js +95 -32
  18. package/dist/cjs/presentation/whiteboard/bottomDock.js.map +1 -1
  19. package/dist/cjs/presentation/whiteboard/canvasElements.js +196 -8
  20. package/dist/cjs/presentation/whiteboard/canvasElements.js.map +1 -1
  21. package/dist/cjs/presentation/whiteboard/inspector.js +149 -47
  22. package/dist/cjs/presentation/whiteboard/inspector.js.map +1 -1
  23. package/dist/cjs/presentation/whiteboard/outline.js +91 -18
  24. package/dist/cjs/presentation/whiteboard/outline.js.map +1 -1
  25. package/dist/cjs/presentation/whiteboard/projectElements.js +883 -0
  26. package/dist/cjs/presentation/whiteboard/projectElements.js.map +1 -0
  27. package/dist/esm/components/Icons/collection/Project.d.ts +36 -0
  28. package/dist/esm/components/Icons/collection/Project.d.ts.map +1 -0
  29. package/dist/esm/components/Icons/collection/Project.js +91 -0
  30. package/dist/esm/components/Icons/collection/Project.js.map +1 -0
  31. package/dist/esm/components/Icons/collection/Task.d.ts +32 -0
  32. package/dist/esm/components/Icons/collection/Task.d.ts.map +1 -0
  33. package/dist/esm/components/Icons/collection/Task.js +54 -0
  34. package/dist/esm/components/Icons/collection/Task.js.map +1 -0
  35. package/dist/esm/components/Icons/collection/index.d.ts +2 -0
  36. package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
  37. package/dist/esm/components/Icons/collection/index.js +2 -0
  38. package/dist/esm/components/Icons/collection/index.js.map +1 -1
  39. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts +8 -1
  40. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts.map +1 -1
  41. package/dist/esm/presentation/stackedCard/content/NoteCard.js +8 -4
  42. package/dist/esm/presentation/stackedCard/content/NoteCard.js.map +1 -1
  43. package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts +64 -0
  44. package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts.map +1 -0
  45. package/dist/esm/presentation/stackedCard/content/ProjectCard.js +128 -0
  46. package/dist/esm/presentation/stackedCard/content/ProjectCard.js.map +1 -0
  47. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts +64 -2
  48. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts.map +1 -1
  49. package/dist/esm/presentation/stackedCard/content/TaskCard.js +181 -58
  50. package/dist/esm/presentation/stackedCard/content/TaskCard.js.map +1 -1
  51. package/dist/esm/presentation/stackedCard/content/index.d.ts +1 -0
  52. package/dist/esm/presentation/stackedCard/content/index.d.ts.map +1 -1
  53. package/dist/esm/presentation/stackedCard/content/index.js +1 -0
  54. package/dist/esm/presentation/stackedCard/content/index.js.map +1 -1
  55. package/dist/esm/presentation/stackedCard/content/shared.d.ts +30 -0
  56. package/dist/esm/presentation/stackedCard/content/shared.d.ts.map +1 -1
  57. package/dist/esm/presentation/stackedCard/content/shared.js +66 -19
  58. package/dist/esm/presentation/stackedCard/content/shared.js.map +1 -1
  59. package/dist/esm/presentation/whiteboard/bottomDock.d.ts +30 -7
  60. package/dist/esm/presentation/whiteboard/bottomDock.d.ts.map +1 -1
  61. package/dist/esm/presentation/whiteboard/bottomDock.js +79 -32
  62. package/dist/esm/presentation/whiteboard/bottomDock.js.map +1 -1
  63. package/dist/esm/presentation/whiteboard/canvasElements.d.ts +4 -1
  64. package/dist/esm/presentation/whiteboard/canvasElements.d.ts.map +1 -1
  65. package/dist/esm/presentation/whiteboard/canvasElements.js +158 -7
  66. package/dist/esm/presentation/whiteboard/canvasElements.js.map +1 -1
  67. package/dist/esm/presentation/whiteboard/inspector.d.ts +35 -1
  68. package/dist/esm/presentation/whiteboard/inspector.d.ts.map +1 -1
  69. package/dist/esm/presentation/whiteboard/inspector.js +170 -68
  70. package/dist/esm/presentation/whiteboard/inspector.js.map +1 -1
  71. package/dist/esm/presentation/whiteboard/outline.d.ts +23 -3
  72. package/dist/esm/presentation/whiteboard/outline.d.ts.map +1 -1
  73. package/dist/esm/presentation/whiteboard/outline.js +89 -18
  74. package/dist/esm/presentation/whiteboard/outline.js.map +1 -1
  75. package/dist/esm/presentation/whiteboard/projectElements.d.ts +267 -0
  76. package/dist/esm/presentation/whiteboard/projectElements.d.ts.map +1 -0
  77. package/dist/esm/presentation/whiteboard/projectElements.js +824 -0
  78. package/dist/esm/presentation/whiteboard/projectElements.js.map +1 -0
  79. package/dist/index.js +629 -490
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.min.js +1 -1
  82. package/dist/index.min.js.map +1 -1
  83. package/package.json +1 -1
@@ -9,6 +9,7 @@ var _bottomDock = require("./bottomDock");
9
9
  var _elements = require("./elements");
10
10
  var _fileElement = require("./fileElement");
11
11
  var _linkElement = require("./linkElement");
12
+ var _projectElements = require("./projectElements");
12
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
14
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
14
15
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -52,6 +53,7 @@ var DRAG_THROUGH_SELECTOR = exports.DRAG_THROUGH_SELECTOR = "[data-drag-through]
52
53
  Link elements are created here too — by drawing a box with the Link tool
53
54
  armed, or by pasting a URL onto the canvas. */
54
55
  var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
56
+ var _projectElements$find;
55
57
  var gridSize = _ref.gridSize,
56
58
  snapToGrid = _ref.snapToGrid,
57
59
  activeTool = _ref.activeTool,
@@ -68,6 +70,8 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
68
70
  setLinks = _ref.setLinks,
69
71
  files = _ref.files,
70
72
  setFiles = _ref.setFiles,
73
+ projectElements = _ref.projectElements,
74
+ setProjectElements = _ref.setProjectElements,
71
75
  createdShapes = _ref.createdShapes,
72
76
  setCreatedShapes = _ref.setCreatedShapes,
73
77
  sizes = _ref.sizes,
@@ -198,6 +202,23 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
198
202
  window.addEventListener("mousemove", handleDragMove);
199
203
  window.addEventListener("mouseup", handleDragEnd);
200
204
  }, [positions, handleDragMove, handleDragEnd, setSelectedId]);
205
+
206
+ /**
207
+ * The press a limited card gets instead of the one every other element gets.
208
+ *
209
+ * It selects — the Inspector still has something to say about it — and stops
210
+ * there: no drag is armed, because a viewer who cannot see what a card points
211
+ * at has no business moving it for the people who can. Gating at the call
212
+ * site rather than inside `handleElementMouseDown` leaves the normal drag
213
+ * path exactly as it was.
214
+ */
215
+ var handleLimitedMouseDown = (0, _react.useCallback)(function (event, id) {
216
+ if (event.button !== 0 || activeToolRef.current !== "select") {
217
+ return;
218
+ }
219
+ event.stopPropagation();
220
+ setSelectedId(id);
221
+ }, [setSelectedId]);
201
222
  var updateShape = (0, _react.useCallback)(function (id, partial) {
202
223
  return setShapes(function (current) {
203
224
  return _objectSpread(_objectSpread({}, current), {}, {
@@ -465,6 +486,107 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
465
486
  });
466
487
  }, [setLinks]);
467
488
 
489
+ /* ---- project / task elements --------------------------------------- */
490
+
491
+ var projectCounterRef = (0, _react.useRef)(0);
492
+ /* The placeholder the centred picker is currently answering for. This one
493
+ stays local: it is a half-finished GESTURE, not board content, so nothing
494
+ outside the canvas has any use for it. The elements themselves are lifted
495
+ to the scene (see props) exactly like links and files, because the
496
+ Inspector reads and edits them. */
497
+ var _useState9 = (0, _react.useState)(null),
498
+ _useState0 = _slicedToArray(_useState9, 2),
499
+ pickerFor = _useState0[0],
500
+ setPickerFor = _useState0[1];
501
+ /* Pending "resolving" flashes, so unmounting never leaves a timer behind
502
+ that sets state on a component that is gone. */
503
+ var resolveTimersRef = (0, _react.useRef)([]);
504
+ (0, _react.useEffect)(function () {
505
+ return function () {
506
+ return resolveTimersRef.current.forEach(function (timer) {
507
+ return window.clearTimeout(timer);
508
+ });
509
+ };
510
+ }, []);
511
+
512
+ /* Create a placeholder and open its picker. The drawn box is what the card
513
+ lands in; the picker supplies what the card actually says. */
514
+ var addProjectElement = (0, _react.useCallback)(function (point, size, kind) {
515
+ projectCounterRef.current += 1;
516
+ var id = "".concat(kind, "-element-").concat(projectCounterRef.current);
517
+ var step = snapStepRef.current;
518
+ setPositions(function (current) {
519
+ return _objectSpread(_objectSpread({}, current), {}, {
520
+ [id]: {
521
+ x: (0, _elements.snapValue)(point.x, step),
522
+ y: (0, _elements.snapValue)(point.y, step)
523
+ }
524
+ });
525
+ });
526
+ setProjectElements(function (current) {
527
+ return [...current, {
528
+ id,
529
+ kind,
530
+ width: size.width,
531
+ height: size.height,
532
+ status: "placeholder",
533
+ project: null,
534
+ task: null
535
+ }];
536
+ });
537
+ setSelectedId(id);
538
+ setPickerFor(id);
539
+ }, [setPositions, setProjectElements, setSelectedId]);
540
+
541
+ /* The picker answered. The card keeps the placeholder's top-left and flashes
542
+ a skeleton while the "backend" fills the details in — the same two-phase
543
+ honesty the file card's upload / preparing pair has. */
544
+ var resolveProjectElement = (0, _react.useCallback)(function (id, project, task) {
545
+ setPickerFor(null);
546
+ setProjectElements(function (current) {
547
+ return current.map(function (entry) {
548
+ return entry.id === id ? _objectSpread(_objectSpread({}, entry), {}, {
549
+ status: "resolving",
550
+ project,
551
+ task
552
+ }) : entry;
553
+ });
554
+ });
555
+ var timer = window.setTimeout(function () {
556
+ setProjectElements(function (current) {
557
+ return current.map(function (entry) {
558
+ return entry.id === id ? _objectSpread(_objectSpread({}, entry), {}, {
559
+ status: "resolved",
560
+ /* The card takes its natural width HERE rather than the
561
+ renderer deriving it, so from this moment on there is a
562
+ single stored width for the canvas, the drag and the
563
+ Inspector's Width field to agree on. */
564
+ width: (0, _projectElements.projectCardWidth)(entry.kind)
565
+ }) : entry;
566
+ });
567
+ });
568
+ }, _projectElements.RESOLVE_MS);
569
+ resolveTimersRef.current.push(timer);
570
+ }, [setProjectElements]);
571
+
572
+ /* Esc, or a click on the overlay. The placeholder was only ever the first
573
+ half of the gesture, so cancelling throws it away rather than leaving a
574
+ blank card on the board. */
575
+ var cancelProjectElement = (0, _react.useCallback)(function (id) {
576
+ setPickerFor(null);
577
+ setProjectElements(function (current) {
578
+ return current.filter(function (entry) {
579
+ return entry.id !== id;
580
+ });
581
+ });
582
+ setSelectedId(function (selected) {
583
+ return selected === id ? null : selected;
584
+ });
585
+ }, [setProjectElements, setSelectedId]);
586
+ var pickerElement = (_projectElements$find = projectElements.find(function (entry) {
587
+ return entry.id === pickerFor;
588
+ })) !== null && _projectElements$find !== void 0 ? _projectElements$find : null;
589
+
468
590
  /* ---- draw-to-place ------------------------------------------------ */
469
591
 
470
592
  var drawRef = (0, _react.useRef)(null);
@@ -519,13 +641,21 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
519
641
  width,
520
642
  height
521
643
  } : _bottomDock.SHAPE_DEFAULT_SIZES[origin.tool]);
644
+ } else if ((0, _projectElements.isProjectTool)(origin.tool)) {
645
+ /* Both dimensions matter here (a project card is not auto-height the
646
+ way a link is), and a card smaller than the minimum could not hold
647
+ its own contents — so the drawn box is clamped, not honoured. */
648
+ addProjectElement(at, {
649
+ width: Math.max(_projectElements.PLACEHOLDER_MIN_WIDTH, Math.round(width)),
650
+ height: Math.max(_projectElements.PLACEHOLDER_MIN_HEIGHT, Math.round(height))
651
+ }, origin.tool);
522
652
  } else if (origin.tool === "file") {
523
653
  addFile(at, drawn ? width : _fileElement.FILE_DEFAULT_WIDTH, null);
524
654
  } else {
525
655
  addLink(at, drawn ? width : _linkElement.LINK_DEFAULT_WIDTH, null);
526
656
  }
527
657
  onToolUsed();
528
- }, [addFile, addLink, addShape, canvasPoint, handleDrawMove, onToolUsed]);
658
+ }, [addFile, addLink, addProjectElement, addShape, canvasPoint, handleDrawMove, onToolUsed]);
529
659
  var handleLayerMouseDown = (0, _react.useCallback)(function (event) {
530
660
  var tool = activeToolRef.current;
531
661
  if (event.button !== 0 || tool === "select") {
@@ -553,10 +683,10 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
553
683
 
554
684
  /* Where the armed tool's hover preview sits — cleared while a draw gesture
555
685
  runs (the rubber band takes over) and whenever the tool disarms. */
556
- var _useState9 = (0, _react.useState)(null),
557
- _useState0 = _slicedToArray(_useState9, 2),
558
- hoverPoint = _useState0[0],
559
- setHoverPoint = _useState0[1];
686
+ var _useState1 = (0, _react.useState)(null),
687
+ _useState10 = _slicedToArray(_useState1, 2),
688
+ hoverPoint = _useState10[0],
689
+ setHoverPoint = _useState10[1];
560
690
  (0, _react.useEffect)(function () {
561
691
  if (activeTool === "select") {
562
692
  setHoverPoint(null);
@@ -822,7 +952,37 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
822
952
  return deleteFile(entry.id);
823
953
  }
824
954
  }));
825
- }), draft && !(0, _bottomDock.isShapeTool)(draft.tool) ? /*#__PURE__*/_react.default.createElement(_linkElement.StyledLinkDraft, {
955
+ }), projectElements.map(function (entry) {
956
+ var _positions$entry$id$x2, _positions$entry$id3, _positions$entry$id$y2, _positions$entry$id4;
957
+ var selected = entry.id === selectedId;
958
+ return /*#__PURE__*/_react.default.createElement(_projectElements.StyledProjectElementBox, {
959
+ key: entry.id,
960
+ className: [selected ? "selected" : "", entry.limited ? "limited" : "",
961
+ /* A resolved card is a StackedCard, and the shell draws its own
962
+ ring — so the box stands down, exactly as it does for the link
963
+ and file cards. The placeholder, the resolving flash and the
964
+ limited card are not StackedCards and keep the box's ring. */
965
+ entry.status === "resolved" && !entry.limited ? "is-card" : ""].filter(Boolean).join(" "),
966
+ style: {
967
+ left: (_positions$entry$id$x2 = (_positions$entry$id3 = positions[entry.id]) === null || _positions$entry$id3 === void 0 ? void 0 : _positions$entry$id3.x) !== null && _positions$entry$id$x2 !== void 0 ? _positions$entry$id$x2 : 0,
968
+ top: (_positions$entry$id$y2 = (_positions$entry$id4 = positions[entry.id]) === null || _positions$entry$id4 === void 0 ? void 0 : _positions$entry$id4.y) !== null && _positions$entry$id$y2 !== void 0 ? _positions$entry$id$y2 : 0,
969
+ width: entry.width,
970
+ /* Only the placeholder box is measured in both directions; the
971
+ resolved card is auto-height like every other card here. */
972
+ height: entry.status === "resolved" ? undefined : entry.height
973
+ },
974
+ onMouseDown: function onMouseDown(event) {
975
+ return entry.limited ? handleLimitedMouseDown(event, entry.id) : handleElementMouseDown(event, entry.id);
976
+ },
977
+ onClickCapture: handleElementClickCapture,
978
+ onClick: function onClick(event) {
979
+ return event.stopPropagation();
980
+ }
981
+ }, /*#__PURE__*/_react.default.createElement(_projectElements.ProjectElementNode, {
982
+ element: entry,
983
+ selected: selected
984
+ }));
985
+ }), draft && !(0, _bottomDock.isShapeTool)(draft.tool) && !(0, _projectElements.isProjectTool)(draft.tool) ? /*#__PURE__*/_react.default.createElement(_linkElement.StyledLinkDraft, {
826
986
  style: {
827
987
  left: draft.x,
828
988
  top: draft.y,
@@ -831,7 +991,14 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
831
991
  }
832
992
  }, /*#__PURE__*/_react.default.createElement("span", {
833
993
  className: "draft-width"
834
- }, "W", " ", draft.width >= _linkElement.CARD_DRAW_THRESHOLD ? (0, _linkElement.clampCardWidth)(draft.width) : draft.tool === "file" ? _fileElement.FILE_DEFAULT_WIDTH : _linkElement.LINK_DEFAULT_WIDTH, " ", "\xB7 height follows content")) : null, draft && (0, _bottomDock.isShapeTool)(draft.tool) ? /*#__PURE__*/_react.default.createElement(_linkElement.StyledShapePreview, {
994
+ }, "W", " ", draft.width >= _linkElement.CARD_DRAW_THRESHOLD ? (0, _linkElement.clampCardWidth)(draft.width) : draft.tool === "file" ? _fileElement.FILE_DEFAULT_WIDTH : _linkElement.LINK_DEFAULT_WIDTH, " ", "\xB7 height follows content")) : null, draft && (0, _projectElements.isProjectTool)(draft.tool) ? /*#__PURE__*/_react.default.createElement(_projectElements.StyledProjectDraft, {
995
+ style: {
996
+ left: draft.x,
997
+ top: draft.y,
998
+ width: Math.max(draft.width, _projectElements.PLACEHOLDER_MIN_WIDTH),
999
+ height: Math.max(draft.height, _projectElements.PLACEHOLDER_MIN_HEIGHT)
1000
+ }
1001
+ }) : null, draft && (0, _bottomDock.isShapeTool)(draft.tool) ? /*#__PURE__*/_react.default.createElement(_linkElement.StyledShapePreview, {
835
1002
  style: {
836
1003
  left: draft.x,
837
1004
  top: draft.y,
@@ -853,6 +1020,16 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
853
1020
  }, size)
854
1021
  }, (0, _linkElement.shapePreviewGlyph)(activeTool, size.width, size.height));
855
1022
  }
1023
+ if ((0, _projectElements.isProjectTool)(activeTool)) {
1024
+ return /*#__PURE__*/_react.default.createElement(_projectElements.StyledProjectDraft, {
1025
+ style: {
1026
+ left: at.x,
1027
+ top: at.y,
1028
+ width: _projectElements.PLACEHOLDER_MIN_WIDTH,
1029
+ height: _projectElements.PLACEHOLDER_MIN_HEIGHT
1030
+ }
1031
+ });
1032
+ }
856
1033
  var width = activeTool === "file" ? _fileElement.FILE_DEFAULT_WIDTH : _linkElement.LINK_DEFAULT_WIDTH;
857
1034
  return /*#__PURE__*/_react.default.createElement(_linkElement.StyledShapePreview, {
858
1035
  style: {
@@ -872,6 +1049,17 @@ var CanvasElements = exports.CanvasElements = function CanvasElements(_ref) {
872
1049
  rx: 8,
873
1050
  ry: 8
874
1051
  })));
875
- }() : null);
1052
+ }() : null, pickerElement ? /*#__PURE__*/_react.default.createElement(_projectElements.ProjectElementPicker, {
1053
+ kind: pickerElement.kind,
1054
+ onSelectProject: function onSelectProject(project) {
1055
+ return resolveProjectElement(pickerElement.id, project, null);
1056
+ },
1057
+ onSelectTask: function onSelectTask(project, task) {
1058
+ return resolveProjectElement(pickerElement.id, project, task);
1059
+ },
1060
+ onCancel: function onCancel() {
1061
+ return cancelProjectElement(pickerElement.id);
1062
+ }
1063
+ }) : null);
876
1064
  };
877
1065
  //# sourceMappingURL=canvasElements.js.map