@lv-x-software-house/x_view 1.2.6-dev.37 → 1.2.6-dev.39
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/dist/index.js +451 -330
- package/dist/index.mjs +458 -331
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8493,7 +8493,7 @@ var PRESET_COLORS = [
|
|
|
8493
8493
|
"#ffffff",
|
|
8494
8494
|
"#000000"
|
|
8495
8495
|
];
|
|
8496
|
-
function ColorPicker({ color, onChange, disabled }) {
|
|
8496
|
+
function ColorPicker({ color, onChange, disabled, isCompact = false }) {
|
|
8497
8497
|
const [isOpen, setIsOpen] = (0, import_react13.useState)(false);
|
|
8498
8498
|
const popoverRef = (0, import_react13.useRef)(null);
|
|
8499
8499
|
(0, import_react13.useEffect)(() => {
|
|
@@ -8511,27 +8511,87 @@ function ColorPicker({ color, onChange, disabled }) {
|
|
|
8511
8511
|
onChange(val.startsWith("#") ? val : "#" + val);
|
|
8512
8512
|
}
|
|
8513
8513
|
};
|
|
8514
|
-
|
|
8515
|
-
"
|
|
8514
|
+
if (isCompact) {
|
|
8515
|
+
return /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative", ref: popoverRef }, /* @__PURE__ */ import_react13.default.createElement(
|
|
8516
|
+
"button",
|
|
8517
|
+
{
|
|
8518
|
+
type: "button",
|
|
8519
|
+
onClick: () => !disabled && setIsOpen(!isOpen),
|
|
8520
|
+
className: `h-5 w-5 rounded border border-white/20 shadow-sm transition-all hover:scale-110 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden ${disabled ? "opacity-40 grayscale pointer-events-none" : ""}`,
|
|
8521
|
+
style: { backgroundColor: color },
|
|
8522
|
+
title: "Alterar Cor"
|
|
8523
|
+
},
|
|
8524
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 shadow-[inset_0_0_2px_rgba(255,255,255,0.2)]" })
|
|
8525
|
+
), isOpen && !disabled && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute bottom-full right-0 mb-2 z-[9999] p-3 bg-slate-950 rounded-xl border border-white/10 shadow-2xl w-[200px] animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "mb-3 custom-react-colorful" }, /* @__PURE__ */ import_react13.default.createElement(import_react_colorful.HexColorPicker, { color, onChange })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-px bg-white/10 my-3" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-5 gap-2" }, PRESET_COLORS.map((preset) => /* @__PURE__ */ import_react13.default.createElement(
|
|
8526
|
+
"button",
|
|
8527
|
+
{
|
|
8528
|
+
key: preset,
|
|
8529
|
+
type: "button",
|
|
8530
|
+
onClick: () => {
|
|
8531
|
+
onChange(preset);
|
|
8532
|
+
setIsOpen(false);
|
|
8533
|
+
},
|
|
8534
|
+
className: "w-full aspect-square rounded border border-white/5 hover:border-white/30 hover:scale-110 transition-all shadow-sm flex items-center justify-center",
|
|
8535
|
+
style: { backgroundColor: preset },
|
|
8536
|
+
title: preset
|
|
8537
|
+
},
|
|
8538
|
+
(color || "").toLowerCase() === (preset || "").toLowerCase() && /* @__PURE__ */ import_react13.default.createElement(
|
|
8539
|
+
import_fi12.FiCheck,
|
|
8540
|
+
{
|
|
8541
|
+
className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`,
|
|
8542
|
+
size: 12
|
|
8543
|
+
}
|
|
8544
|
+
)
|
|
8545
|
+
)))), /* @__PURE__ */ import_react13.default.createElement("style", null, `
|
|
8546
|
+
.custom-react-colorful .react-colorful {
|
|
8547
|
+
width: 100%;
|
|
8548
|
+
height: 150px;
|
|
8549
|
+
}
|
|
8550
|
+
.custom-react-colorful .react-colorful__saturation {
|
|
8551
|
+
border-radius: 8px 8px 0 0;
|
|
8552
|
+
border-bottom: 1px solid rgba(255,255,255,0.1);
|
|
8553
|
+
}
|
|
8554
|
+
.custom-react-colorful .react-colorful__hue {
|
|
8555
|
+
height: 16px;
|
|
8556
|
+
border-radius: 0 0 8px 8px;
|
|
8557
|
+
margin-top: 2px;
|
|
8558
|
+
}
|
|
8559
|
+
.custom-react-colorful .react-colorful__pointer {
|
|
8560
|
+
width: 16px;
|
|
8561
|
+
height: 16px;
|
|
8562
|
+
border: 2px solid #fff;
|
|
8563
|
+
box-shadow: 0 1px 4px rgba(0,0,0,0.5);
|
|
8564
|
+
}
|
|
8565
|
+
`));
|
|
8566
|
+
}
|
|
8567
|
+
return /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative w-full", ref: popoverRef }, /* @__PURE__ */ import_react13.default.createElement(
|
|
8568
|
+
"div",
|
|
8516
8569
|
{
|
|
8517
|
-
|
|
8518
|
-
onClick: () => !disabled && setIsOpen(!isOpen),
|
|
8519
|
-
className: "h-8 w-12 rounded-md border border-white/10 shadow-sm transition-transform hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden",
|
|
8520
|
-
style: { backgroundColor: color },
|
|
8521
|
-
title: "Abrir seletor de cor"
|
|
8570
|
+
className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${disabled ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}`
|
|
8522
8571
|
},
|
|
8523
|
-
/* @__PURE__ */ import_react13.default.createElement(
|
|
8524
|
-
|
|
8525
|
-
|
|
8526
|
-
|
|
8527
|
-
|
|
8528
|
-
|
|
8529
|
-
|
|
8530
|
-
|
|
8531
|
-
|
|
8532
|
-
|
|
8533
|
-
|
|
8534
|
-
|
|
8572
|
+
/* @__PURE__ */ import_react13.default.createElement(
|
|
8573
|
+
"button",
|
|
8574
|
+
{
|
|
8575
|
+
type: "button",
|
|
8576
|
+
onClick: () => !disabled && setIsOpen(!isOpen),
|
|
8577
|
+
className: "h-8 w-12 rounded-md border border-white/10 shadow-sm transition-transform hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden",
|
|
8578
|
+
style: { backgroundColor: color },
|
|
8579
|
+
title: "Abrir seletor de cor"
|
|
8580
|
+
},
|
|
8581
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 shadow-[inset_0_0_2px_rgba(255,255,255,0.2)]" })
|
|
8582
|
+
),
|
|
8583
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-800/50 rounded-md px-2 py-1.5 border border-white/5 focus-within:border-indigo-500/50 focus-within:ring-1 focus-within:ring-indigo-500/50 transition-all" }, /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiHash, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react13.default.createElement(
|
|
8584
|
+
"input",
|
|
8585
|
+
{
|
|
8586
|
+
type: "text",
|
|
8587
|
+
value: color.replace("#", ""),
|
|
8588
|
+
onChange: handleInputChange,
|
|
8589
|
+
disabled,
|
|
8590
|
+
className: "w-full bg-transparent border-none focus:ring-0 text-sm text-slate-200 uppercase font-mono placeholder-slate-600 p-0",
|
|
8591
|
+
maxLength: 6
|
|
8592
|
+
}
|
|
8593
|
+
))
|
|
8594
|
+
), isOpen && !disabled && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute top-full left-0 mt-2 z-[9999] p-3 bg-slate-950 rounded-xl border border-white/10 shadow-2xl w-[200px] animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "mb-3 custom-react-colorful" }, /* @__PURE__ */ import_react13.default.createElement(import_react_colorful.HexColorPicker, { color, onChange })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-px bg-white/10 my-3" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-5 gap-2" }, PRESET_COLORS.map((preset) => /* @__PURE__ */ import_react13.default.createElement(
|
|
8535
8595
|
"button",
|
|
8536
8596
|
{
|
|
8537
8597
|
key: preset,
|
|
@@ -13289,220 +13349,250 @@ var Tooltip = ({ text, children }) => {
|
|
|
13289
13349
|
if (!text) return children;
|
|
13290
13350
|
return /* @__PURE__ */ import_react29.default.createElement("div", { className: "relative group/tooltip" }, children, /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-slate-900 border border-white/10 text-white text-[10px] rounded opacity-0 group-hover/tooltip:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-[3000] shadow-2xl" }, text));
|
|
13291
13351
|
};
|
|
13292
|
-
var BoardItem = import_react29.default.memo(
|
|
13293
|
-
|
|
13294
|
-
|
|
13295
|
-
|
|
13296
|
-
|
|
13297
|
-
|
|
13298
|
-
|
|
13299
|
-
|
|
13300
|
-
|
|
13301
|
-
|
|
13302
|
-
|
|
13303
|
-
|
|
13304
|
-
|
|
13305
|
-
|
|
13306
|
-
|
|
13307
|
-
|
|
13308
|
-
|
|
13309
|
-
|
|
13310
|
-
|
|
13311
|
-
|
|
13312
|
-
|
|
13313
|
-
|
|
13314
|
-
|
|
13315
|
-
|
|
13316
|
-
|
|
13317
|
-
|
|
13318
|
-
|
|
13319
|
-
|
|
13320
|
-
|
|
13321
|
-
|
|
13322
|
-
|
|
13323
|
-
|
|
13324
|
-
|
|
13325
|
-
|
|
13326
|
-
|
|
13327
|
-
|
|
13328
|
-
|
|
13329
|
-
|
|
13330
|
-
|
|
13331
|
-
|
|
13332
|
-
|
|
13333
|
-
|
|
13334
|
-
|
|
13335
|
-
|
|
13336
|
-
|
|
13337
|
-
|
|
13338
|
-
|
|
13339
|
-
|
|
13340
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 left-0 w-1 bg-gradient-to-r from-indigo-500/20 to-transparent opacity-0 group-hover/folder:opacity-100 transition-opacity" }),
|
|
13341
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "w-9 h-9 rounded-lg bg-indigo-500/10 flex items-center justify-center text-indigo-400 group-hover/folder:scale-105 group-hover/folder:bg-indigo-500/20 transition-all duration-300 shadow-inner shrink-0" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiFolder, { size: 18 })),
|
|
13342
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(
|
|
13343
|
-
"input",
|
|
13344
|
-
{
|
|
13345
|
-
type: "text",
|
|
13346
|
-
value: item.name,
|
|
13347
|
-
onChange: handleNameChange,
|
|
13348
|
-
onClick: (e) => e.stopPropagation(),
|
|
13349
|
-
className: "bg-transparent border-none outline-none text-xs font-semibold text-slate-200 w-full focus:text-white placeholder:text-slate-600 truncate",
|
|
13350
|
-
placeholder: "Nome..."
|
|
13351
|
-
}
|
|
13352
|
-
) : /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-xs font-semibold text-slate-200 block truncate" }, item.name), /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[9px] text-slate-500 uppercase tracking-widest font-bold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens")),
|
|
13353
|
-
canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 right-1.5 opacity-0 group-hover/folder:opacity-100 transition-all duration-300 z-10 flex items-center" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex bg-slate-950/90 backdrop-blur-md p-1 rounded-lg border border-white/10 shadow-2xl items-center" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Mover" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13354
|
-
"button",
|
|
13352
|
+
var BoardItem = import_react29.default.memo(
|
|
13353
|
+
({
|
|
13354
|
+
item,
|
|
13355
|
+
index,
|
|
13356
|
+
prevItem,
|
|
13357
|
+
nextItem,
|
|
13358
|
+
onUpdate,
|
|
13359
|
+
onDelete,
|
|
13360
|
+
onAddSubgroup,
|
|
13361
|
+
onIndent,
|
|
13362
|
+
onIndentDown,
|
|
13363
|
+
onOutdent,
|
|
13364
|
+
onMoveUp,
|
|
13365
|
+
onMoveDown,
|
|
13366
|
+
searchItems,
|
|
13367
|
+
onMentionClick,
|
|
13368
|
+
onEnterFolder,
|
|
13369
|
+
canEdit,
|
|
13370
|
+
isAtRoot = false
|
|
13371
|
+
}) => {
|
|
13372
|
+
var _a;
|
|
13373
|
+
const isFolder = item.type === "folder";
|
|
13374
|
+
const canMoveUp = index > 0;
|
|
13375
|
+
const canMoveDown = nextItem !== void 0;
|
|
13376
|
+
const getIndentUpTooltip = () => {
|
|
13377
|
+
if (!prevItem) return null;
|
|
13378
|
+
const typeLabel = prevItem.type === "folder" ? "pasta" : "grupo de texto";
|
|
13379
|
+
return isFolder ? prevItem.type === "folder" ? "Aninhar na pasta ao lado" : null : `Mover para dentro do ${typeLabel} acima`;
|
|
13380
|
+
};
|
|
13381
|
+
const getIndentDownTooltip = () => {
|
|
13382
|
+
if (!nextItem) return null;
|
|
13383
|
+
const typeLabel = nextItem.type === "folder" ? "pasta" : "grupo de texto";
|
|
13384
|
+
return isFolder ? nextItem.type === "folder" ? "Aninhar na pasta lado" : null : `Mover para dentro do ${typeLabel} abaixo`;
|
|
13385
|
+
};
|
|
13386
|
+
const showIndentUp = !!getIndentUpTooltip();
|
|
13387
|
+
const showIndentDown = !!getIndentDownTooltip();
|
|
13388
|
+
const handleContentChange = (content) => {
|
|
13389
|
+
onUpdate(item.id, { ...item, content });
|
|
13390
|
+
};
|
|
13391
|
+
const handleNameChange = (e) => {
|
|
13392
|
+
onUpdate(item.id, { ...item, name: e.target.value });
|
|
13393
|
+
};
|
|
13394
|
+
const handleColorChange = (newColor) => {
|
|
13395
|
+
onUpdate(item.id, { ...item, color: newColor });
|
|
13396
|
+
};
|
|
13397
|
+
if (isFolder) {
|
|
13398
|
+
return /* @__PURE__ */ import_react29.default.createElement("div", { className: "relative group/item animate-in fade-in zoom-in duration-300 w-[calc(16.66%-14px)] min-w-[160px] h-14 flex-shrink-0" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13399
|
+
"div",
|
|
13355
13400
|
{
|
|
13356
|
-
onClick: (
|
|
13357
|
-
|
|
13358
|
-
onMoveUp(item.id);
|
|
13359
|
-
},
|
|
13360
|
-
disabled: !canMoveUp,
|
|
13361
|
-
className: `p-1 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
|
|
13401
|
+
onClick: () => onEnterFolder(item.id),
|
|
13402
|
+
className: "h-full flex items-center gap-3 px-3 py-2 bg-white/5 hover:bg-white/10 border border-white/10 hover:border-white/20 rounded-xl cursor-pointer transition-all duration-300 group/folder relative"
|
|
13362
13403
|
},
|
|
13363
|
-
/* @__PURE__ */ import_react29.default.createElement(
|
|
13364
|
-
|
|
13365
|
-
|
|
13366
|
-
|
|
13367
|
-
|
|
13368
|
-
|
|
13369
|
-
|
|
13404
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
13405
|
+
"div",
|
|
13406
|
+
{
|
|
13407
|
+
className: "absolute inset-y-0 left-0 w-1 opacity-0 group-hover/folder:opacity-100 transition-opacity rounded-l-xl",
|
|
13408
|
+
style: { background: `linear-gradient(to right, ${item.color || "#6366f1"}33, transparent)` }
|
|
13409
|
+
}
|
|
13410
|
+
),
|
|
13411
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
13412
|
+
"div",
|
|
13413
|
+
{
|
|
13414
|
+
className: "w-9 h-9 rounded-lg flex items-center justify-center group-hover/folder:scale-105 transition-all duration-300 shadow-inner shrink-0",
|
|
13415
|
+
style: {
|
|
13416
|
+
backgroundColor: `${item.color || "#6366f1"}1a`,
|
|
13417
|
+
// 10% opacity
|
|
13418
|
+
color: item.color || "#6366f1"
|
|
13419
|
+
}
|
|
13370
13420
|
},
|
|
13371
|
-
|
|
13372
|
-
|
|
13373
|
-
},
|
|
13374
|
-
|
|
13375
|
-
|
|
13376
|
-
|
|
13377
|
-
|
|
13378
|
-
|
|
13379
|
-
e.stopPropagation()
|
|
13380
|
-
|
|
13421
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiFolder, { size: 18 })
|
|
13422
|
+
),
|
|
13423
|
+
/* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(
|
|
13424
|
+
"input",
|
|
13425
|
+
{
|
|
13426
|
+
type: "text",
|
|
13427
|
+
value: item.name,
|
|
13428
|
+
onChange: handleNameChange,
|
|
13429
|
+
onClick: (e) => e.stopPropagation(),
|
|
13430
|
+
className: "bg-transparent border-none outline-none text-xs font-semibold text-slate-200 w-full focus:text-white placeholder:text-slate-600 truncate",
|
|
13431
|
+
placeholder: "Nome..."
|
|
13432
|
+
}
|
|
13433
|
+
) : /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-xs font-semibold text-slate-200 block truncate" }, item.name), /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[9px] text-slate-500 uppercase tracking-widest font-bold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens")),
|
|
13434
|
+
canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 right-1.5 opacity-0 group-hover/folder:opacity-100 transition-all duration-300 z-10 flex items-center" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex bg-slate-950/90 backdrop-blur-md p-1 rounded-lg border border-white/10 shadow-2xl items-center" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13435
|
+
"button",
|
|
13436
|
+
{
|
|
13437
|
+
onClick: (e) => {
|
|
13438
|
+
e.stopPropagation();
|
|
13439
|
+
onMoveUp(item.id);
|
|
13440
|
+
},
|
|
13441
|
+
disabled: !canMoveUp,
|
|
13442
|
+
className: `p-1 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
|
|
13381
13443
|
},
|
|
13382
|
-
|
|
13383
|
-
},
|
|
13384
|
-
|
|
13385
|
-
|
|
13386
|
-
|
|
13387
|
-
|
|
13388
|
-
|
|
13389
|
-
|
|
13390
|
-
|
|
13444
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
|
|
13445
|
+
)), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13446
|
+
"button",
|
|
13447
|
+
{
|
|
13448
|
+
onClick: (e) => {
|
|
13449
|
+
e.stopPropagation();
|
|
13450
|
+
onMoveDown(item.id);
|
|
13451
|
+
},
|
|
13452
|
+
disabled: !canMoveDown,
|
|
13453
|
+
className: `p-1 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
|
|
13391
13454
|
},
|
|
13392
|
-
|
|
13393
|
-
},
|
|
13394
|
-
|
|
13395
|
-
|
|
13396
|
-
|
|
13397
|
-
|
|
13398
|
-
|
|
13399
|
-
|
|
13400
|
-
|
|
13455
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
|
|
13456
|
+
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13457
|
+
"button",
|
|
13458
|
+
{
|
|
13459
|
+
onClick: (e) => {
|
|
13460
|
+
e.stopPropagation();
|
|
13461
|
+
onIndent(item.id);
|
|
13462
|
+
},
|
|
13463
|
+
className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13401
13464
|
},
|
|
13402
|
-
|
|
13403
|
-
},
|
|
13404
|
-
|
|
13405
|
-
|
|
13406
|
-
|
|
13407
|
-
|
|
13408
|
-
|
|
13409
|
-
|
|
13410
|
-
|
|
13465
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
|
|
13466
|
+
)), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13467
|
+
"button",
|
|
13468
|
+
{
|
|
13469
|
+
onClick: (e) => {
|
|
13470
|
+
e.stopPropagation();
|
|
13471
|
+
onIndentDown(item.id);
|
|
13472
|
+
},
|
|
13473
|
+
className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13411
13474
|
},
|
|
13412
|
-
|
|
13413
|
-
},
|
|
13414
|
-
|
|
13415
|
-
|
|
13416
|
-
|
|
13417
|
-
|
|
13418
|
-
|
|
13419
|
-
|
|
13420
|
-
|
|
13421
|
-
|
|
13422
|
-
|
|
13423
|
-
|
|
13424
|
-
|
|
13425
|
-
|
|
13426
|
-
|
|
13427
|
-
|
|
13428
|
-
|
|
13429
|
-
|
|
13430
|
-
|
|
13431
|
-
|
|
13432
|
-
|
|
13433
|
-
|
|
13434
|
-
|
|
13435
|
-
|
|
13436
|
-
|
|
13437
|
-
|
|
13438
|
-
|
|
13439
|
-
|
|
13440
|
-
|
|
13441
|
-
|
|
13442
|
-
|
|
13443
|
-
},
|
|
13444
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
|
|
13445
|
-
)), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13446
|
-
"button",
|
|
13447
|
-
{
|
|
13448
|
-
onClick: () => onMoveDown(item.id),
|
|
13449
|
-
disabled: !canMoveDown,
|
|
13450
|
-
className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
|
|
13451
|
-
},
|
|
13452
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
|
|
13453
|
-
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13454
|
-
"button",
|
|
13455
|
-
{
|
|
13456
|
-
onClick: () => onIndent(item.id),
|
|
13457
|
-
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13458
|
-
},
|
|
13459
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
|
|
13460
|
-
)), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13461
|
-
"button",
|
|
13462
|
-
{
|
|
13463
|
-
onClick: () => onIndentDown(item.id),
|
|
13464
|
-
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13465
|
-
},
|
|
13466
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
|
|
13467
|
-
)), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13468
|
-
"button",
|
|
13469
|
-
{
|
|
13470
|
-
onClick: () => onOutdent(item.id),
|
|
13471
|
-
disabled: !onOutdent,
|
|
13472
|
-
className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
|
|
13473
|
-
},
|
|
13474
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
|
|
13475
|
-
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Grupo de Texto" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13476
|
-
"button",
|
|
13477
|
-
{
|
|
13478
|
-
onClick: () => onDelete(item.id),
|
|
13479
|
-
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
|
|
13480
|
-
},
|
|
13481
|
-
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
|
|
13482
|
-
))))), item.children && item.children.length > 0 && /* @__PURE__ */ import_react29.default.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ import_react29.default.createElement(
|
|
13483
|
-
BoardItem,
|
|
13484
|
-
{
|
|
13485
|
-
key: child.id,
|
|
13486
|
-
index: idx,
|
|
13487
|
-
prevItem: item.children[idx - 1],
|
|
13488
|
-
nextItem: item.children[idx + 1],
|
|
13489
|
-
item: child,
|
|
13490
|
-
onUpdate,
|
|
13491
|
-
onDelete,
|
|
13492
|
-
onAddSubgroup,
|
|
13493
|
-
onIndent,
|
|
13494
|
-
onIndentDown,
|
|
13495
|
-
onOutdent,
|
|
13496
|
-
onMoveUp,
|
|
13497
|
-
onMoveDown,
|
|
13498
|
-
searchItems,
|
|
13499
|
-
onMentionClick,
|
|
13500
|
-
onEnterFolder,
|
|
13501
|
-
canEdit,
|
|
13502
|
-
isAtRoot: false
|
|
13475
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
|
|
13476
|
+
)), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13477
|
+
"button",
|
|
13478
|
+
{
|
|
13479
|
+
onClick: (e) => {
|
|
13480
|
+
e.stopPropagation();
|
|
13481
|
+
onOutdent(item.id);
|
|
13482
|
+
},
|
|
13483
|
+
className: `p-1 rounded text-slate-400 hover:text-white hover:bg-white/10 transition-colors`
|
|
13484
|
+
},
|
|
13485
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
|
|
13486
|
+
))), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Pasta" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13487
|
+
"button",
|
|
13488
|
+
{
|
|
13489
|
+
onClick: (e) => {
|
|
13490
|
+
e.stopPropagation();
|
|
13491
|
+
onDelete(item.id);
|
|
13492
|
+
},
|
|
13493
|
+
className: "p-1 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
|
|
13494
|
+
},
|
|
13495
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
|
|
13496
|
+
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement("div", { className: "px-1", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13497
|
+
ColorPicker,
|
|
13498
|
+
{
|
|
13499
|
+
isCompact: true,
|
|
13500
|
+
color: item.color || "#6366f1",
|
|
13501
|
+
onChange: handleColorChange,
|
|
13502
|
+
disabled: !canEdit
|
|
13503
|
+
}
|
|
13504
|
+
))))
|
|
13505
|
+
));
|
|
13503
13506
|
}
|
|
13504
|
-
|
|
13505
|
-
|
|
13507
|
+
return /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-full flex flex-col gap-2 mb-3 pl-4 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col gap-2 py-2 px-3 transition-all duration-200 hover:bg-white/5 border-l-2 border-transparent hover:border-white/20" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13508
|
+
RichGroupEditor_default,
|
|
13509
|
+
{
|
|
13510
|
+
content: item.content,
|
|
13511
|
+
onChange: handleContentChange,
|
|
13512
|
+
onMentionClick,
|
|
13513
|
+
searchItems,
|
|
13514
|
+
readOnly: !canEdit,
|
|
13515
|
+
placeholder: "Escreva sobre este grupo de texto\u2026 ou @ para mencionar"
|
|
13516
|
+
}
|
|
13517
|
+
), canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13518
|
+
"button",
|
|
13519
|
+
{
|
|
13520
|
+
onClick: () => onAddSubgroup(item.id, "text_group"),
|
|
13521
|
+
className: "flex items-center gap-1 px-1.5 py-1 text-[10px] uppercase font-bold tracking-wider text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
|
|
13522
|
+
title: "Criar Subgrupo de Texto"
|
|
13523
|
+
},
|
|
13524
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiPlus, { size: 12 }),
|
|
13525
|
+
/* @__PURE__ */ import_react29.default.createElement("span", null, "Subgrupo")
|
|
13526
|
+
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13527
|
+
"button",
|
|
13528
|
+
{
|
|
13529
|
+
onClick: () => onMoveUp(item.id),
|
|
13530
|
+
disabled: !canMoveUp,
|
|
13531
|
+
className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
|
|
13532
|
+
},
|
|
13533
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
|
|
13534
|
+
)), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13535
|
+
"button",
|
|
13536
|
+
{
|
|
13537
|
+
onClick: () => onMoveDown(item.id),
|
|
13538
|
+
disabled: !canMoveDown,
|
|
13539
|
+
className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
|
|
13540
|
+
},
|
|
13541
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
|
|
13542
|
+
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13543
|
+
"button",
|
|
13544
|
+
{
|
|
13545
|
+
onClick: () => onIndent(item.id),
|
|
13546
|
+
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13547
|
+
},
|
|
13548
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
|
|
13549
|
+
)), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13550
|
+
"button",
|
|
13551
|
+
{
|
|
13552
|
+
onClick: () => onIndentDown(item.id),
|
|
13553
|
+
className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
|
|
13554
|
+
},
|
|
13555
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
|
|
13556
|
+
)), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13557
|
+
"button",
|
|
13558
|
+
{
|
|
13559
|
+
onClick: () => onOutdent(item.id),
|
|
13560
|
+
disabled: !onOutdent,
|
|
13561
|
+
className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
|
|
13562
|
+
},
|
|
13563
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
|
|
13564
|
+
)), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Grupo de Texto" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
13565
|
+
"button",
|
|
13566
|
+
{
|
|
13567
|
+
onClick: () => onDelete(item.id),
|
|
13568
|
+
className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
|
|
13569
|
+
},
|
|
13570
|
+
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
|
|
13571
|
+
))))), item.children && item.children.length > 0 && /* @__PURE__ */ import_react29.default.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ import_react29.default.createElement(
|
|
13572
|
+
BoardItem,
|
|
13573
|
+
{
|
|
13574
|
+
key: child.id,
|
|
13575
|
+
index: idx,
|
|
13576
|
+
prevItem: item.children[idx - 1],
|
|
13577
|
+
nextItem: item.children[idx + 1],
|
|
13578
|
+
item: child,
|
|
13579
|
+
onUpdate,
|
|
13580
|
+
onDelete,
|
|
13581
|
+
onAddSubgroup,
|
|
13582
|
+
onIndent,
|
|
13583
|
+
onIndentDown,
|
|
13584
|
+
onOutdent,
|
|
13585
|
+
onMoveUp,
|
|
13586
|
+
onMoveDown,
|
|
13587
|
+
searchItems,
|
|
13588
|
+
onMentionClick,
|
|
13589
|
+
onEnterFolder,
|
|
13590
|
+
canEdit,
|
|
13591
|
+
isAtRoot: false
|
|
13592
|
+
}
|
|
13593
|
+
))));
|
|
13594
|
+
}
|
|
13595
|
+
);
|
|
13506
13596
|
function Boards({
|
|
13507
13597
|
isOpen,
|
|
13508
13598
|
onClose,
|
|
@@ -13530,13 +13620,17 @@ function Boards({
|
|
|
13530
13620
|
}
|
|
13531
13621
|
return null;
|
|
13532
13622
|
};
|
|
13533
|
-
const sanitizeBoardItems = (0, import_react29.useCallback)(
|
|
13534
|
-
|
|
13535
|
-
|
|
13536
|
-
|
|
13537
|
-
|
|
13538
|
-
|
|
13539
|
-
|
|
13623
|
+
const sanitizeBoardItems = (0, import_react29.useCallback)(
|
|
13624
|
+
(list) => list.map((g) => ({
|
|
13625
|
+
id: g.id,
|
|
13626
|
+
type: g.type || "text_group",
|
|
13627
|
+
name: g.name || "",
|
|
13628
|
+
color: g.color || void 0,
|
|
13629
|
+
content: g.content || [],
|
|
13630
|
+
children: sanitizeBoardItems(g.children || [])
|
|
13631
|
+
})),
|
|
13632
|
+
[]
|
|
13633
|
+
);
|
|
13540
13634
|
(0, import_react29.useEffect)(() => {
|
|
13541
13635
|
if (initialBoardItems && !isLoaded) {
|
|
13542
13636
|
const hasLegacyTypes = (list) => list.some(
|
|
@@ -13551,6 +13645,7 @@ function Boards({
|
|
|
13551
13645
|
id: g.id || (0, import_uuid11.v4)(),
|
|
13552
13646
|
type: g.type || "text_group",
|
|
13553
13647
|
name: g.name || "",
|
|
13648
|
+
color: g.color || void 0,
|
|
13554
13649
|
content: Array.isArray(g.content) ? g.content : [],
|
|
13555
13650
|
children: prepare(g.children || [])
|
|
13556
13651
|
}));
|
|
@@ -13608,21 +13703,24 @@ function Boards({
|
|
|
13608
13703
|
}, 3e3);
|
|
13609
13704
|
return () => clearTimeout(id);
|
|
13610
13705
|
}, [boardItems, isLoaded, onSave, sanitizeBoardItems]);
|
|
13611
|
-
const triggerInstantSave = (0, import_react29.useCallback)(
|
|
13612
|
-
|
|
13613
|
-
|
|
13614
|
-
|
|
13615
|
-
|
|
13616
|
-
|
|
13617
|
-
|
|
13618
|
-
|
|
13619
|
-
|
|
13620
|
-
|
|
13621
|
-
|
|
13622
|
-
|
|
13623
|
-
|
|
13624
|
-
|
|
13625
|
-
|
|
13706
|
+
const triggerInstantSave = (0, import_react29.useCallback)(
|
|
13707
|
+
async (updatedBoardItems) => {
|
|
13708
|
+
if (!onSave) return;
|
|
13709
|
+
const sanitized = sanitizeBoardItems(updatedBoardItems);
|
|
13710
|
+
const sanitizedJson = JSON.stringify(sanitized);
|
|
13711
|
+
lastSavedBoardItemsRef.current = sanitizedJson;
|
|
13712
|
+
setSaveStatus("saving");
|
|
13713
|
+
try {
|
|
13714
|
+
await onSave(sanitized);
|
|
13715
|
+
setSaveStatus("saved");
|
|
13716
|
+
setTimeout(() => setSaveStatus("idle"), 3e3);
|
|
13717
|
+
} catch (err) {
|
|
13718
|
+
console.error("Erro ao salvar board:", err);
|
|
13719
|
+
setSaveStatus("error");
|
|
13720
|
+
}
|
|
13721
|
+
},
|
|
13722
|
+
[onSave, sanitizeBoardItems]
|
|
13723
|
+
);
|
|
13626
13724
|
(0, import_react29.useEffect)(() => {
|
|
13627
13725
|
if (!isOpen) return;
|
|
13628
13726
|
const handler = (e) => {
|
|
@@ -13651,24 +13749,28 @@ function Boards({
|
|
|
13651
13749
|
const lastFolder = currentPath[currentPath.length - 1];
|
|
13652
13750
|
return lastFolder ? lastFolder.children : boardItems;
|
|
13653
13751
|
}, [boardItems, currentPath]);
|
|
13654
|
-
const handleAddItem = (0, import_react29.useCallback)(
|
|
13655
|
-
|
|
13656
|
-
|
|
13657
|
-
|
|
13658
|
-
|
|
13659
|
-
|
|
13660
|
-
|
|
13661
|
-
|
|
13662
|
-
|
|
13663
|
-
|
|
13664
|
-
|
|
13665
|
-
|
|
13666
|
-
|
|
13667
|
-
|
|
13668
|
-
|
|
13669
|
-
|
|
13670
|
-
|
|
13671
|
-
|
|
13752
|
+
const handleAddItem = (0, import_react29.useCallback)(
|
|
13753
|
+
(type = "text_group") => {
|
|
13754
|
+
const newItem = {
|
|
13755
|
+
id: (0, import_uuid11.v4)(),
|
|
13756
|
+
type,
|
|
13757
|
+
name: type === "folder" ? "Nova Pasta" : "",
|
|
13758
|
+
color: type === "folder" ? "#6366f1" : void 0,
|
|
13759
|
+
content: [],
|
|
13760
|
+
children: []
|
|
13761
|
+
};
|
|
13762
|
+
if (navigationStack.length === 0) {
|
|
13763
|
+
setBoardItems((prev) => [...prev, newItem]);
|
|
13764
|
+
} else {
|
|
13765
|
+
const parentId = navigationStack[navigationStack.length - 1];
|
|
13766
|
+
const add = (list) => list.map(
|
|
13767
|
+
(g) => g.id === parentId ? { ...g, children: [...g.children, newItem] } : { ...g, children: add(g.children) }
|
|
13768
|
+
);
|
|
13769
|
+
setBoardItems((prev) => add(prev));
|
|
13770
|
+
}
|
|
13771
|
+
},
|
|
13772
|
+
[navigationStack]
|
|
13773
|
+
);
|
|
13672
13774
|
const handleAddSubgroup = (0, import_react29.useCallback)((parentId, type = "text_group") => {
|
|
13673
13775
|
const add = (list) => list.map((g) => {
|
|
13674
13776
|
if (g.id === parentId) {
|
|
@@ -13677,6 +13779,7 @@ function Boards({
|
|
|
13677
13779
|
id: (0, import_uuid11.v4)(),
|
|
13678
13780
|
type,
|
|
13679
13781
|
name: type === "folder" ? "Nova Pasta" : "",
|
|
13782
|
+
color: type === "folder" ? "#6366f1" : void 0,
|
|
13680
13783
|
content: [],
|
|
13681
13784
|
children: []
|
|
13682
13785
|
};
|
|
@@ -13696,70 +13799,88 @@ function Boards({
|
|
|
13696
13799
|
const del = (list) => list.filter((g) => g.id !== id).map((g) => ({ ...g, children: del(g.children) }));
|
|
13697
13800
|
setBoardItems((prev) => del(prev));
|
|
13698
13801
|
}, []);
|
|
13699
|
-
const handleIndent = (0, import_react29.useCallback)(
|
|
13700
|
-
|
|
13701
|
-
|
|
13702
|
-
|
|
13703
|
-
|
|
13704
|
-
|
|
13705
|
-
|
|
13706
|
-
|
|
13707
|
-
|
|
13708
|
-
|
|
13709
|
-
|
|
13710
|
-
|
|
13711
|
-
|
|
13712
|
-
|
|
13713
|
-
|
|
13714
|
-
|
|
13715
|
-
|
|
13716
|
-
|
|
13717
|
-
|
|
13718
|
-
|
|
13719
|
-
|
|
13720
|
-
|
|
13721
|
-
|
|
13722
|
-
|
|
13723
|
-
|
|
13724
|
-
|
|
13725
|
-
|
|
13726
|
-
|
|
13727
|
-
|
|
13728
|
-
|
|
13729
|
-
|
|
13730
|
-
|
|
13731
|
-
|
|
13732
|
-
|
|
13733
|
-
|
|
13734
|
-
|
|
13735
|
-
|
|
13736
|
-
|
|
13737
|
-
|
|
13738
|
-
|
|
13739
|
-
|
|
13740
|
-
|
|
13741
|
-
|
|
13742
|
-
|
|
13743
|
-
|
|
13744
|
-
|
|
13745
|
-
|
|
13746
|
-
|
|
13747
|
-
|
|
13748
|
-
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
|
|
13754
|
-
|
|
13755
|
-
|
|
13756
|
-
|
|
13757
|
-
|
|
13758
|
-
|
|
13759
|
-
|
|
13760
|
-
|
|
13761
|
-
|
|
13762
|
-
|
|
13802
|
+
const handleIndent = (0, import_react29.useCallback)(
|
|
13803
|
+
(id) => {
|
|
13804
|
+
const next = JSON.parse(JSON.stringify(boardItems));
|
|
13805
|
+
const found = findGroupAndParent(next, id);
|
|
13806
|
+
if (!found || found.index === 0) return;
|
|
13807
|
+
const { group, siblings, index } = found;
|
|
13808
|
+
const targetParent = siblings[index - 1];
|
|
13809
|
+
if (group.type === "folder" && targetParent.type === "text_group") return;
|
|
13810
|
+
siblings.splice(index, 1);
|
|
13811
|
+
targetParent.children.push(group);
|
|
13812
|
+
setBoardItems(next);
|
|
13813
|
+
triggerInstantSave(next);
|
|
13814
|
+
},
|
|
13815
|
+
[boardItems, triggerInstantSave]
|
|
13816
|
+
);
|
|
13817
|
+
const handleIndentDown = (0, import_react29.useCallback)(
|
|
13818
|
+
(id) => {
|
|
13819
|
+
const next = JSON.parse(JSON.stringify(boardItems));
|
|
13820
|
+
const found = findGroupAndParent(next, id);
|
|
13821
|
+
if (!found || found.index === found.siblings.length - 1) return;
|
|
13822
|
+
const { group, siblings, index } = found;
|
|
13823
|
+
const targetParent = siblings[index + 1];
|
|
13824
|
+
if (group.type === "folder" && targetParent.type === "text_group") return;
|
|
13825
|
+
siblings.splice(index, 1);
|
|
13826
|
+
targetParent.children.push(group);
|
|
13827
|
+
setBoardItems(next);
|
|
13828
|
+
triggerInstantSave(next);
|
|
13829
|
+
},
|
|
13830
|
+
[boardItems, triggerInstantSave]
|
|
13831
|
+
);
|
|
13832
|
+
const handleOutdent = (0, import_react29.useCallback)(
|
|
13833
|
+
(id) => {
|
|
13834
|
+
const next = JSON.parse(JSON.stringify(boardItems));
|
|
13835
|
+
const found = findGroupAndParent(next, id);
|
|
13836
|
+
if (!found || !found.parent) return;
|
|
13837
|
+
const { group, siblings, index, parent } = found;
|
|
13838
|
+
siblings.splice(index, 1);
|
|
13839
|
+
const parentFound = findGroupAndParent(next, parent.id);
|
|
13840
|
+
if (parentFound) {
|
|
13841
|
+
parentFound.siblings.splice(parentFound.index + 1, 0, group);
|
|
13842
|
+
} else {
|
|
13843
|
+
next.push(group);
|
|
13844
|
+
}
|
|
13845
|
+
setBoardItems(next);
|
|
13846
|
+
triggerInstantSave(next);
|
|
13847
|
+
},
|
|
13848
|
+
[boardItems, triggerInstantSave]
|
|
13849
|
+
);
|
|
13850
|
+
const handleMoveUp = (0, import_react29.useCallback)(
|
|
13851
|
+
(id) => {
|
|
13852
|
+
const next = JSON.parse(JSON.stringify(boardItems));
|
|
13853
|
+
const found = findGroupAndParent(next, id);
|
|
13854
|
+
if (!found || found.index === 0) return;
|
|
13855
|
+
const { siblings, index } = found;
|
|
13856
|
+
const item = siblings[index];
|
|
13857
|
+
siblings.splice(index, 1);
|
|
13858
|
+
siblings.splice(index - 1, 0, item);
|
|
13859
|
+
setBoardItems(next);
|
|
13860
|
+
triggerInstantSave(next);
|
|
13861
|
+
},
|
|
13862
|
+
[boardItems, triggerInstantSave]
|
|
13863
|
+
);
|
|
13864
|
+
const handleMoveDown = (0, import_react29.useCallback)(
|
|
13865
|
+
(id) => {
|
|
13866
|
+
const next = JSON.parse(JSON.stringify(boardItems));
|
|
13867
|
+
const found = findGroupAndParent(next, id);
|
|
13868
|
+
if (!found || found.index === found.siblings.length - 1) return;
|
|
13869
|
+
const { siblings, index } = found;
|
|
13870
|
+
const item = siblings[index];
|
|
13871
|
+
siblings.splice(index, 1);
|
|
13872
|
+
siblings.splice(index + 1, 0, item);
|
|
13873
|
+
setBoardItems(next);
|
|
13874
|
+
triggerInstantSave(next);
|
|
13875
|
+
},
|
|
13876
|
+
[boardItems, triggerInstantSave]
|
|
13877
|
+
);
|
|
13878
|
+
const handleMentionClick = (0, import_react29.useCallback)(
|
|
13879
|
+
(item) => {
|
|
13880
|
+
if (onSelect) onSelect(item);
|
|
13881
|
+
},
|
|
13882
|
+
[onSelect]
|
|
13883
|
+
);
|
|
13763
13884
|
const navigateUp = (0, import_react29.useCallback)(() => {
|
|
13764
13885
|
setNavigationStack((prev) => prev.slice(0, -1));
|
|
13765
13886
|
}, []);
|