@parhelia/core 0.1.12752 → 0.1.12755
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-view/AgentsView.js +2 -2
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.js +5 -20
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/config/config.js +4 -1
- package/dist/config/config.js.map +1 -1
- package/dist/editor/MainLayout.d.ts +1 -0
- package/dist/editor/MainLayout.js +64 -1
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +11 -16
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.js +45 -87
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/Agents.js +10 -5
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/useAgentStatus.js +2 -2
- package/dist/editor/ai/useAgentStatus.js.map +1 -1
- package/dist/editor/client/EditorShell.js +19 -1
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +4 -0
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -0
- package/dist/editor/client/operations.js +37 -3
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.js +3 -4
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +35 -2
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/menubar/ItemLanguageVersion.js +22 -3
- package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
- package/dist/editor/menubar/PreviewDatePicker.d.ts +1 -0
- package/dist/editor/menubar/PreviewDatePicker.js +55 -0
- package/dist/editor/menubar/PreviewDatePicker.js.map +1 -0
- package/dist/editor/menubar/VersionSelector.d.ts +2 -1
- package/dist/editor/menubar/VersionSelector.js +14 -15
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +2 -2
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.js +81 -1
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +22 -90
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +12 -2
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +4 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
- package/dist/editor/page-viewer/pageViewContext.d.ts +2 -0
- package/dist/editor/page-viewer/pageViewContext.js +8 -1
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/pageModel.d.ts +2 -0
- package/dist/editor/personalization/ActionList.d.ts +7 -0
- package/dist/editor/personalization/ActionList.js +16 -0
- package/dist/editor/personalization/ActionList.js.map +1 -0
- package/dist/editor/personalization/ConditionTreeEditor.d.ts +7 -0
- package/dist/editor/personalization/ConditionTreeEditor.js +117 -0
- package/dist/editor/personalization/ConditionTreeEditor.js.map +1 -0
- package/dist/editor/personalization/PersonalizationPanel.d.ts +12 -0
- package/dist/editor/personalization/PersonalizationPanel.js +308 -0
- package/dist/editor/personalization/PersonalizationPanel.js.map +1 -0
- package/dist/editor/personalization/RuleElementPicker.d.ts +11 -0
- package/dist/editor/personalization/RuleElementPicker.js +68 -0
- package/dist/editor/personalization/RuleElementPicker.js.map +1 -0
- package/dist/editor/personalization/RuleList.d.ts +19 -0
- package/dist/editor/personalization/RuleList.js +132 -0
- package/dist/editor/personalization/RuleList.js.map +1 -0
- package/dist/editor/personalization/RuleParameterInput.d.ts +10 -0
- package/dist/editor/personalization/RuleParameterInput.js +115 -0
- package/dist/editor/personalization/RuleParameterInput.js.map +1 -0
- package/dist/editor/personalization/TreeItemPicker.d.ts +9 -0
- package/dist/editor/personalization/TreeItemPicker.js +115 -0
- package/dist/editor/personalization/TreeItemPicker.js.map +1 -0
- package/dist/editor/personalization/utils.d.ts +6 -0
- package/dist/editor/personalization/utils.js +37 -0
- package/dist/editor/personalization/utils.js.map +1 -0
- package/dist/editor/services/agentStatus.d.ts +1 -0
- package/dist/editor/services/agentStatus.js +55 -1
- package/dist/editor/services/agentStatus.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +5 -0
- package/dist/editor/services/contentService.js.map +1 -1
- package/dist/editor/services/personalizationService.d.ts +5 -0
- package/dist/editor/services/personalizationService.js +32 -0
- package/dist/editor/services/personalizationService.js.map +1 -0
- package/dist/editor/services/serviceHelper.d.ts +1 -1
- package/dist/editor/services/serviceHelper.js +2 -1
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/sidebar/OperationItem.js +1 -0
- package/dist/editor/sidebar/OperationItem.js.map +1 -1
- package/dist/editor/sidebar/SidebarPanel.js +3 -3
- package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
- package/dist/editor/ui/PublishRestrictionsDialog.js +1 -0
- package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.d.ts +1 -0
- package/dist/editor/ui/SimpleTabs.js +2 -2
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +4 -0
- package/dist/editor/ui/Splitter.js +42 -17
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/utils/sitecoreDate.d.ts +2 -0
- package/dist/editor/utils/sitecoreDate.js +27 -0
- package/dist/editor/utils/sitecoreDate.js.map +1 -0
- package/dist/editor/utils/versionAtDate.d.ts +2 -0
- package/dist/editor/utils/versionAtDate.js +23 -0
- package/dist/editor/utils/versionAtDate.js.map +1 -0
- package/dist/lib/viewTransition.d.ts +1 -0
- package/dist/lib/viewTransition.js +17 -0
- package/dist/lib/viewTransition.js.map +1 -0
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/task-board/TaskBoardWorkspace.js +85 -77
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/components/ProjectAgentsPanel.js +2 -2
- package/dist/task-board/components/ProjectAgentsPanel.js.map +1 -1
- package/dist/task-board/components/ProjectPropertiesPanel.js +76 -24
- package/dist/task-board/components/ProjectPropertiesPanel.js.map +1 -1
- package/dist/task-board/components/TaskDetailPanel.d.ts +3 -1
- package/dist/task-board/components/TaskDetailPanel.js +8 -5
- package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
- package/dist/types.d.ts +55 -1
- package/package.json +1 -1
- package/dist/task-board/components/AssignAgentDialog.d.ts +0 -7
- package/dist/task-board/components/AssignAgentDialog.js +0 -104
- package/dist/task-board/components/AssignAgentDialog.js.map +0 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { CheckCircle2, CircleDashed, Loader2, Plus } from "lucide-react";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
import { useEditContext } from "../client/editContext";
|
|
6
|
+
import { getRuleElements, setActiveRuleForComponent, } from "../services/personalizationService";
|
|
7
|
+
import { ActionList } from "./ActionList";
|
|
8
|
+
import { ConditionTreeEditor } from "./ConditionTreeEditor";
|
|
9
|
+
import { RuleList } from "./RuleList";
|
|
10
|
+
import { createId, createRule } from "./utils";
|
|
11
|
+
function cloneRule(value) {
|
|
12
|
+
return JSON.parse(JSON.stringify(value));
|
|
13
|
+
}
|
|
14
|
+
function normalizeId(value) {
|
|
15
|
+
return (value || "").trim().replace(/[{}]/g, "").toLowerCase();
|
|
16
|
+
}
|
|
17
|
+
const EMPTY_RULE_SET = { rules: [] };
|
|
18
|
+
export function PersonalizationPanel({ component, pageItem, readonly, ruleSet: ruleSetProp, ruleSetForKey, ruleSetLoadGen, onRuleSetChange, onExternalReload, }) {
|
|
19
|
+
const editContext = useEditContext();
|
|
20
|
+
const [elements, setElements] = useState([]);
|
|
21
|
+
const [elementsLoaded, setElementsLoaded] = useState(false);
|
|
22
|
+
// selectedRuleId == the rule currently *applied* to the preview (drives the
|
|
23
|
+
// checkmark and the rule we POST to the backend).
|
|
24
|
+
// expandedRuleId == the accordion body currently shown in the editor. The
|
|
25
|
+
// two are decoupled so the user can collapse a rule's body without losing
|
|
26
|
+
// their applied selection, and can switch the applied rule independently
|
|
27
|
+
// via the status-icon button.
|
|
28
|
+
const [selectedRuleId, setSelectedRuleId] = useState();
|
|
29
|
+
const [expandedRuleId, setExpandedRuleId] = useState();
|
|
30
|
+
const [saving, setSaving] = useState(false);
|
|
31
|
+
const [dirty, setDirty] = useState(false);
|
|
32
|
+
const [replaceUnsupported, setReplaceUnsupported] = useState(false);
|
|
33
|
+
const dirtyRef = useRef(false);
|
|
34
|
+
const savingRef = useRef(false);
|
|
35
|
+
const ruleSet = ruleSetProp ?? EMPTY_RULE_SET;
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
dirtyRef.current = dirty;
|
|
38
|
+
}, [dirty]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
savingRef.current = saving;
|
|
41
|
+
}, [saving]);
|
|
42
|
+
// The page model rebuilds after every iframe refresh, so depend on stable
|
|
43
|
+
// scalars rather than the pageItem object reference — otherwise the effect
|
|
44
|
+
// refires on every refresh and the panel flickers.
|
|
45
|
+
const componentId = component?.id;
|
|
46
|
+
const pageItemId = pageItem?.id;
|
|
47
|
+
const pageItemLanguage = pageItem?.language;
|
|
48
|
+
const pageItemVersion = pageItem?.version;
|
|
49
|
+
const componentLoadKey = componentId && pageItemId
|
|
50
|
+
? `${pageItemId}|${pageItemLanguage || ""}|${pageItemVersion || ""}|${componentId}`
|
|
51
|
+
: undefined;
|
|
52
|
+
const loaded = elementsLoaded &&
|
|
53
|
+
!!ruleSetProp &&
|
|
54
|
+
!!componentLoadKey &&
|
|
55
|
+
ruleSetForKey === componentLoadKey;
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!editContext?.addSocketMessageListener || !componentId || !pageItemId) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
return editContext.addSocketMessageListener((message) => {
|
|
61
|
+
if (message.type !== "edit-operation" &&
|
|
62
|
+
message.type !== "operation:completed") {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const operation = message.payload || {};
|
|
66
|
+
if (operation.type !== "update-rendering-rules") {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const operationComponentId = operation.componentId || operation.ComponentId;
|
|
70
|
+
if (operationComponentId &&
|
|
71
|
+
normalizeId(operationComponentId) !== normalizeId(componentId)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const mainItem = operation.mainItem || operation.MainItem;
|
|
75
|
+
if (mainItem?.id && normalizeId(mainItem.id) !== normalizeId(pageItemId)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (mainItem?.language &&
|
|
79
|
+
pageItemLanguage &&
|
|
80
|
+
mainItem.language !== pageItemLanguage) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (mainItem?.version &&
|
|
84
|
+
pageItemVersion &&
|
|
85
|
+
Number(mainItem.version) !== Number(pageItemVersion)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (dirtyRef.current || savingRef.current) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
onExternalReload?.();
|
|
92
|
+
});
|
|
93
|
+
}, [
|
|
94
|
+
editContext?.addSocketMessageListener,
|
|
95
|
+
componentId,
|
|
96
|
+
pageItemId,
|
|
97
|
+
pageItemLanguage,
|
|
98
|
+
pageItemVersion,
|
|
99
|
+
onExternalReload,
|
|
100
|
+
]);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
let cancelled = false;
|
|
103
|
+
void getRuleElements()
|
|
104
|
+
.then((nextElements) => {
|
|
105
|
+
if (cancelled)
|
|
106
|
+
return;
|
|
107
|
+
setElements(nextElements);
|
|
108
|
+
setElementsLoaded(true);
|
|
109
|
+
})
|
|
110
|
+
.catch((error) => {
|
|
111
|
+
console.error("Failed to load personalization elements", error);
|
|
112
|
+
if (!cancelled) {
|
|
113
|
+
setElements([]);
|
|
114
|
+
setElementsLoaded(true);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
return () => {
|
|
118
|
+
cancelled = true;
|
|
119
|
+
};
|
|
120
|
+
}, []);
|
|
121
|
+
// When a fresh rule set is loaded (parent fetch completes), seed selection
|
|
122
|
+
// from activeRuleId / first rule. Skip on local edits — those bump the
|
|
123
|
+
// ruleSet identity but not the load generation counter.
|
|
124
|
+
const initializedLoadRef = useRef(undefined);
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
if (!loaded || !ruleSetProp)
|
|
127
|
+
return;
|
|
128
|
+
const initKey = `${componentLoadKey}:${ruleSetLoadGen ?? 0}`;
|
|
129
|
+
if (initializedLoadRef.current === initKey)
|
|
130
|
+
return;
|
|
131
|
+
initializedLoadRef.current = initKey;
|
|
132
|
+
const nextRules = ruleSetProp.rules || [];
|
|
133
|
+
setReplaceUnsupported(false);
|
|
134
|
+
let nextSelected;
|
|
135
|
+
setSelectedRuleId((current) => {
|
|
136
|
+
if (typeof ruleSetProp.activeRuleId === "string") {
|
|
137
|
+
const activeRule = nextRules.find((rule) => normalizeId(rule.uid) === normalizeId(ruleSetProp.activeRuleId));
|
|
138
|
+
nextSelected = activeRule?.uid;
|
|
139
|
+
return nextSelected;
|
|
140
|
+
}
|
|
141
|
+
if (current && nextRules.some((rule) => rule.uid === current)) {
|
|
142
|
+
nextSelected = current;
|
|
143
|
+
return current;
|
|
144
|
+
}
|
|
145
|
+
nextSelected = nextRules[0]?.uid;
|
|
146
|
+
return nextSelected;
|
|
147
|
+
});
|
|
148
|
+
// On a fresh load, seed expansion to mirror the applied rule so the user
|
|
149
|
+
// sees its conditions/actions immediately. From that point on expansion
|
|
150
|
+
// is driven independently by the user.
|
|
151
|
+
setExpandedRuleId(nextSelected);
|
|
152
|
+
}, [loaded, ruleSetProp, componentLoadKey, ruleSetLoadGen]);
|
|
153
|
+
// Tracks the last rule id we pushed to the server per component, so we can
|
|
154
|
+
// distinguish the initial seed (page already rendering with that rule) from
|
|
155
|
+
// a user-driven change that needs a preview refresh.
|
|
156
|
+
const lastAppliedRuleRef = useRef({});
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
if (!loaded ||
|
|
159
|
+
!componentId ||
|
|
160
|
+
!pageItem ||
|
|
161
|
+
!editContext?.sessionId) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const previous = lastAppliedRuleRef.current;
|
|
165
|
+
const ruleChanged = previous.key === componentLoadKey && previous.ruleId !== selectedRuleId;
|
|
166
|
+
lastAppliedRuleRef.current = {
|
|
167
|
+
key: componentLoadKey,
|
|
168
|
+
ruleId: selectedRuleId,
|
|
169
|
+
};
|
|
170
|
+
void setActiveRuleForComponent(pageItem, componentId, selectedRuleId, editContext.sessionId)
|
|
171
|
+
.then(() => {
|
|
172
|
+
if (ruleChanged) {
|
|
173
|
+
editContext.requestRefresh?.("immediate");
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
.catch((error) => {
|
|
177
|
+
console.error("Failed to set active personalization rule", error);
|
|
178
|
+
});
|
|
179
|
+
// Depend on stable page/component scalars; pageItem identity changes on refresh.
|
|
180
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
181
|
+
}, [
|
|
182
|
+
componentId,
|
|
183
|
+
componentLoadKey,
|
|
184
|
+
editContext?.sessionId,
|
|
185
|
+
loaded,
|
|
186
|
+
pageItemId,
|
|
187
|
+
pageItemLanguage,
|
|
188
|
+
pageItemVersion,
|
|
189
|
+
selectedRuleId,
|
|
190
|
+
]);
|
|
191
|
+
const selectedRule = useMemo(() => ruleSet.rules.find((rule) => rule.uid === selectedRuleId), [ruleSet.rules, selectedRuleId]);
|
|
192
|
+
const protectedMode = !!ruleSet.unsupported && !replaceUnsupported;
|
|
193
|
+
const disabled = readonly || !loaded || saving || protectedMode;
|
|
194
|
+
const updateRules = (rules) => {
|
|
195
|
+
onRuleSetChange?.((current) => ({
|
|
196
|
+
...current,
|
|
197
|
+
rules,
|
|
198
|
+
unsupported: replaceUnsupported ? false : current.unsupported,
|
|
199
|
+
}));
|
|
200
|
+
setDirty(true);
|
|
201
|
+
};
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
if (!dirty || disabled || !component?.id || !editContext?.operations)
|
|
204
|
+
return;
|
|
205
|
+
const timeout = window.setTimeout(async () => {
|
|
206
|
+
setSaving(true);
|
|
207
|
+
try {
|
|
208
|
+
await editContext.operations.updateRenderingRules(component.id, {
|
|
209
|
+
rules: ruleSet.rules,
|
|
210
|
+
});
|
|
211
|
+
setDirty(false);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// executeOp already surfaced the backend error toast; keep the panel dirty.
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
setSaving(false);
|
|
218
|
+
}
|
|
219
|
+
}, 800);
|
|
220
|
+
return () => window.clearTimeout(timeout);
|
|
221
|
+
}, [component?.id, dirty, disabled, editContext?.operations, ruleSet.rules]);
|
|
222
|
+
const addRule = () => {
|
|
223
|
+
const nextRule = createRule(`Rule ${ruleSet.rules.length + 1}`);
|
|
224
|
+
updateRules([...ruleSet.rules, nextRule]);
|
|
225
|
+
setSelectedRuleId(nextRule.uid);
|
|
226
|
+
setExpandedRuleId(nextRule.uid);
|
|
227
|
+
};
|
|
228
|
+
const replaceExistingPersonalization = () => {
|
|
229
|
+
const nextRule = createRule("New rule");
|
|
230
|
+
setReplaceUnsupported(true);
|
|
231
|
+
onRuleSetChange?.(() => ({
|
|
232
|
+
rules: [nextRule],
|
|
233
|
+
unsupported: false,
|
|
234
|
+
unsupportedReasons: [],
|
|
235
|
+
}));
|
|
236
|
+
setSelectedRuleId(nextRule.uid);
|
|
237
|
+
setExpandedRuleId(nextRule.uid);
|
|
238
|
+
setDirty(true);
|
|
239
|
+
};
|
|
240
|
+
if (!component || !pageItem) {
|
|
241
|
+
return (_jsx("div", { className: "p-4 text-xs text-gray-500", children: "Select a component to configure personalization." }));
|
|
242
|
+
}
|
|
243
|
+
if (!loaded) {
|
|
244
|
+
return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-xs text-gray-500", children: [_jsx(Loader2, { className: "size-3 animate-spin" }), "Loading personalization..."] }));
|
|
245
|
+
}
|
|
246
|
+
const renderRuleBody = (rule) => (_jsxs("div", { className: "space-y-4", children: [_jsxs("section", { className: "space-y-2", children: [_jsxs("h4", { className: "flex items-center gap-2 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: [_jsx("span", { className: "inline-block size-1.5 rounded-full bg-emerald-400" }), "When"] }), _jsx(ConditionTreeEditor, { condition: rule.conditions, elements: elements, disabled: disabled, onChange: (conditions) => updateRules(ruleSet.rules.map((existing) => existing.uid === rule.uid ? { ...existing, conditions } : existing)) })] }), _jsxs("section", { className: "space-y-2", children: [_jsxs("h4", { className: "flex items-center gap-2 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: [_jsx("span", { className: "inline-block size-1.5 rounded-full bg-violet-400" }), "Then"] }), _jsx(ActionList, { actions: rule.actions || [], elements: elements, disabled: disabled, onChange: (actions) => updateRules(ruleSet.rules.map((existing) => existing.uid === rule.uid ? { ...existing, actions } : existing)) })] })] }));
|
|
247
|
+
return (_jsxs("div", { className: "space-y-4 p-3 text-xs", "data-testid": "personalization-panel", children: [_jsxs("header", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-sm font-semibold text-gray-900", children: "Personalization" }), component.name && (_jsx("div", { className: "truncate text-2xs text-gray-500", title: component.name, children: component.name }))] }), _jsx(SaveIndicator, { saving: saving, dirty: dirty })] }), readonly && (_jsx("div", { className: "rounded border border-gray-200 bg-gray-50 p-3 text-2xs text-gray-500", children: "Personalization is read-only in the current editor mode." })), protectedMode && (_jsxs("div", { className: "space-y-2 rounded border border-amber-200 bg-amber-50 p-3 text-2xs text-amber-700", children: [_jsx("div", { className: "text-xs font-medium", children: "Existing personalization is protected" }), _jsx("div", { children: "This rendering contains rules that Parhelia cannot fully edit yet. Saving is disabled to avoid overwriting Sitecore data." }), ruleSet.unsupportedReasons?.length ? (_jsx("ul", { className: "list-disc space-y-1 pl-4", children: ruleSet.unsupportedReasons.map((reason) => (_jsx("li", { children: reason }, reason))) })) : null, _jsx(Button, { type: "button", size: "xs", variant: "outline", disabled: readonly, onClick: replaceExistingPersonalization, children: "Replace existing personalization" })] })), ruleSet.rules.length === 0 ? (_jsxs("div", { className: "space-y-3 rounded border border-dashed border-gray-300 p-4 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "text-xs font-medium text-gray-800", children: "No personalization yet" }), _jsx("div", { className: "text-2xs text-gray-500", children: "Add rules to show different content to different audiences. Each rule combines conditions with actions." })] }), _jsxs(Button, { type: "button", size: "xs", variant: "default", disabled: disabled, onClick: addRule, children: [_jsx(Plus, { className: "size-3" }), "Add first rule"] })] })) : (_jsxs(_Fragment, { children: [_jsx(RuleList, { rules: ruleSet.rules, selectedRuleId: expandedRuleId, appliedRuleId: selectedRule?.uid, disabled: disabled, onToggle: (uid) => setExpandedRuleId((current) => (current === uid ? undefined : uid)), onApply: (uid) => setSelectedRuleId(uid), onRename: (uid, name) => updateRules(ruleSet.rules.map((rule) => rule.uid === uid ? { ...rule, name } : rule)), onDelete: (uid) => {
|
|
248
|
+
const nextRules = ruleSet.rules.filter((rule) => rule.uid !== uid);
|
|
249
|
+
updateRules(nextRules);
|
|
250
|
+
if (selectedRuleId === uid) {
|
|
251
|
+
setSelectedRuleId(nextRules[0]?.uid);
|
|
252
|
+
}
|
|
253
|
+
if (expandedRuleId === uid) {
|
|
254
|
+
setExpandedRuleId(nextRules[0]?.uid);
|
|
255
|
+
}
|
|
256
|
+
}, onDuplicate: (uid) => {
|
|
257
|
+
const source = ruleSet.rules.find((rule) => rule.uid === uid);
|
|
258
|
+
if (!source)
|
|
259
|
+
return;
|
|
260
|
+
const duplicate = {
|
|
261
|
+
...cloneRule(source),
|
|
262
|
+
uid: createId(),
|
|
263
|
+
name: `${source.name || "Rule"} copy`,
|
|
264
|
+
};
|
|
265
|
+
updateRules([...ruleSet.rules, duplicate]);
|
|
266
|
+
setSelectedRuleId(duplicate.uid);
|
|
267
|
+
setExpandedRuleId(duplicate.uid);
|
|
268
|
+
}, onMove: (uid, direction) => {
|
|
269
|
+
const index = ruleSet.rules.findIndex((rule) => rule.uid === uid);
|
|
270
|
+
const target = index + direction;
|
|
271
|
+
if (index < 0 || target < 0 || target >= ruleSet.rules.length)
|
|
272
|
+
return;
|
|
273
|
+
const nextRules = [...ruleSet.rules];
|
|
274
|
+
const [moved] = nextRules.splice(index, 1);
|
|
275
|
+
if (!moved)
|
|
276
|
+
return;
|
|
277
|
+
nextRules.splice(target, 0, moved);
|
|
278
|
+
updateRules(nextRules);
|
|
279
|
+
}, onReorder: (fromIndex, toIndex) => {
|
|
280
|
+
if (fromIndex < 0 ||
|
|
281
|
+
toIndex < 0 ||
|
|
282
|
+
fromIndex >= ruleSet.rules.length ||
|
|
283
|
+
toIndex >= ruleSet.rules.length ||
|
|
284
|
+
fromIndex === toIndex) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const nextRules = [...ruleSet.rules];
|
|
288
|
+
const [moved] = nextRules.splice(fromIndex, 1);
|
|
289
|
+
if (!moved)
|
|
290
|
+
return;
|
|
291
|
+
nextRules.splice(toIndex, 0, moved);
|
|
292
|
+
updateRules(nextRules);
|
|
293
|
+
}, renderRuleBody: renderRuleBody }), _jsxs(Button, { type: "button", size: "xs", variant: "outline", disabled: disabled, onClick: addRule, className: "w-full justify-center", children: [_jsx(Plus, { className: "size-3" }), "Add rule"] }), _jsxs("button", { type: "button", disabled: disabled, onClick: () => setSelectedRuleId(undefined), title: !selectedRule
|
|
294
|
+
? "Currently applied"
|
|
295
|
+
: "Show the default rendering (no rule applied)", className: `flex w-full items-center gap-1 rounded border px-1.5 py-1.5 text-left text-xs transition-colors ${!selectedRule
|
|
296
|
+
? "border-component-blue bg-blue-50/40"
|
|
297
|
+
: "border-gray-200 bg-white hover:bg-gray-50"} disabled:cursor-not-allowed disabled:opacity-60`, children: [_jsx("span", { "aria-hidden": true, className: "size-5 shrink-0" }), _jsx("span", { "aria-hidden": true, className: "size-5 shrink-0" }), _jsx("span", { "aria-hidden": true, className: "flex size-5 shrink-0 items-center justify-center", children: !selectedRule ? (_jsx(CheckCircle2, { className: "size-3.5 text-component-blue" })) : (_jsx(CircleDashed, { className: "size-3.5 text-gray-300" })) }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-gray-800", children: "Default rendering" }), _jsx("span", { className: "shrink-0 pr-1 text-2xs text-gray-500", children: "No personalization" })] })] }))] }));
|
|
298
|
+
}
|
|
299
|
+
function SaveIndicator({ saving, dirty, }) {
|
|
300
|
+
if (saving) {
|
|
301
|
+
return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-gray-500", children: [_jsx(Loader2, { className: "size-3 animate-spin" }), "Saving"] }));
|
|
302
|
+
}
|
|
303
|
+
if (dirty) {
|
|
304
|
+
return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-amber-600", children: [_jsx(CircleDashed, { className: "size-3" }), "Modified"] }));
|
|
305
|
+
}
|
|
306
|
+
return (_jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-2xs text-emerald-600", children: [_jsx(CheckCircle2, { className: "size-3" }), "Saved"] }));
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=PersonalizationPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonalizationPanel.js","sourceRoot":"","sources":["../../../src/editor/personalization/PersonalizationPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RuleElement } from "../../types";
|
|
2
|
+
export declare function RuleElementPicker({ elements, kind, label, onPick, disabled, triggerVariant, triggerSize, fullWidth, }: {
|
|
3
|
+
elements: RuleElement[];
|
|
4
|
+
kind: "condition" | "action";
|
|
5
|
+
label: string;
|
|
6
|
+
onPick: (element: RuleElement) => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
triggerVariant?: "outline" | "ghost" | "default";
|
|
9
|
+
triggerSize?: "xs" | "xxs" | "sm";
|
|
10
|
+
fullWidth?: boolean;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Plus, Search } from "lucide-react";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
|
|
6
|
+
function formatRuleText(text) {
|
|
7
|
+
if (!text)
|
|
8
|
+
return "";
|
|
9
|
+
// Sitecore rule text uses [varname,Type,Source,Label] placeholders.
|
|
10
|
+
// Render the user-facing label in brackets so the sentence stays readable.
|
|
11
|
+
return text
|
|
12
|
+
.replace(/\[([^\]]+)\]/g, (_match, body) => {
|
|
13
|
+
const parts = body.split(",");
|
|
14
|
+
const label = (parts[3] || parts[0] || "").trim();
|
|
15
|
+
return label ? `[${label}]` : "[…]";
|
|
16
|
+
})
|
|
17
|
+
.replace(/\s+/g, " ")
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
20
|
+
export function RuleElementPicker({ elements, kind, label, onPick, disabled, triggerVariant = "outline", triggerSize = "xs", fullWidth, }) {
|
|
21
|
+
const [open, setOpen] = useState(false);
|
|
22
|
+
const [filter, setFilter] = useState("");
|
|
23
|
+
const inputRef = useRef(null);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!open) {
|
|
26
|
+
setFilter("");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const id = window.setTimeout(() => inputRef.current?.focus(), 30);
|
|
30
|
+
return () => window.clearTimeout(id);
|
|
31
|
+
}, [open]);
|
|
32
|
+
const grouped = useMemo(() => {
|
|
33
|
+
const query = filter.trim().toLowerCase();
|
|
34
|
+
const matching = elements
|
|
35
|
+
.filter((element) => element.kind === kind)
|
|
36
|
+
.filter((element) => {
|
|
37
|
+
if (!query)
|
|
38
|
+
return true;
|
|
39
|
+
return (element.displayName.toLowerCase().includes(query) ||
|
|
40
|
+
element.name.toLowerCase().includes(query) ||
|
|
41
|
+
element.category.toLowerCase().includes(query) ||
|
|
42
|
+
element.text.toLowerCase().includes(query));
|
|
43
|
+
});
|
|
44
|
+
const map = new Map();
|
|
45
|
+
for (const element of matching) {
|
|
46
|
+
const key = element.category || "Other";
|
|
47
|
+
const list = map.get(key) ?? [];
|
|
48
|
+
list.push(element);
|
|
49
|
+
map.set(key, list);
|
|
50
|
+
}
|
|
51
|
+
return Array.from(map.entries())
|
|
52
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
53
|
+
.map(([category, items]) => ({
|
|
54
|
+
category,
|
|
55
|
+
items: items
|
|
56
|
+
.slice()
|
|
57
|
+
.sort((a, b) => (a.displayName || a.name).localeCompare(b.displayName || b.name)),
|
|
58
|
+
}));
|
|
59
|
+
}, [elements, filter, kind]);
|
|
60
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", size: triggerSize, variant: triggerVariant, disabled: disabled, className: fullWidth ? "w-full justify-start" : undefined, children: [_jsx(Plus, { className: "size-3" }), label] }) }), _jsxs(PopoverContent, { align: "start", sideOffset: 4, className: "w-[28rem] max-w-[calc(100vw-2rem)] p-0", children: [_jsx("div", { className: "border-b border-gray-200 p-2", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3 -translate-y-1/2 text-gray-400" }), _jsx("input", { ref: inputRef, type: "text", className: "w-full rounded border border-gray-300 py-1 pl-7 pr-2 text-xs outline-none focus:border-component-blue", placeholder: `Search ${kind}s...`, value: filter, onChange: (event) => setFilter(event.target.value) })] }) }), _jsx("div", { className: "max-h-72 overflow-auto py-1", children: grouped.length === 0 ? (_jsxs("div", { className: "px-3 py-4 text-center text-2xs text-gray-500", children: ["No matching ", kind, "s"] })) : (grouped.map((group) => (_jsxs("div", { className: "py-1", children: [_jsx("div", { className: "px-3 pb-1 pt-1 text-2xs font-semibold uppercase tracking-wide text-gray-500", children: group.category }), group.items.map((element) => {
|
|
61
|
+
const sentence = formatRuleText(element.text);
|
|
62
|
+
return (_jsxs("button", { type: "button", className: "block w-full px-3 py-1.5 text-left hover:bg-blue-50", onClick: () => {
|
|
63
|
+
onPick(element);
|
|
64
|
+
setOpen(false);
|
|
65
|
+
}, title: element.text, children: [_jsx("div", { className: "text-xs font-medium text-gray-800", children: element.displayName || element.name }), sentence && (_jsx("div", { className: "mt-0.5 text-2xs leading-snug text-gray-500", children: sentence }))] }, element.id));
|
|
66
|
+
})] }, group.category)))) })] })] }));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=RuleElementPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleElementPicker.js","sourceRoot":"","sources":["../../../src/editor/personalization/RuleElementPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { PersonalizationRule } from "../../types";
|
|
3
|
+
export declare function RuleList({ rules, selectedRuleId, appliedRuleId, disabled, onToggle, onApply, onDuplicate, onDelete, onMove, onRename, onReorder, renderRuleBody, }: {
|
|
4
|
+
rules: PersonalizationRule[];
|
|
5
|
+
/** UID of the rule whose body is currently expanded (accordion state). */
|
|
6
|
+
selectedRuleId?: string;
|
|
7
|
+
/** UID of the rule currently applied to the preview (gets the checkmark). */
|
|
8
|
+
appliedRuleId?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onToggle: (uid: string) => void;
|
|
11
|
+
/** Apply this rule to the preview (independent of expansion). */
|
|
12
|
+
onApply: (uid: string) => void;
|
|
13
|
+
onDuplicate: (uid: string) => void;
|
|
14
|
+
onDelete: (uid: string) => void;
|
|
15
|
+
onMove: (uid: string, direction: -1 | 1) => void;
|
|
16
|
+
onRename: (uid: string, name: string) => void;
|
|
17
|
+
onReorder: (fromIndex: number, toIndex: number) => void;
|
|
18
|
+
renderRuleBody: (rule: PersonalizationRule) => ReactNode;
|
|
19
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState, } from "react";
|
|
3
|
+
import { CheckCircle2, ChevronDown, ChevronRight, ChevronUp, CircleDashed, Copy, GripVertical, Pencil, Trash2, } from "lucide-react";
|
|
4
|
+
import { Button } from "../../components/ui/button";
|
|
5
|
+
const DRAG_MIME = "application/x-personalization-rule-uid";
|
|
6
|
+
export function RuleList({ rules, selectedRuleId, appliedRuleId, disabled, onToggle, onApply, onDuplicate, onDelete, onMove, onRename, onReorder, renderRuleBody, }) {
|
|
7
|
+
const [draggingUid, setDraggingUid] = useState(null);
|
|
8
|
+
const [dropIndex, setDropIndex] = useState(null);
|
|
9
|
+
if (rules.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
const sourceIndex = draggingUid
|
|
12
|
+
? rules.findIndex((rule) => rule.uid === draggingUid)
|
|
13
|
+
: -1;
|
|
14
|
+
const handleDragStart = (uid) => setDraggingUid(uid);
|
|
15
|
+
const handleDragEnd = () => {
|
|
16
|
+
setDraggingUid(null);
|
|
17
|
+
setDropIndex(null);
|
|
18
|
+
};
|
|
19
|
+
const handleZoneDrop = (index) => {
|
|
20
|
+
if (sourceIndex < 0) {
|
|
21
|
+
handleDragEnd();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let toIndex = index;
|
|
25
|
+
if (toIndex > sourceIndex)
|
|
26
|
+
toIndex -= 1;
|
|
27
|
+
if (toIndex !== sourceIndex) {
|
|
28
|
+
onReorder(sourceIndex, toIndex);
|
|
29
|
+
}
|
|
30
|
+
handleDragEnd();
|
|
31
|
+
};
|
|
32
|
+
return (_jsxs("div", { className: "space-y-0", children: [rules.map((rule, index) => {
|
|
33
|
+
const expanded = rule.uid === selectedRuleId;
|
|
34
|
+
const isDragSource = draggingUid === rule.uid;
|
|
35
|
+
return (_jsxs("div", { children: [_jsx(DropZone, { index: index, active: draggingUid !== null, hovered: dropIndex === index, isNoOp: sourceIndex >= 0 &&
|
|
36
|
+
(index === sourceIndex || index === sourceIndex + 1), onEnter: () => setDropIndex(index), onLeave: () => setDropIndex((n) => (n === index ? null : n)), onDrop: () => handleZoneDrop(index) }), _jsx(RuleAccordionItem, { rule: rule, expanded: expanded, applied: rule.uid === appliedRuleId, disabled: disabled, isFirst: index === 0, isLast: index === rules.length - 1, isDragSource: isDragSource, onToggle: () => onToggle(rule.uid), onApply: () => onApply(rule.uid), onRename: (name) => onRename(rule.uid, name), onMove: (direction) => onMove(rule.uid, direction), onDuplicate: () => onDuplicate(rule.uid), onDelete: () => onDelete(rule.uid), onDragStart: (event) => {
|
|
37
|
+
event.dataTransfer.effectAllowed = "move";
|
|
38
|
+
event.dataTransfer.setData(DRAG_MIME, rule.uid);
|
|
39
|
+
event.dataTransfer.setData("text/plain", rule.uid);
|
|
40
|
+
handleDragStart(rule.uid);
|
|
41
|
+
}, onDragEnd: handleDragEnd, children: expanded ? renderRuleBody(rule) : null })] }, rule.uid));
|
|
42
|
+
}), _jsx(DropZone, { index: rules.length, active: draggingUid !== null, hovered: dropIndex === rules.length, isNoOp: sourceIndex === rules.length - 1, onEnter: () => setDropIndex(rules.length), onLeave: () => setDropIndex((n) => (n === rules.length ? null : n)), onDrop: () => handleZoneDrop(rules.length) })] }));
|
|
43
|
+
}
|
|
44
|
+
function DropZone({ active, hovered, isNoOp, onEnter, onLeave, onDrop, }) {
|
|
45
|
+
const showHighlight = active && hovered && !isNoOp;
|
|
46
|
+
return (_jsx("div", { onDragEnter: (event) => {
|
|
47
|
+
if (!active)
|
|
48
|
+
return;
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
onEnter();
|
|
51
|
+
}, onDragOver: (event) => {
|
|
52
|
+
if (!active)
|
|
53
|
+
return;
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
event.dataTransfer.dropEffect = isNoOp ? "none" : "move";
|
|
56
|
+
onEnter();
|
|
57
|
+
}, onDragLeave: onLeave, onDrop: (event) => {
|
|
58
|
+
if (!active)
|
|
59
|
+
return;
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
onDrop();
|
|
62
|
+
}, className: `relative transition-[height,margin] duration-150 ${active ? "h-3 my-0.5" : "h-1.5"}`, children: active && (_jsx("div", { className: `pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 rounded transition-all ${showHighlight
|
|
63
|
+
? "h-1 bg-component-blue shadow-[0_0_0_3px_rgba(59,130,246,0.15)]"
|
|
64
|
+
: isNoOp
|
|
65
|
+
? "h-px bg-transparent"
|
|
66
|
+
: "h-0.5 bg-gray-200"}` })) }));
|
|
67
|
+
}
|
|
68
|
+
function RuleAccordionItem({ rule, expanded, applied, disabled, isFirst, isLast, isDragSource, onToggle, onApply, onRename, onMove, onDuplicate, onDelete, onDragStart, onDragEnd, children, }) {
|
|
69
|
+
const [editing, setEditing] = useState(false);
|
|
70
|
+
const [draftName, setDraftName] = useState(rule.name || "");
|
|
71
|
+
const inputRef = useRef(null);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
setDraftName(rule.name || "");
|
|
74
|
+
}, [rule.name]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (!editing)
|
|
77
|
+
return;
|
|
78
|
+
const id = window.setTimeout(() => {
|
|
79
|
+
inputRef.current?.focus();
|
|
80
|
+
inputRef.current?.select();
|
|
81
|
+
}, 0);
|
|
82
|
+
return () => window.clearTimeout(id);
|
|
83
|
+
}, [editing]);
|
|
84
|
+
const commitRename = () => {
|
|
85
|
+
const next = draftName.trim();
|
|
86
|
+
if (next && next !== rule.name) {
|
|
87
|
+
onRename(next);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
setDraftName(rule.name || "");
|
|
91
|
+
}
|
|
92
|
+
setEditing(false);
|
|
93
|
+
};
|
|
94
|
+
const cancelRename = () => {
|
|
95
|
+
setDraftName(rule.name || "");
|
|
96
|
+
setEditing(false);
|
|
97
|
+
};
|
|
98
|
+
const headerDraggable = !disabled && !editing;
|
|
99
|
+
const handleHeaderDragStart = (event) => {
|
|
100
|
+
if (!headerDraggable) {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Don't drag when the gesture starts on a button or other exempt area
|
|
105
|
+
// (action cluster, name edit input). Letting the user click these without
|
|
106
|
+
// accidentally initiating a drag.
|
|
107
|
+
const target = event.target;
|
|
108
|
+
if (target?.closest("[data-drag-exempt]")) {
|
|
109
|
+
event.preventDefault();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
onDragStart(event);
|
|
113
|
+
};
|
|
114
|
+
return (_jsxs("div", { className: `overflow-hidden rounded border transition-colors ${expanded
|
|
115
|
+
? "border-component-blue bg-blue-50/40"
|
|
116
|
+
: "border-gray-200 bg-white"} ${isDragSource ? "opacity-40" : ""}`, children: [_jsxs("div", { draggable: headerDraggable, onDragStart: handleHeaderDragStart, onDragEnd: onDragEnd, className: `flex items-center gap-1 px-1.5 py-1.5 ${headerDraggable ? "cursor-grab active:cursor-grabbing" : ""}`, children: [_jsx("span", { "aria-hidden": true, className: "flex size-5 shrink-0 items-center justify-center text-gray-400", children: _jsx(GripVertical, { className: "size-3.5" }) }), _jsx("button", { type: "button", onClick: onToggle, "aria-label": expanded ? "Collapse rule" : "Expand rule", "data-drag-exempt": true, className: "flex size-5 shrink-0 cursor-pointer items-center justify-center rounded text-gray-500 hover:bg-gray-100 hover:text-gray-800", children: expanded ? (_jsx(ChevronDown, { className: "size-3.5" })) : (_jsx(ChevronRight, { className: "size-3.5" })) }), _jsx("button", { type: "button", onClick: onApply, disabled: disabled || applied, "data-drag-exempt": true, "aria-label": applied ? "Currently applied" : "Apply this rule", "aria-pressed": applied, title: applied ? "Currently applied" : "Apply this rule", className: `flex size-5 shrink-0 items-center justify-center rounded ${applied
|
|
117
|
+
? "cursor-default"
|
|
118
|
+
: "cursor-pointer hover:bg-gray-100 disabled:cursor-not-allowed"}`, children: applied ? (_jsx(CheckCircle2, { className: "size-3.5 text-component-blue" })) : (_jsx(CircleDashed, { className: "size-3.5 text-gray-300 hover:text-gray-500" })) }), editing ? (_jsx("input", { ref: inputRef, type: "text", "data-drag-exempt": true, className: "min-w-0 flex-1 rounded border border-gray-300 px-2 py-0.5 text-xs outline-none focus:border-component-blue", value: draftName, disabled: disabled, onChange: (event) => setDraftName(event.target.value), onBlur: commitRename, onKeyDown: (event) => {
|
|
119
|
+
if (event.key === "Enter") {
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
commitRename();
|
|
122
|
+
}
|
|
123
|
+
else if (event.key === "Escape") {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
cancelRename();
|
|
126
|
+
}
|
|
127
|
+
} })) : (_jsxs("button", { type: "button", "data-drag-exempt": true, className: "flex min-w-0 flex-1 items-center gap-2 truncate text-left text-xs font-medium text-gray-800", onClick: onToggle, onDoubleClick: () => !disabled && setEditing(true), title: rule.name || "Unnamed rule", children: [_jsx("span", { className: "truncate", children: rule.name || "Unnamed rule" }), rule.unsupported && (_jsx("span", { className: "shrink-0 rounded bg-amber-100 px-1.5 py-0.5 text-2xs text-amber-700", children: "limited" }))] })), _jsxs("div", { "data-drag-exempt": true, className: "flex shrink-0 items-center", children: [_jsx(IconActionButton, { label: "Rename", disabled: disabled || editing, onClick: () => setEditing(true), children: _jsx(Pencil, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Move up", disabled: disabled || isFirst, onClick: () => onMove(-1), children: _jsx(ChevronUp, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Move down", disabled: disabled || isLast, onClick: () => onMove(1), children: _jsx(ChevronDown, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Duplicate", disabled: disabled, onClick: onDuplicate, children: _jsx(Copy, { className: "size-3" }) }), _jsx(IconActionButton, { label: "Delete", disabled: disabled, danger: true, onClick: onDelete, children: _jsx(Trash2, { className: "size-3" }) })] })] }), expanded && children ? (_jsx("div", { className: "border-t border-gray-200 bg-white p-3", children: children })) : null] }));
|
|
128
|
+
}
|
|
129
|
+
function IconActionButton({ label, disabled, danger, onClick, children, }) {
|
|
130
|
+
return (_jsx(Button, { type: "button", size: "xxs", variant: "ghost", disabled: disabled, onClick: onClick, "aria-label": label, title: label, className: `size-6 rounded-md p-0 ${danger ? "hover:bg-red-50 hover:text-red-600" : ""}`, children: children }));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=RuleList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleList.js","sourceRoot":"","sources":["../../../src/editor/personalization/RuleList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { RuleElement } from "../../types";
|
|
3
|
+
export declare function RuleParameterInput({ element, values, disabled, onChange, prefix, stripLeadingWhere, }: {
|
|
4
|
+
element?: RuleElement;
|
|
5
|
+
values: Record<string, string>;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
onChange: (values: Record<string, string>) => void;
|
|
8
|
+
prefix?: ReactNode;
|
|
9
|
+
stripLeadingWhere?: boolean;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|