@arbidocs/blocks 0.4.126 → 0.4.127
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/agents/index.cjs +303 -303
- package/dist/agents/index.js +11 -11
- package/dist/calls/index.cjs +3 -3
- package/dist/calls/index.js +2 -2
- package/dist/chat/index.cjs +135 -135
- package/dist/chat/index.js +4 -4
- package/dist/{chunk-7HAM7Y5U.js → chunk-2DFDFOM7.js} +3 -3
- package/dist/{chunk-7HAM7Y5U.js.map → chunk-2DFDFOM7.js.map} +1 -1
- package/dist/{chunk-54ANPPMV.js → chunk-2PNNCEPH.js} +4 -4
- package/dist/{chunk-54ANPPMV.js.map → chunk-2PNNCEPH.js.map} +1 -1
- package/dist/{chunk-P5ST47VY.js → chunk-5Y7JRY7Y.js} +3 -3
- package/dist/{chunk-P5ST47VY.js.map → chunk-5Y7JRY7Y.js.map} +1 -1
- package/dist/{chunk-HM23LXUP.cjs → chunk-6AALMYPS.cjs} +3 -3
- package/dist/{chunk-HM23LXUP.cjs.map → chunk-6AALMYPS.cjs.map} +1 -1
- package/dist/{chunk-IXTQYFIF.js → chunk-6HCJ3ZEU.js} +34 -6
- package/dist/chunk-6HCJ3ZEU.js.map +1 -0
- package/dist/{chunk-JJLMCV3T.js → chunk-ECERC6TI.js} +32 -28
- package/dist/chunk-ECERC6TI.js.map +1 -0
- package/dist/{chunk-VW2C2AZL.js → chunk-ENDP7JER.js} +3 -3
- package/dist/{chunk-VW2C2AZL.js.map → chunk-ENDP7JER.js.map} +1 -1
- package/dist/{chunk-D4YR56FV.cjs → chunk-KYDRUFWT.cjs} +5 -5
- package/dist/{chunk-D4YR56FV.cjs.map → chunk-KYDRUFWT.cjs.map} +1 -1
- package/dist/{chunk-W27VK32R.cjs → chunk-MCPRNDOJ.cjs} +79 -79
- package/dist/{chunk-W27VK32R.cjs.map → chunk-MCPRNDOJ.cjs.map} +1 -1
- package/dist/{chunk-ZV3BKLFY.cjs → chunk-NYHGG2IA.cjs} +3 -3
- package/dist/{chunk-ZV3BKLFY.cjs.map → chunk-NYHGG2IA.cjs.map} +1 -1
- package/dist/{chunk-U6MPHCEB.cjs → chunk-O6IEZDRC.cjs} +33 -5
- package/dist/chunk-O6IEZDRC.cjs.map +1 -0
- package/dist/{chunk-WV4IDVDQ.cjs → chunk-PJJY6CYL.cjs} +11 -11
- package/dist/{chunk-WV4IDVDQ.cjs.map → chunk-PJJY6CYL.cjs.map} +1 -1
- package/dist/{chunk-CXLVI3SB.js → chunk-PUCY3UXN.js} +3 -3
- package/dist/{chunk-CXLVI3SB.js.map → chunk-PUCY3UXN.js.map} +1 -1
- package/dist/{chunk-LC2KJSUS.cjs → chunk-SARREDFP.cjs} +46 -46
- package/dist/{chunk-LC2KJSUS.cjs.map → chunk-SARREDFP.cjs.map} +1 -1
- package/dist/{chunk-KLOSOT26.js → chunk-T2CVFK2I.js} +11 -11
- package/dist/{chunk-KLOSOT26.js.map → chunk-T2CVFK2I.js.map} +1 -1
- package/dist/{chunk-HQH35JWC.js → chunk-T6I6ZCBE.js} +3 -3
- package/dist/{chunk-HQH35JWC.js.map → chunk-T6I6ZCBE.js.map} +1 -1
- package/dist/{chunk-Y4X3RBFI.js → chunk-UUXKB3WQ.js} +3 -3
- package/dist/{chunk-Y4X3RBFI.js.map → chunk-UUXKB3WQ.js.map} +1 -1
- package/dist/{chunk-VMZXFYHK.cjs → chunk-XFKF3WRN.cjs} +5 -5
- package/dist/{chunk-VMZXFYHK.cjs.map → chunk-XFKF3WRN.cjs.map} +1 -1
- package/dist/{chunk-GICUGQNN.cjs → chunk-ZAVEMQ37.cjs} +31 -27
- package/dist/chunk-ZAVEMQ37.cjs.map +1 -0
- package/dist/{chunk-4VCKYR4D.cjs → chunk-ZLRQ5K77.cjs} +4 -4
- package/dist/{chunk-4VCKYR4D.cjs.map → chunk-ZLRQ5K77.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +23 -23
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailMessageView.d.ts +5 -1
- package/dist/connect/index.cjs +117 -62
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +67 -12
- package/dist/connect/index.js.map +1 -1
- package/dist/document-tools/index.cjs +1 -1
- package/dist/document-tools/index.js +1 -1
- package/dist/facts/index.cjs +1 -1
- package/dist/facts/index.js +1 -1
- package/dist/files/index.cjs +1 -1
- package/dist/files/index.js +1 -1
- package/dist/home/index.cjs +17 -17
- package/dist/home/index.js +3 -3
- package/dist/index.cjs +652 -652
- package/dist/index.js +22 -22
- package/dist/settings/ConfirmDialog.d.ts +4 -1
- package/dist/settings/index.cjs +14 -14
- package/dist/settings/index.js +4 -4
- package/dist/shell/index.cjs +1 -1
- package/dist/shell/index.js +1 -1
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +6 -6
- package/dist/studio/index.js +5 -5
- package/dist/workflow-canvas/index.cjs +62 -62
- package/dist/workflow-canvas/index.js +11 -11
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-GICUGQNN.cjs.map +0 -1
- package/dist/chunk-IXTQYFIF.js.map +0 -1
- package/dist/chunk-JJLMCV3T.js.map +0 -1
- package/dist/chunk-U6MPHCEB.cjs.map +0 -1
|
@@ -2,26 +2,26 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
|
|
5
|
-
var
|
|
6
|
-
require('../chunk-ZV3BKLFY.cjs');
|
|
7
|
-
require('../chunk-S5HZBXZA.cjs');
|
|
8
|
-
require('../chunk-ZW6FPIFC.cjs');
|
|
9
|
-
var chunkLC2KJSUS_cjs = require('../chunk-LC2KJSUS.cjs');
|
|
10
|
-
require('../chunk-7D737FLE.cjs');
|
|
11
|
-
require('../chunk-N26CXGXC.cjs');
|
|
5
|
+
var chunkMCPRNDOJ_cjs = require('../chunk-MCPRNDOJ.cjs');
|
|
12
6
|
require('../chunk-3AFWGEDJ.cjs');
|
|
7
|
+
require('../chunk-S5HZBXZA.cjs');
|
|
13
8
|
require('../chunk-DVUZTGVL.cjs');
|
|
14
|
-
require('../chunk-
|
|
9
|
+
require('../chunk-ZW6FPIFC.cjs');
|
|
10
|
+
var chunkSARREDFP_cjs = require('../chunk-SARREDFP.cjs');
|
|
15
11
|
require('../chunk-DETZZBG2.cjs');
|
|
12
|
+
require('../chunk-N26CXGXC.cjs');
|
|
16
13
|
require('../chunk-V4ISCZJ7.cjs');
|
|
17
14
|
require('../chunk-2EI7NCUA.cjs');
|
|
18
15
|
require('../chunk-C2CWWEHO.cjs');
|
|
19
|
-
require('../chunk-
|
|
16
|
+
require('../chunk-NYHGG2IA.cjs');
|
|
17
|
+
require('../chunk-OB5F4577.cjs');
|
|
18
|
+
require('../chunk-7D737FLE.cjs');
|
|
20
19
|
require('../chunk-ULWRNGGE.cjs');
|
|
21
|
-
|
|
22
|
-
require('../chunk-
|
|
20
|
+
require('../chunk-7RGLTF76.cjs');
|
|
21
|
+
var chunk6AALMYPS_cjs = require('../chunk-6AALMYPS.cjs');
|
|
23
22
|
var chunk32HW2Q33_cjs = require('../chunk-32HW2Q33.cjs');
|
|
24
23
|
require('../chunk-FX3K6LNZ.cjs');
|
|
24
|
+
require('../chunk-7UTB4PHM.cjs');
|
|
25
25
|
require('../chunk-PPCATBOY.cjs');
|
|
26
26
|
require('../chunk-MHVNT4J3.cjs');
|
|
27
27
|
require('../chunk-C54XEN5T.cjs');
|
|
@@ -50,11 +50,11 @@ function withSteps(workflow, steps, layout) {
|
|
|
50
50
|
const run = workflow.run.kind === "steps" ? workflow.run : { kind: "steps", steps: [] };
|
|
51
51
|
return {
|
|
52
52
|
...workflow,
|
|
53
|
-
run: { ...run, steps:
|
|
53
|
+
run: { ...run, steps: chunk6AALMYPS_cjs.orderSteps(steps), layout: layout ?? run.layout }
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
var layoutOf = (workflow) => workflow.run.kind === "steps" && workflow.run.layout || {};
|
|
57
|
-
var explicit = (steps) => steps.map((s) => ({ ...s, after:
|
|
57
|
+
var explicit = (steps) => steps.map((s) => ({ ...s, after: chunk6AALMYPS_cjs.stepDependencies(steps, s.id) }));
|
|
58
58
|
function stepIdFor(steps, title) {
|
|
59
59
|
const base = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").replace(/^[^a-z]+/, "") || "step";
|
|
60
60
|
const taken = new Set(steps.map((s) => s.id));
|
|
@@ -101,7 +101,7 @@ function blankStep(kind, id, title) {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
function addStep(workflow, kind, options = {}) {
|
|
104
|
-
const steps = explicit(
|
|
104
|
+
const steps = explicit(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
105
105
|
const title = options.title ?? DEFAULT_TITLES[kind];
|
|
106
106
|
const id = stepIdFor(steps, title);
|
|
107
107
|
const step = { ...blankStep(kind, id, title), after: options.after ? [options.after] : [] };
|
|
@@ -110,7 +110,7 @@ function addStep(workflow, kind, options = {}) {
|
|
|
110
110
|
return { workflow: withSteps(workflow, [...steps, step], layout), id };
|
|
111
111
|
}
|
|
112
112
|
function removeStep(workflow, id) {
|
|
113
|
-
const steps = explicit(
|
|
113
|
+
const steps = explicit(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
114
114
|
const removed = steps.find((s) => s.id === id);
|
|
115
115
|
if (!removed) return workflow;
|
|
116
116
|
const bridged = steps.filter((s) => s.id !== id).map(
|
|
@@ -123,8 +123,8 @@ function removeStep(workflow, id) {
|
|
|
123
123
|
return withSteps(workflow, bridged, layout);
|
|
124
124
|
}
|
|
125
125
|
function connectSteps(workflow, from, to) {
|
|
126
|
-
const steps = explicit(
|
|
127
|
-
if (from === to || !steps.some((s) => s.id === from) ||
|
|
126
|
+
const steps = explicit(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
127
|
+
if (from === to || !steps.some((s) => s.id === from) || chunk6AALMYPS_cjs.dependsOn(steps, from, to)) {
|
|
128
128
|
return workflow;
|
|
129
129
|
}
|
|
130
130
|
return withSteps(
|
|
@@ -134,16 +134,16 @@ function connectSteps(workflow, from, to) {
|
|
|
134
134
|
)
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
|
-
var wouldCycle = (workflow, from, to) => from === to ||
|
|
137
|
+
var wouldCycle = (workflow, from, to) => from === to || chunk6AALMYPS_cjs.dependsOn(chunk6AALMYPS_cjs.workflowSteps(workflow), from, to);
|
|
138
138
|
function disconnectSteps(workflow, from, to) {
|
|
139
|
-
const steps = explicit(
|
|
139
|
+
const steps = explicit(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
140
140
|
return withSteps(
|
|
141
141
|
workflow,
|
|
142
142
|
steps.map((s) => s.id === to ? { ...s, after: (s.after ?? []).filter((d) => d !== from) } : s)
|
|
143
143
|
);
|
|
144
144
|
}
|
|
145
145
|
function updateStep(workflow, id, patch) {
|
|
146
|
-
const steps = explicit(
|
|
146
|
+
const steps = explicit(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
147
147
|
return withSteps(
|
|
148
148
|
workflow,
|
|
149
149
|
steps.map(
|
|
@@ -157,7 +157,7 @@ var renameIn = (text, from, to) => text.replace(
|
|
|
157
157
|
);
|
|
158
158
|
function renameInput(workflow, from, to) {
|
|
159
159
|
if (from === to) return workflow;
|
|
160
|
-
const steps =
|
|
160
|
+
const steps = chunk6AALMYPS_cjs.workflowSteps(workflow).map((s) => {
|
|
161
161
|
if (s.kind === "agent")
|
|
162
162
|
return {
|
|
163
163
|
...s,
|
|
@@ -206,13 +206,13 @@ function renameInput(workflow, from, to) {
|
|
|
206
206
|
var renamePerson = (a, from, to) => "input" in a && a.input === from ? { input: to } : a;
|
|
207
207
|
var renameRef = (r, from, to) => "input" in r && r.input === from ? { input: to } : r;
|
|
208
208
|
function moveStep(workflow, id, position) {
|
|
209
|
-
return withSteps(workflow,
|
|
209
|
+
return withSteps(workflow, chunk6AALMYPS_cjs.workflowSteps(workflow), { ...layoutOf(workflow), [id]: position });
|
|
210
210
|
}
|
|
211
211
|
var COLUMN = 300;
|
|
212
212
|
var ROW = 140;
|
|
213
213
|
function autoLayout(steps) {
|
|
214
214
|
const layout = {};
|
|
215
|
-
|
|
215
|
+
chunk6AALMYPS_cjs.stepLevels(steps).forEach(
|
|
216
216
|
(level, x) => level.forEach((s, y) => {
|
|
217
217
|
layout[s.id] = { x: x * COLUMN, y: (y - (level.length - 1) / 2) * ROW };
|
|
218
218
|
})
|
|
@@ -220,7 +220,7 @@ function autoLayout(steps) {
|
|
|
220
220
|
return layout;
|
|
221
221
|
}
|
|
222
222
|
function layoutWithDefaults(workflow) {
|
|
223
|
-
const auto = autoLayout(
|
|
223
|
+
const auto = autoLayout(chunk6AALMYPS_cjs.workflowSteps(workflow));
|
|
224
224
|
return { ...auto, ...layoutOf(workflow) };
|
|
225
225
|
}
|
|
226
226
|
var DEFAULT_SIGNALS_EDITOR_LABELS = {
|
|
@@ -317,9 +317,9 @@ function SignalsEditor({
|
|
|
317
317
|
{
|
|
318
318
|
className: ui.cn(
|
|
319
319
|
"space-y-1.5 rounded-md border p-2",
|
|
320
|
-
|
|
320
|
+
chunkSARREDFP_cjs.isIncompleteSignal(signal) ? "border-destructive/50" : "border-border"
|
|
321
321
|
),
|
|
322
|
-
"data-incomplete":
|
|
322
|
+
"data-incomplete": chunkSARREDFP_cjs.isIncompleteSignal(signal) || void 0,
|
|
323
323
|
"data-testid": `${testId}-${i}`,
|
|
324
324
|
children: [
|
|
325
325
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
@@ -1148,7 +1148,7 @@ function StepInspector({
|
|
|
1148
1148
|
}) {
|
|
1149
1149
|
const l = { ...DEFAULT_STEP_INSPECTOR_LABELS, ...labels };
|
|
1150
1150
|
const ol = { ...DEFAULT_FIELD_OPTIONS_EDITOR_LABELS, ...optionLabels };
|
|
1151
|
-
const steps =
|
|
1151
|
+
const steps = chunk6AALMYPS_cjs.workflowSteps(workflow);
|
|
1152
1152
|
const step = steps.find((s) => s.id === stepId);
|
|
1153
1153
|
const run = workflow.run.kind === "steps" ? workflow.run : void 0;
|
|
1154
1154
|
if (!step || !run) {
|
|
@@ -1175,8 +1175,8 @@ function StepInspector({
|
|
|
1175
1175
|
const patch = (p) => onChange(updateStep(workflow, step.id, p));
|
|
1176
1176
|
const al = { ...DEFAULT_STEP_ACTION_SETTINGS_LABELS, ...actionLabels };
|
|
1177
1177
|
const ctx = {
|
|
1178
|
-
earlier:
|
|
1179
|
-
fields:
|
|
1178
|
+
earlier: chunk6AALMYPS_cjs.upstreamSteps(steps, step.id),
|
|
1179
|
+
fields: chunk6AALMYPS_cjs.runFields(workflow),
|
|
1180
1180
|
people,
|
|
1181
1181
|
tags,
|
|
1182
1182
|
documents
|
|
@@ -1197,7 +1197,7 @@ function StepInspector({
|
|
|
1197
1197
|
)
|
|
1198
1198
|
);
|
|
1199
1199
|
};
|
|
1200
|
-
const deps =
|
|
1200
|
+
const deps = chunk6AALMYPS_cjs.stepDependencies(steps, step.id);
|
|
1201
1201
|
const titleOf = (id) => steps.find((s) => s.id === id)?.title ?? id;
|
|
1202
1202
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": `${testId}-step`, children: [
|
|
1203
1203
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
@@ -1278,7 +1278,7 @@ function StepInspector({
|
|
|
1278
1278
|
{
|
|
1279
1279
|
step,
|
|
1280
1280
|
workflows,
|
|
1281
|
-
fields:
|
|
1281
|
+
fields: chunk6AALMYPS_cjs.runFields(workflow).map((f) => f.name),
|
|
1282
1282
|
patch,
|
|
1283
1283
|
l,
|
|
1284
1284
|
testId
|
|
@@ -1339,7 +1339,7 @@ function StepInspector({
|
|
|
1339
1339
|
testId: `${testId}-review-grid`
|
|
1340
1340
|
}
|
|
1341
1341
|
),
|
|
1342
|
-
|
|
1342
|
+
chunk6AALMYPS_cjs.canAssign(step) && /* @__PURE__ */ jsxRuntime.jsx(AssigneeSettings, { step, patch, ctx, l: al, testId }),
|
|
1343
1343
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1344
1344
|
SignalsEditor,
|
|
1345
1345
|
{
|
|
@@ -1605,7 +1605,7 @@ function triggerFields(trigger, clearOthers) {
|
|
|
1605
1605
|
return {
|
|
1606
1606
|
timezone: trigger.timezone,
|
|
1607
1607
|
rrule: trigger.start === "repeat" ? trigger.rrule.trim() : none,
|
|
1608
|
-
run_at: trigger.start === "once" ?
|
|
1608
|
+
run_at: trigger.start === "once" ? chunkMCPRNDOJ_cjs.localInputToIso(trigger.runAt) : none,
|
|
1609
1609
|
event_kind: trigger.start === "event" ? trigger.eventKind.trim() : none,
|
|
1610
1610
|
// A step signal is `workflow_signal` narrowed to one signal name.
|
|
1611
1611
|
event_filter: filter ?? none,
|
|
@@ -1621,7 +1621,7 @@ function plan(value, options) {
|
|
|
1621
1621
|
criteria: [],
|
|
1622
1622
|
max_passes: 3,
|
|
1623
1623
|
documents: [],
|
|
1624
|
-
steps:
|
|
1624
|
+
steps: chunkSARREDFP_cjs.toPlanSteps(value.workflow, options)
|
|
1625
1625
|
};
|
|
1626
1626
|
}
|
|
1627
1627
|
function builderToWorkflowRequest(value, workspaceId, options = {}) {
|
|
@@ -1656,7 +1656,7 @@ function builderToWorkflowUpdate(value, options = {}) {
|
|
|
1656
1656
|
}
|
|
1657
1657
|
function workflowRecordToBuilder(record) {
|
|
1658
1658
|
const planned = record.plan?.steps ?? [];
|
|
1659
|
-
const steps = planned.length ?
|
|
1659
|
+
const steps = planned.length ? chunkSARREDFP_cjs.fromPlanSteps(planned) : record.prompt || record.skill_ref ? [
|
|
1660
1660
|
{
|
|
1661
1661
|
id: "work",
|
|
1662
1662
|
kind: "agent",
|
|
@@ -1664,7 +1664,7 @@ function workflowRecordToBuilder(record) {
|
|
|
1664
1664
|
...record.skill_ref ? { workflow: record.skill_ref } : { run: { kind: "prompt", promptTemplate: record.prompt } }
|
|
1665
1665
|
}
|
|
1666
1666
|
] : [];
|
|
1667
|
-
const when =
|
|
1667
|
+
const when = chunkMCPRNDOJ_cjs.workflowWhen(record);
|
|
1668
1668
|
return {
|
|
1669
1669
|
workflow: {
|
|
1670
1670
|
id: record.external_id,
|
|
@@ -1673,12 +1673,12 @@ function workflowRecordToBuilder(record) {
|
|
|
1673
1673
|
inputs: [],
|
|
1674
1674
|
landing: "chat",
|
|
1675
1675
|
schedulable: false,
|
|
1676
|
-
run: { kind: "steps", steps, layout:
|
|
1676
|
+
run: { kind: "steps", steps, layout: chunkSARREDFP_cjs.layoutFromPlanSteps(planned ?? []) }
|
|
1677
1677
|
},
|
|
1678
1678
|
trigger: {
|
|
1679
1679
|
...DEFAULT_WORKFLOW_TRIGGER,
|
|
1680
1680
|
start: when === "now" ? "manual" : when,
|
|
1681
|
-
runAt:
|
|
1681
|
+
runAt: chunkMCPRNDOJ_cjs.isoToLocalInput(record.run_at),
|
|
1682
1682
|
rrule: record.rrule ?? "",
|
|
1683
1683
|
timezone: record.timezone || DEFAULT_WORKFLOW_TRIGGER.timezone,
|
|
1684
1684
|
eventKind: record.event_kind ?? "",
|
|
@@ -1734,7 +1734,7 @@ function triggerSummary(trigger, options = {}) {
|
|
|
1734
1734
|
case "once":
|
|
1735
1735
|
return trigger.runAt ? new Date(trigger.runAt).toLocaleString() : l.starts.once;
|
|
1736
1736
|
case "repeat":
|
|
1737
|
-
return trigger.rrule ?
|
|
1737
|
+
return trigger.rrule ? chunkMCPRNDOJ_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
|
|
1738
1738
|
case "event":
|
|
1739
1739
|
if (isSignalTrigger(trigger))
|
|
1740
1740
|
return trigger.signal ? l.signalSummary.replace("{signal}", trigger.signal) : l.stepSignals;
|
|
@@ -1793,7 +1793,7 @@ function TriggerInspector({
|
|
|
1793
1793
|
}
|
|
1794
1794
|
)
|
|
1795
1795
|
] }),
|
|
1796
|
-
trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1796
|
+
trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkMCPRNDOJ_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
|
|
1797
1797
|
trigger.start === "event" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
1798
1798
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.event }),
|
|
1799
1799
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -1845,7 +1845,7 @@ function TriggerInspector({
|
|
|
1845
1845
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
1846
1846
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.agent }),
|
|
1847
1847
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1848
|
-
|
|
1848
|
+
chunkMCPRNDOJ_cjs.AgentSelect,
|
|
1849
1849
|
{
|
|
1850
1850
|
agents,
|
|
1851
1851
|
value: trigger.agentId,
|
|
@@ -1913,7 +1913,7 @@ function revealCenter(node, view, frame, reserveRight = 0) {
|
|
|
1913
1913
|
};
|
|
1914
1914
|
}
|
|
1915
1915
|
var DEFAULT_WORKFLOW_CANVAS_LABELS = {
|
|
1916
|
-
...
|
|
1916
|
+
...chunk6AALMYPS_cjs.DEFAULT_STEP_KIND_LABELS,
|
|
1917
1917
|
redline: "Tracked changes",
|
|
1918
1918
|
branch: "Branch",
|
|
1919
1919
|
kindHints: {
|
|
@@ -1944,7 +1944,7 @@ var DEFAULT_WORKFLOW_CANVAS_LABELS = {
|
|
|
1944
1944
|
fitView: "Fit view"
|
|
1945
1945
|
};
|
|
1946
1946
|
var TRIGGER_NODE = "__trigger";
|
|
1947
|
-
var KINDS =
|
|
1947
|
+
var KINDS = chunk6AALMYPS_cjs.WORKFLOW_STEP_KINDS;
|
|
1948
1948
|
function AddNext({
|
|
1949
1949
|
from,
|
|
1950
1950
|
onAdd,
|
|
@@ -1966,7 +1966,7 @@ function AddNext({
|
|
|
1966
1966
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.PopoverContent, { side: "right", align: "start", className: "w-60 p-1.5", children: [
|
|
1967
1967
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-2 pb-1 pt-0.5 text-xs font-medium text-muted-foreground", children: l.addNext }),
|
|
1968
1968
|
KINDS.map((kind) => {
|
|
1969
|
-
const Icon =
|
|
1969
|
+
const Icon = chunk6AALMYPS_cjs.STEP_KIND_ICONS[kind];
|
|
1970
1970
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1971
1971
|
"button",
|
|
1972
1972
|
{
|
|
@@ -2005,8 +2005,8 @@ function PhaseMark({ phase }) {
|
|
|
2005
2005
|
}
|
|
2006
2006
|
function StepNode({ data }) {
|
|
2007
2007
|
const { step, phase, summary, assignee, icon, l, onAdd, testId } = data;
|
|
2008
|
-
const kind =
|
|
2009
|
-
const KindIcon =
|
|
2008
|
+
const kind = chunk6AALMYPS_cjs.stepKindOf(step);
|
|
2009
|
+
const KindIcon = chunk6AALMYPS_cjs.STEP_KIND_ICONS[kind];
|
|
2010
2010
|
const redline = step.kind === "agent" && !!step.editDocument;
|
|
2011
2011
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2012
2012
|
"div",
|
|
@@ -2140,12 +2140,12 @@ function WorkflowCanvas({
|
|
|
2140
2140
|
testId = "workflow-canvas"
|
|
2141
2141
|
}) {
|
|
2142
2142
|
const l = react.useMemo(() => ({ ...DEFAULT_WORKFLOW_CANVAS_LABELS, ...labels }), [labels]);
|
|
2143
|
-
const steps =
|
|
2143
|
+
const steps = chunk6AALMYPS_cjs.workflowSteps(workflow);
|
|
2144
2144
|
const editable = !!onChange;
|
|
2145
2145
|
const built = react.useMemo(() => {
|
|
2146
2146
|
const layout = layoutWithDefaults(workflow);
|
|
2147
|
-
const all =
|
|
2148
|
-
const roots = all.filter((s) =>
|
|
2147
|
+
const all = chunk6AALMYPS_cjs.workflowSteps(workflow);
|
|
2148
|
+
const roots = all.filter((s) => chunk6AALMYPS_cjs.stepDependencies(all, s.id).length === 0);
|
|
2149
2149
|
const triggerNode = trigger ? [
|
|
2150
2150
|
{
|
|
2151
2151
|
id: TRIGGER_NODE,
|
|
@@ -2194,7 +2194,7 @@ function WorkflowCanvas({
|
|
|
2194
2194
|
react.useEffect(() => setNodes(built), [built]);
|
|
2195
2195
|
const edges = react.useMemo(
|
|
2196
2196
|
() => steps.flatMap((s) => {
|
|
2197
|
-
const deps =
|
|
2197
|
+
const deps = chunk6AALMYPS_cjs.stepDependencies(steps, s.id);
|
|
2198
2198
|
const from = deps.length ? deps : trigger ? [TRIGGER_NODE] : [];
|
|
2199
2199
|
return from.map((d) => ({
|
|
2200
2200
|
id: `${d}->${s.id}`,
|
|
@@ -2364,7 +2364,7 @@ function WorkflowCanvas({
|
|
|
2364
2364
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold", children: l.emptyTitle }),
|
|
2365
2365
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: l.emptyHint }),
|
|
2366
2366
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 grid grid-cols-2 gap-2", children: KINDS.map((kind) => {
|
|
2367
|
-
const Icon =
|
|
2367
|
+
const Icon = chunk6AALMYPS_cjs.STEP_KIND_ICONS[kind];
|
|
2368
2368
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2369
2369
|
"button",
|
|
2370
2370
|
{
|
|
@@ -2414,7 +2414,7 @@ var DEFAULT_WORKFLOW_BUILDER_LABELS = {
|
|
|
2414
2414
|
}
|
|
2415
2415
|
};
|
|
2416
2416
|
var PANEL_WIDTH = 344;
|
|
2417
|
-
var KINDS2 =
|
|
2417
|
+
var KINDS2 = chunk6AALMYPS_cjs.WORKFLOW_STEP_KINDS;
|
|
2418
2418
|
function WorkflowBuilder({
|
|
2419
2419
|
value,
|
|
2420
2420
|
onChange,
|
|
@@ -2446,12 +2446,12 @@ function WorkflowBuilder({
|
|
|
2446
2446
|
const [mode, setMode] = react.useState("design");
|
|
2447
2447
|
const [adding, setAdding] = react.useState(false);
|
|
2448
2448
|
const { workflow, trigger } = value;
|
|
2449
|
-
const steps =
|
|
2450
|
-
const problems =
|
|
2451
|
-
const missing =
|
|
2449
|
+
const steps = chunk6AALMYPS_cjs.workflowSteps(workflow);
|
|
2450
|
+
const problems = chunk6AALMYPS_cjs.validateWorkflowGraph(steps);
|
|
2451
|
+
const missing = chunk6AALMYPS_cjs.stepConfigProblems(steps);
|
|
2452
2452
|
const nameOf = (id) => people.find((p) => p.value === id)?.label;
|
|
2453
|
-
const fields =
|
|
2454
|
-
const assigneeOf = (step) =>
|
|
2453
|
+
const fields = chunk6AALMYPS_cjs.runFields(workflow);
|
|
2454
|
+
const assigneeOf = (step) => chunk6AALMYPS_cjs.canAssign(step) ? chunk6AALMYPS_cjs.assigneeName(step.assignee, { nameOf, fields }) : void 0;
|
|
2455
2455
|
const titles = react.useMemo(() => new Map(workflows.map((w) => [w.id, w.title])), [workflows]);
|
|
2456
2456
|
const setWorkflow = (next) => onChange({ ...value, workflow: next });
|
|
2457
2457
|
const addAfter = (from, kind) => {
|
|
@@ -2520,7 +2520,7 @@ function WorkflowBuilder({
|
|
|
2520
2520
|
l.addStep
|
|
2521
2521
|
] }) }),
|
|
2522
2522
|
/* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { align: "start", className: "w-64 p-1.5", children: KINDS2.map((kind) => {
|
|
2523
|
-
const Icon =
|
|
2523
|
+
const Icon = chunk6AALMYPS_cjs.STEP_KIND_ICONS[kind];
|
|
2524
2524
|
const cls = { ...DEFAULT_WORKFLOW_CANVAS_LABELS, ...canvasLabels };
|
|
2525
2525
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2526
2526
|
"button",
|
|
@@ -2682,13 +2682,13 @@ function WorkflowPreview({
|
|
|
2682
2682
|
renderIcon,
|
|
2683
2683
|
testId
|
|
2684
2684
|
}) {
|
|
2685
|
-
const run =
|
|
2685
|
+
const run = chunkMCPRNDOJ_cjs.useWorkflowPreview(workflow, {
|
|
2686
2686
|
resolveWorkflow: (id) => workflows.find((w) => w.id === id),
|
|
2687
2687
|
compose,
|
|
2688
2688
|
answer
|
|
2689
2689
|
});
|
|
2690
2690
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2691
|
-
|
|
2691
|
+
chunkSARREDFP_cjs.WorkflowRunner,
|
|
2692
2692
|
{
|
|
2693
2693
|
workflow,
|
|
2694
2694
|
run,
|
|
@@ -2777,7 +2777,7 @@ function ConnectedWorkflowBuilder({
|
|
|
2777
2777
|
() => [
|
|
2778
2778
|
...hostWorkflows,
|
|
2779
2779
|
...(skills.data ?? []).map(
|
|
2780
|
-
(s) =>
|
|
2780
|
+
(s) => chunk6AALMYPS_cjs.skillToWorkflow({
|
|
2781
2781
|
name: s.name,
|
|
2782
2782
|
slug: s.slug,
|
|
2783
2783
|
description: s.description,
|
|
@@ -2793,7 +2793,7 @@ function ConnectedWorkflowBuilder({
|
|
|
2793
2793
|
}));
|
|
2794
2794
|
const tasks = (conversations.data ?? []).filter((c) => c.status && c.status !== "done").map((c) => ({ value: c.external_id, label: c.title || c.external_id }));
|
|
2795
2795
|
const options = { resolveWorkflow: (wid) => workflows.find((w) => w.id === wid), compose };
|
|
2796
|
-
const problem = triggerProblem(value.trigger) ?? (
|
|
2796
|
+
const problem = triggerProblem(value.trigger) ?? (chunk6AALMYPS_cjs.validateWorkflowGraph(chunk6AALMYPS_cjs.workflowSteps(value.workflow)).length || chunk6AALMYPS_cjs.stepConfigProblems(chunk6AALMYPS_cjs.workflowSteps(value.workflow)).length ? "graph" : null);
|
|
2797
2797
|
const busy = !!pending || create.isPending || update.isPending || run.isPending;
|
|
2798
2798
|
const save = async () => {
|
|
2799
2799
|
if (!workspaceId) return void 0;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useConnection } from '../chunk-OYMWV45N.js';
|
|
3
|
-
import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-
|
|
4
|
-
import '../chunk-P5ST47VY.js';
|
|
5
|
-
import '../chunk-4XJZ6AAY.js';
|
|
6
|
-
import '../chunk-P6GHJSLR.js';
|
|
7
|
-
import { isIncompleteSignal, fromPlanSteps, layoutFromPlanSteps, WorkflowRunner, toPlanSteps } from '../chunk-54ANPPMV.js';
|
|
8
|
-
import '../chunk-XD2M6LIG.js';
|
|
9
|
-
import '../chunk-6S5FLMWG.js';
|
|
3
|
+
import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-T2CVFK2I.js';
|
|
10
4
|
import '../chunk-RFXJYIDV.js';
|
|
5
|
+
import '../chunk-4XJZ6AAY.js';
|
|
11
6
|
import '../chunk-5LXQPP2K.js';
|
|
12
|
-
import '../chunk-
|
|
7
|
+
import '../chunk-P6GHJSLR.js';
|
|
8
|
+
import { isIncompleteSignal, fromPlanSteps, layoutFromPlanSteps, WorkflowRunner, toPlanSteps } from '../chunk-2PNNCEPH.js';
|
|
13
9
|
import '../chunk-EVUEIBNU.js';
|
|
10
|
+
import '../chunk-6S5FLMWG.js';
|
|
14
11
|
import '../chunk-NUNKSZKU.js';
|
|
15
12
|
import '../chunk-YU2KUMGE.js';
|
|
16
13
|
import '../chunk-N5YEF3LC.js';
|
|
17
|
-
import '../chunk-
|
|
14
|
+
import '../chunk-5Y7JRY7Y.js';
|
|
15
|
+
import '../chunk-S7PSMMRG.js';
|
|
16
|
+
import '../chunk-XD2M6LIG.js';
|
|
18
17
|
import '../chunk-TX2ZICS7.js';
|
|
19
|
-
import
|
|
20
|
-
import '../chunk-
|
|
18
|
+
import '../chunk-4WWM3GQ5.js';
|
|
19
|
+
import { DEFAULT_STEP_KIND_LABELS, workflowSteps, dependsOn, stepLevels, runFields, upstreamSteps, stepDependencies, canAssign, WORKFLOW_STEP_KINDS, STEP_KIND_ICONS, validateWorkflowGraph, stepConfigProblems, skillToWorkflow, assigneeName, orderSteps, stepKindOf } from '../chunk-2DFDFOM7.js';
|
|
21
20
|
import { TONE_DOT, TONES, isTone } from '../chunk-AUS3KBHJ.js';
|
|
22
21
|
import '../chunk-SLSBJRWW.js';
|
|
22
|
+
import '../chunk-AA3PT6KR.js';
|
|
23
23
|
import '../chunk-NPLYHR2E.js';
|
|
24
24
|
import '../chunk-7F6CBP3Z.js';
|
|
25
25
|
import '../chunk-76JDDMSP.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arbidocs/coedit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.127",
|
|
4
4
|
"description": "Real-time collaboration for the ARBI native DOCX editor: a Yjs mirror of the canonical OOXML package, session, and server runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arbidocs/blocks",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.127",
|
|
4
4
|
"description": "Composable, domain-neutral UI blocks for ARBI apps, organised by capability (retrieval, facts, agents, workspaces, citations, collaboration) plus shell, theme and site primitives, on top of @arbidocs/react.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -280,8 +280,8 @@
|
|
|
280
280
|
"example:test:e2e": "playwright test -c examples/custom-ui/playwright.config.ts"
|
|
281
281
|
},
|
|
282
282
|
"dependencies": {
|
|
283
|
-
"@arbidocs/client": "0.4.
|
|
284
|
-
"@arbidocs/coedit": "0.4.
|
|
283
|
+
"@arbidocs/client": "0.4.127",
|
|
284
|
+
"@arbidocs/coedit": "0.4.127",
|
|
285
285
|
"@dnd-kit/core": "^6.3.1",
|
|
286
286
|
"@dnd-kit/sortable": "^10.0.0",
|
|
287
287
|
"@dnd-kit/utilities": "^3.2.2",
|
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
"y-protocols": "^1.0.6"
|
|
324
324
|
},
|
|
325
325
|
"peerDependencies": {
|
|
326
|
-
"@arbidocs/react": "0.4.
|
|
326
|
+
"@arbidocs/react": "0.4.127",
|
|
327
327
|
"@lexical/html": "0.35.0",
|
|
328
328
|
"@lexical/link": "0.35.0",
|
|
329
329
|
"@lexical/list": "0.35.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":["useMemo","useRef","jsx","ModalScaffold","AlertTriangle","testIdOr","jsxs","Button"],"mappings":";;;;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAuBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAIA,aAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAYC,aAA0B,IAAI,CAAA;AAChD,EAAA,uBACEC,cAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACVD,cAAA,CAACE,6BAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQC,0BAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAEzD,QAAA,kBAAAC,eAAA,CAACH,+BAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,wBAAAD,cAAA;AAAA,UAACK,SAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,YACvB,QAAA,EAAU,SAAA;AAAA,YACV,eAAaF,0BAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,YAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,SACnB;AAAA,wBACAH,cAAA;AAAA,UAACK,SAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,eAAaF,0BAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,YAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"chunk-GICUGQNN.cjs","sourcesContent":["import { useMemo, useRef } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/collaboration/mail/MailMessagePreview.tsx","../src/collaboration/mail/mailCompose.ts","../src/collaboration/mail/MailGrid.tsx","../src/collaboration/mail/MailDeliveryList.tsx","../src/collaboration/mail/MailMessageView.tsx","../src/collaboration/mail/MailDocumentPicker.tsx","../src/collaboration/mail/PlainMailBodyEditor.tsx"],"names":["deliveryProblem","jsx","jsxs","cn","Paperclip","useMemo","Button"],"mappings":"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","file":"chunk-IXTQYFIF.js","sourcesContent":["import { Paperclip } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface MailMessagePreviewProps {\n participants: string\n subject: string\n preview?: string\n date: string\n dateTime?: string\n unread?: boolean\n hasAttachments?: boolean\n /** A sent message's delivery problem; sent and delivered mail shows nothing, as in other clients. */\n deliveryProblem?: MailDeliveryProblem\n}\n\nexport type MailDeliveryProblem = 'bounced' | 'partially_bounced' | 'delayed'\n\nconst DELIVERY_BADGE: Record<MailDeliveryProblem, { label: string; title: string; tone: string }> =\n {\n bounced: {\n label: 'Bounced',\n title: \"Not delivered: the recipient's mail server sent this message back.\",\n tone: 'bg-destructive/10 text-destructive',\n },\n partially_bounced: {\n label: 'Partly bounced',\n title: 'Some recipients did not get this message. Open it to see who.',\n tone: 'bg-destructive/10 text-destructive',\n },\n delayed: {\n label: 'Delayed',\n title: \"Delivery is delayed; the recipient's server will keep retrying.\",\n tone: 'bg-muted text-muted-foreground',\n },\n }\n\n/** A pill for a sent message that bounced, partly bounced, or is delayed. */\nexport function MailDeliveryBadge({\n problem,\n className,\n}: {\n problem: MailDeliveryProblem\n className?: string\n}) {\n const badge = DELIVERY_BADGE[problem]\n return (\n <span\n className={cn('shrink-0 rounded-full px-2 py-0.5 text-xs font-medium', badge.tone, className)}\n title={badge.title}\n data-testid=\"mail-delivery-badge\"\n >\n {badge.label}\n </span>\n )\n}\n\n/** Compact inbox identity: sender/date, subject, then a body preview. */\nexport function MailMessagePreview({\n participants,\n subject,\n preview,\n date,\n dateTime,\n unread,\n hasAttachments,\n deliveryProblem,\n}: MailMessagePreviewProps) {\n return (\n <div className=\"flex h-full w-full min-w-0 flex-col justify-center gap-0.5 text-sm leading-5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className={cn('min-w-0 flex-1 truncate', unread && 'font-semibold')}>\n {participants}\n </span>\n {hasAttachments && (\n <Paperclip\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-label=\"Has attachments\"\n />\n )}\n {deliveryProblem && <MailDeliveryBadge problem={deliveryProblem} />}\n <time dateTime={dateTime} className=\"shrink-0 text-xs font-normal text-muted-foreground\">\n {date}\n </time>\n </div>\n <div className={cn('truncate', unread && 'font-semibold')}>{subject || '(No subject)'}</div>\n <div className=\"truncate font-normal text-muted-foreground\">{preview || '\\u00a0'}</div>\n </div>\n )\n}\n","/** Pure helpers for writing mail: an empty message, recipient parsing, replies and forwards. */\n\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailCompose,\n MailMessage,\n} from '@arbidocs/react'\n\nexport const emptyMailCompose = (): MailCompose => ({\n to: [],\n cc: [],\n bcc: [],\n subject: '',\n text: '',\n attachments: [],\n})\n\n/** A person as shown: the name on the message, else the address. */\nexport const mailAddressLabel = (person: MailAddress): string => person.name || person.email\n\n/**\n * Typed or pasted recipients (`a@x.org; Pat <pat@y.org>`), separated by commas, semicolons or\n * lines, deduplicated by address.\n */\nexport function parseMailRecipients(value: string): MailAddress[] {\n const addresses = (value.match(/(?:[^,;\"\\n]|\"[^\"]*\")+/g) ?? [])\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => {\n const named = entry.match(/^(.*?)\\s*<([^<>]+)>$/)\n return named\n ? { email: named[2].trim(), name: named[1].trim().replace(/^\"|\"$/g, '') }\n : { email: entry }\n })\n return addresses.filter(\n (address, index) =>\n addresses.findIndex((item) => item.email.toLowerCase() === address.email.toLowerCase()) ===\n index\n )\n}\n\n/** A reply (to the sender, or everyone with `all`) or a forward of `message`. */\nexport function replyMailCompose(\n message: MailMessage,\n {\n account,\n folderRole,\n forward = false,\n all = false,\n attachments = [],\n }: {\n account: MailAccount\n /** The folder the message is in: replying from Sent goes to its recipients. */\n folderRole: string\n forward?: boolean\n all?: boolean\n /** A forward's attachments, with their content. */\n attachments?: MailAttachment[]\n }\n): MailCompose {\n return {\n ...emptyMailCompose(),\n to: forward ? [] : folderRole === 'sent' ? message.to : message.sender,\n cc: all\n ? [...message.to, ...message.cc]\n .filter(\n (r) =>\n r.email.toLowerCase() !== account.email.toLowerCase() &&\n !message.sender.some((s) => s.email.toLowerCase() === r.email.toLowerCase())\n )\n .filter(\n (r, i, values) =>\n values.findIndex((v) => v.email.toLowerCase() === r.email.toLowerCase()) === i\n )\n : [],\n subject: `${forward ? 'Fwd' : 'Re'}: ${message.subject.replace(/^(Re|Fwd):\\s*/i, '')}`,\n text: `\\n\\n${message.sender.map((s) => s.email).join(', ')} wrote:\\n${message.text}`,\n in_reply_to: forward ? undefined : message.message_id,\n references: [...message.references, ...(message.message_id ? [message.message_id] : [])],\n attachments,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** A saved draft, reopened for editing (`attachments` with their content). */\nexport function draftMailCompose(message: MailMessage, attachments: MailAttachment[]): MailCompose {\n return {\n to: message.to,\n cc: message.cc,\n bcc: message.bcc,\n subject: message.subject,\n text: message.text,\n html: message.html,\n attachments,\n draft_id: message.id,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** Whether a message carries a calendar invite (an .ics part). */\nexport const hasCalendarPart = (attachments: MailAttachment[]): boolean =>\n attachments.some(\n (a) => /^text\\/calendar\\b|^application\\/ics\\b/i.test(a.content_type) || /\\.ics$/i.test(a.name)\n )\n","import { useMemo } from 'react'\nimport type { ColDef, GridState } from 'ag-grid-community'\nimport { Mail } from 'lucide-react'\nimport type { MailAddress, MailMessage } from '@arbidocs/react'\nimport { GridView } from '../../files/GridView'\nimport { MailMessagePreview, type MailDeliveryProblem } from './MailMessagePreview'\nimport { mailAddressLabel } from './mailCompose'\n\n/** The list shows only delivery problems; sent and delivered mail stays quiet. */\nfunction deliveryProblem(status: MailMessage['delivery_status']): MailDeliveryProblem | undefined {\n return status === 'bounced' || status === 'partially_bounced' || status === 'delayed'\n ? status\n : undefined\n}\n\nexport interface MailGridProps {\n messages: MailMessage[]\n loading: boolean\n selected: string | null\n /** Sent, Drafts or Outbox: rows show recipients instead of the sender. */\n outgoing?: boolean\n onSelect: (id: string) => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** Column state to restore at mount, and where to persist changes (both optional). */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n}\n\n/** A folder's messages: one row per message, unread dot, participants, subject and preview. */\nexport function MailGrid({\n messages,\n loading,\n selected,\n onSelect,\n outgoing = false,\n personLabel = mailAddressLabel,\n gridState,\n onGridStateChange,\n}: MailGridProps) {\n const columns = useMemo<ColDef<MailMessage>[]>(\n () => [\n {\n colId: 'unread',\n cellStyle: { padding: 0, justifyContent: 'center' },\n headerName: '',\n width: 34,\n minWidth: 34,\n maxWidth: 34,\n sortable: false,\n resizable: false,\n cellRenderer: ({ data }: { data?: MailMessage }) =>\n data?.unread ? (\n <span className=\"inline-block size-2 rounded-full bg-primary\" aria-label=\"Unread\" />\n ) : null,\n },\n {\n colId: 'message',\n cellClass:\n '[&_.ag-cell-value]:h-full [&_.ag-cell-value]:w-full [&_.ag-cell-wrapper]:h-full [&_.ag-cell-wrapper]:w-full',\n headerName: 'Message',\n flex: 1,\n minWidth: 240,\n sortable: false,\n valueGetter: (p) => p.data?.subject ?? '',\n cellRenderer: ({ data }: { data?: MailMessage }) =>\n data ? (\n <MailMessagePreview\n participants={(outgoing ? data.to : data.sender).map(personLabel).join(', ')}\n subject={data.subject}\n preview={data.preview}\n unread={data.unread}\n hasAttachments={Boolean(data.attachments.length)}\n deliveryProblem={deliveryProblem(data.delivery_status)}\n dateTime={data.received_at}\n date={\n data.received_at\n ? new Date(data.received_at).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n : ''\n }\n />\n ) : null,\n },\n ],\n [outgoing, personLabel]\n )\n return (\n <GridView<MailMessage>\n items={messages}\n columnDefs={columns}\n getItemId={(m) => m.id}\n onRowClick={(m) => onSelect(m.id)}\n height=\"100%\"\n rowHeight={84}\n persistState={Boolean(onGridStateChange)}\n gridId=\"personal-mail-grid-v2\"\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n testId=\"mail-grid\"\n isLoading={loading}\n getRowTestId={(m) => `mail-row-${m.id}`}\n emptyState={{\n icon: <Mail className=\"size-10 text-muted-foreground/50\" />,\n title: 'No messages',\n message: 'Messages in this folder will appear here.',\n }}\n gridOptions={{\n headerHeight: 0,\n suppressCellFocus: false,\n onCellKeyDown: (event) => {\n if ((event.event as KeyboardEvent)?.key === 'Enter' && event.data) onSelect(event.data.id)\n },\n defaultColDef: {\n sortable: true,\n resizable: true,\n filter: false,\n },\n rowClassRules: { 'bg-muted/60': (p) => p.data?.id === selected },\n }}\n />\n )\n}\n","import { AlertCircle, CheckCircle2, Clock, Send } from 'lucide-react'\nimport type { MailDeliveryRecipient } from '@arbidocs/react'\nimport { cn } from '@arbidocs/react/ui'\n\nconst ICONS: Record<MailDeliveryRecipient['status'], typeof Send> = {\n accepted: Send,\n relayed: Send,\n expanded: Send,\n delivered: CheckCircle2,\n delayed: Clock,\n rejected: AlertCircle,\n failed: AlertCircle,\n}\n\nconst LABELS: Record<MailDeliveryRecipient['status'], string> = {\n accepted: 'Sent',\n relayed: 'Sent',\n expanded: 'Sent',\n delivered: 'Delivered',\n delayed: 'Delayed',\n rejected: 'Not delivered',\n failed: 'Not delivered',\n}\n\n/**\n * Where a sent message got to, per recipient: the relay's answer and any delivery reports that came\n * back, in plain words. Shown on sent native mail only.\n */\nexport function MailDeliveryList({\n recipients,\n}: {\n recipients: MailDeliveryRecipient[]\n}): React.ReactElement | null {\n if (recipients.length === 0) return null\n return (\n <section\n aria-label=\"Delivery\"\n className=\"mb-5 rounded-md border border-border/60 px-3 py-2\"\n data-testid=\"mail-delivery-list\"\n >\n <h3 className=\"mb-1 text-xs font-medium text-muted-foreground\">Delivery</h3>\n <ul className=\"space-y-1\">\n {recipients.map((recipient) => {\n const Icon = ICONS[recipient.status]\n const failed = recipient.status === 'failed' || recipient.status === 'rejected'\n return (\n <li\n key={recipient.email}\n className=\"flex flex-wrap items-baseline gap-x-2 text-sm\"\n data-testid={`mail-delivery-${recipient.email}`}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0 self-center',\n failed ? 'text-destructive' : 'text-muted-foreground'\n )}\n />\n <span className=\"font-medium\">{recipient.email}</span>\n <span className={cn(failed ? 'text-destructive' : 'text-muted-foreground')}>\n {LABELS[recipient.status]}: {recipient.description}\n </span>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","import type { ReactNode } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Archive, ArrowLeft, Forward, Paperclip, Reply, Sparkles, Trash2 } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailFolder,\n MailMessage,\n MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailDeliveryBadge } from './MailMessagePreview'\nimport { MailDeliveryList } from './MailDeliveryList'\nimport { hasCalendarPart, mailAddressLabel } from './mailCompose'\n\n/** Why an action that changes the mailbox on the server can't run right now. */\nexport const NEEDS_CONNECTION = 'Available when you are back online'\n\nexport interface MailMessageViewProps {\n account: MailAccount\n message: MailMessage\n folderRole: string\n folders: MailFolder[] | undefined\n isOnline: boolean\n loading: boolean\n uploadPending?: boolean\n onBack: () => void\n onEditDraft: () => void\n onReply: (forward?: boolean, all?: boolean) => void\n /** Ask ARBI to draft the reply (in a chat beside it). Absent: not offered. */\n onReplyWithArbi?: () => void\n onUpdate: (body: MailMessageUpdate) => void\n onDownloadAttachment: (attachment: MailAttachment) => void\n onDownloadOriginal: () => void\n /** Native mail: save the email to a workspace. Absent: not offered. */\n onSaveToWorkspace?: () => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** A calendar invite card, for a message that carries an .ics part. */\n renderInvite?: () => ReactNode\n}\n\nconst SANITIZE = {\n ALLOWED_TAGS: [\n 'p',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 's',\n 'ul',\n 'ol',\n 'li',\n 'a',\n 'span',\n 'blockquote',\n ],\n ALLOWED_ATTR: ['href'],\n ALLOW_DATA_ATTR: false,\n}\n\n/** An opened message: its actions, sender, recipients, delivery, attachments and body. */\nexport function MailMessageView({\n account,\n message,\n folderRole,\n folders,\n isOnline,\n loading,\n uploadPending,\n onBack,\n onEditDraft,\n onReply,\n onReplyWithArbi,\n onUpdate,\n onDownloadAttachment,\n onDownloadOriginal,\n onSaveToWorkspace,\n personLabel = mailAddressLabel,\n renderInvite,\n}: MailMessageViewProps) {\n // Moving, marking and saving change the server's mailbox; offline they are unavailable, with why.\n const offlineTitle = isOnline ? undefined : NEEDS_CONNECTION\n return (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n <Button className=\"mb-3\" variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n {loading && <p className=\"text-muted-foreground\">Loading message…</p>}\n <div className=\"-mx-4 mb-5 flex flex-wrap items-center gap-1 border-b bg-muted/20 px-3 py-1.5 sm:-mx-5 [&_button]:h-8 [&_button]:px-2 [&_button]:text-xs\">\n {folderRole === 'drafts' ? (\n <Button onClick={onEditDraft}>Edit draft</Button>\n ) : (\n <>\n <Button variant=\"ghost\" onClick={() => onReply()}>\n <Reply className=\"mr-2 size-4\" />\n Reply\n </Button>\n {onReplyWithArbi && (\n <Button variant=\"ghost\" onClick={onReplyWithArbi}>\n <Sparkles className=\"mr-2 size-4\" />\n Reply with ARBI\n </Button>\n )}\n {message.to.length + message.cc.length > 1 && (\n <Button variant=\"ghost\" onClick={() => onReply(false, true)}>\n Reply all\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => onReply(true)}>\n <Forward className=\"mr-2 size-4\" />\n Forward\n </Button>\n </>\n )}\n <Button\n variant=\"ghost\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() => onUpdate({ unread: !message.unread })}\n >\n {message.unread ? 'Mark read' : 'Mark unread'}\n </Button>\n {(folderRole === 'archive' || folderRole === 'trash') && (\n <Button\n variant=\"ghost\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() =>\n onUpdate({ folder_id: folders?.find((f) => f.role === 'inbox')?.id ?? 'inbox' })\n }\n >\n Move to Inbox\n </Button>\n )}\n <Button\n variant=\"ghost\"\n aria-label=\"Archive message\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() =>\n onUpdate({ folder_id: folders?.find((f) => f.role === 'archive')?.id ?? 'archive' })\n }\n >\n <Archive className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n aria-label=\"Trash message\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() => onUpdate({ action: 'trash' })}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <h2 className=\"text-xl font-semibold leading-snug tracking-tight\">\n {message.subject || '(No subject)'}\n </h2>\n {(message.delivery_status === 'bounced' ||\n message.delivery_status === 'partially_bounced' ||\n message.delivery_status === 'delayed') && (\n <MailDeliveryBadge problem={message.delivery_status} />\n )}\n </div>\n <div className=\"mb-5 flex gap-3 border-b border-border/60 pb-4\">\n <span\n aria-hidden=\"true\"\n className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\"\n >\n {(message.sender[0]?.name || message.sender[0]?.email || '?')\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => part[0])\n .join('')\n .toUpperCase()}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-1\">\n <p className=\"text-sm font-semibold\">\n {message.sender.map((person) => person.name || person.email).join(', ')}\n </p>\n <time className=\"text-[11px] text-muted-foreground\">\n {message.received_at ? new Date(message.received_at).toLocaleString() : ''}\n </time>\n </div>\n <p className=\"break-all text-xs text-muted-foreground\">\n {message.sender.map((person) => person.email).join(', ')}\n </p>\n <p className=\"mt-2 break-all text-xs text-muted-foreground\">\n To: {message.to.map(personLabel).join(', ')}\n {message.cc.length > 0 && ` · Cc: ${message.cc.map(personLabel).join(', ')}`}\n </p>\n </div>\n </div>\n <MailDeliveryList recipients={message.delivery ?? []} />\n {renderInvite && hasCalendarPart(message.attachments) && renderInvite()}\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {message.attachments.map((a) => (\n <Button\n key={a.id}\n className=\"h-auto min-h-12 justify-start rounded-md border-border/70 bg-muted/20 px-3 py-2 text-left shadow-none hover:bg-muted/60\"\n variant=\"outline\"\n onClick={() => onDownloadAttachment(a)}\n >\n <Paperclip className=\"mr-2 size-4\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-xs font-medium\">{a.name}</span>\n <span\n aria-hidden=\"true\"\n className=\"block text-[11px] font-normal text-muted-foreground\"\n >\n {a.size < 1024 ? `${a.size} B` : `${Math.ceil(a.size / 1024)} KB`}\n </span>\n </span>\n </Button>\n ))}\n </div>\n {message.html && message.text ? (\n <div\n data-testid=\"mail-message-body\"\n className=\"text-sm leading-7 [&_p]:mb-3 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:list-decimal [&_ol]:pl-6 [&_a]:text-primary [&_a]:underline\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(message.html, SANITIZE) }}\n />\n ) : message.text ? (\n <pre\n data-testid=\"mail-message-body\"\n className=\"whitespace-pre-wrap break-words font-sans text-sm leading-7 text-foreground/90\"\n >\n {message.text.split(/(https?:\\/\\/[^\\s]+)/g).map((part, index) =>\n /^https?:\\/\\//.test(part) ? (\n <a\n key={index}\n href={part}\n className=\"text-primary underline underline-offset-2\"\n rel=\"noreferrer\"\n >\n {part}\n </a>\n ) : (\n part\n )\n )}\n </pre>\n ) : message.html ? (\n <iframe\n title=\"Email body\"\n sandbox=\"\"\n referrerPolicy=\"no-referrer\"\n className=\"min-h-96 w-full border-0 bg-white\"\n srcDoc={`<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; img-src data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'\">${message.html}`}\n />\n ) : (\n <p className=\"text-muted-foreground\">Empty message</p>\n )}\n {account.provider === 'native' && (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n className=\"mt-5\"\n variant=\"outline\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={onDownloadOriginal}\n >\n Download original email\n </Button>\n {onSaveToWorkspace && (\n <Button\n className=\"mt-5\"\n variant=\"outline\"\n disabled={uploadPending || !isOnline}\n title={offlineTitle}\n onClick={onSaveToWorkspace}\n >\n Save to workspace\n </Button>\n )}\n </div>\n )}\n </article>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\n\n/** A workspace document that can be attached to an email. */\nexport interface MailAttachableDocument {\n id: string\n title: string\n /** Its file-type icon. */\n icon?: ReactNode\n}\n\nexport interface MailDocumentPickerProps {\n documents: MailAttachableDocument[]\n onAttach: (document: MailAttachableDocument) => void\n disabled?: boolean\n}\n\n/** \"From workspace\": a searchable list of the workspace's documents, attached as their files. */\nexport function MailDocumentPicker({\n documents,\n onAttach,\n disabled = false,\n}: MailDocumentPickerProps): React.ReactElement {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n return q ? documents.filter((d) => d.title.toLowerCase().includes(q)) : documents\n }, [documents, query])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n data-testid=\"mail-attach-workspace-document\"\n >\n <FolderOpen className=\"mr-2 size-4\" />\n From workspace\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-0\" align=\"start\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandInput placeholder=\"Search documents...\" value={query} onValueChange={setQuery} />\n <CommandList className=\"max-h-72\">\n <CommandEmpty>No documents in this workspace</CommandEmpty>\n <CommandGroup>\n {filtered.map((doc) => (\n <CommandItem\n key={doc.id}\n value={doc.id}\n onSelect={() => {\n setOpen(false)\n setQuery('')\n onAttach(doc)\n }}\n data-testid={`document-search-item-${doc.id}`}\n >\n {doc.icon && <span className=\"shrink-0 text-muted-foreground\">{doc.icon}</span>}\n <span className=\"ml-1.5 flex-1 truncate text-sm\">{doc.title}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","export interface MailBodyEditorProps {\n text: string\n html?: string\n disabled: boolean\n /** Every edit: the plain text and, from the rich editor, its HTML (`''` from this one). */\n onChange: (text: string, html: string) => void\n}\n\n/**\n * The message body as plain text: used when the rich editor (an optional peer, `lexical`) is not\n * installed or could not be loaded.\n */\nexport function PlainMailBodyEditor({ text, disabled, onChange }: MailBodyEditorProps) {\n return (\n <textarea\n aria-label=\"Message\"\n className=\"my-3 min-h-48 w-full resize-y bg-transparent text-sm outline-none\"\n value={text}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value, '')}\n />\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":[],"mappings":";;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAuBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACV,GAAA,CAAC,iBAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQ,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAEzD,QAAA,kBAAA,IAAA,CAAC,aAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,YACvB,QAAA,EAAU,SAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,YAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,SACnB;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,YAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"chunk-JJLMCV3T.js","sourcesContent":["import { useMemo, useRef } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
|