@parallelworks/ui 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunks/memoryStore-CC91S5LP.js → ai/adapter/memoryStore.js} +2 -2
- package/dist/ai/adapter/mock/index.js +2 -80
- package/dist/ai/adapter/mock/mockAdapter.js +81 -0
- package/dist/ai/adapter/openai/createOpenAIStream.js +33 -0
- package/dist/ai/adapter/openai/errors.js +37 -0
- package/dist/ai/adapter/openai/index.js +5 -333
- package/dist/ai/adapter/openai/openaiAdapter.js +54 -0
- package/dist/ai/adapter/openai/responses.js +108 -0
- package/dist/ai/adapter/openai/sse.js +112 -0
- package/dist/{chunks/types-Yy0NrerF.js → ai/adapter/types.js} +1 -1
- package/dist/ai/agent/classifier.js +12 -0
- package/dist/ai/agent/diff.js +223 -0
- package/dist/ai/agent/diffHighlight.js +101 -0
- package/dist/ai/agent/permissions.js +29 -0
- package/dist/ai/agent/toolfmt.js +383 -0
- package/dist/ai/agent/transcript.js +127 -0
- package/dist/ai/components/AllocationSelector.js +56 -0
- package/dist/ai/components/AttachmentManager.js +147 -0
- package/dist/ai/components/AttachmentUpload.js +179 -0
- package/dist/ai/components/BlockedGroupBanner.js +29 -0
- package/dist/ai/components/BranchNavigator.js +57 -0
- package/dist/ai/components/ChatEmptyState.js +171 -0
- package/dist/ai/components/ChatInput.js +265 -0
- package/dist/ai/components/ChatLayout.js +15 -0
- package/dist/ai/components/ChatMessage.js +341 -0
- package/dist/ai/components/ChatMessageList.js +301 -0
- package/dist/ai/components/ChatSidebar.js +345 -0
- package/dist/ai/components/ChatThread.js +198 -0
- package/dist/ai/components/ComposerChrome.js +50 -0
- package/dist/ai/components/ComposerFrame.js +33 -0
- package/dist/ai/components/DragOverlay.js +20 -0
- package/dist/ai/components/ModelSelector.js +343 -0
- package/dist/ai/components/ShareDialog.js +260 -0
- package/dist/ai/components/SlashMenu.js +91 -0
- package/dist/ai/components/agent/ActivityLine.js +151 -0
- package/dist/ai/components/agent/AgentMessageParts.js +721 -0
- package/dist/ai/components/agent/PermissionPicker.js +38 -0
- package/dist/ai/components/attachmentKeys.js +10 -0
- package/dist/ai/core/ChatProvider.js +848 -0
- package/dist/ai/core/KeyboardShortcutsProvider.js +9 -0
- package/dist/ai/core/chatReducer.js +223 -0
- package/dist/ai/core/config.js +46 -0
- package/dist/ai/core/events.js +4 -0
- package/dist/ai/core/exportConversation.js +42 -0
- package/dist/ai/core/greeting.js +38 -0
- package/dist/ai/core/parts.js +84 -0
- package/dist/ai/core/useDragDrop.js +36 -0
- package/dist/ai/core/useKeyboardShortcuts.js +77 -0
- package/dist/ai/core/useSSEStream.js +98 -0
- package/dist/ai/index.js +43 -6644
- package/dist/ai/strings.js +175 -0
- package/dist/ai/ui/Avatar.js +35 -0
- package/dist/ai/ui/Dropdown.js +110 -0
- package/dist/ai/ui/Markdown.js +79 -0
- package/dist/ai/ui/Notice.js +77 -0
- package/dist/ai/ui/codeBreaks.js +36 -0
- package/dist/ai/ui/prose.js +13 -0
- package/dist/ai/ui/sidebar.js +148 -0
- package/dist/ai/utils.js +23 -0
- package/dist/assets/editor.worker-DfmPPyOL.js +60 -0
- package/dist/assets/json.worker-Dqgjpq9F.js +92 -0
- package/dist/assets/yaml.worker-DLx0whrM.js +1441 -0
- package/dist/components/AddMenu.js +46 -0
- package/dist/components/Avatar.js +46 -0
- package/dist/{chunks/BareModal-BtRiQezg.js → components/BareModal.js} +1 -1
- package/dist/components/Breadcrumbs.js +83 -0
- package/dist/components/Button.js +83 -0
- package/dist/components/Callout.js +23 -0
- package/dist/components/Card.js +31 -0
- package/dist/components/CollapsiblePanel.js +77 -0
- package/dist/{chunks/ConfirmModal-aOR4O1QE.js → components/ConfirmModal.js} +4 -9
- package/dist/components/CopyToClipboard.js +81 -0
- package/dist/{chunks/Markdown-CM-FenNE.js → components/CreateModal.js} +9 -116
- package/dist/components/DescriptionList.js +42 -0
- package/dist/components/Dropdown.js +349 -0
- package/dist/components/EmptyState.js +27 -0
- package/dist/components/Filter.js +32 -0
- package/dist/components/FilterPill.js +13 -0
- package/dist/components/IconButton.js +34 -0
- package/dist/{chunks/Indicator-hBSIxOPK.js → components/Indicator.js} +1 -1
- package/dist/components/Input.js +88 -0
- package/dist/components/LetterBadge.js +13 -0
- package/dist/components/Listbox.js +123 -0
- package/dist/{chunks/Loader-BXoXTZGc.js → components/Loader.js} +1 -1
- package/dist/components/Markdown.js +15 -0
- package/dist/components/MultiSelect.js +171 -0
- package/dist/components/Overview.js +39 -0
- package/dist/components/PageHeader.js +194 -0
- package/dist/components/Pagination.js +35 -0
- package/dist/{chunks/Provider-CDYurraE.js → components/Provider.js} +13 -5
- package/dist/{chunks/RequiredMark-DfLdYbYZ.js → components/RequiredMark.js} +1 -1
- package/dist/components/SectionHeader.js +11 -0
- package/dist/components/SettingModeOption.js +30 -0
- package/dist/components/SettingRow.js +35 -0
- package/dist/components/SettingsCard.js +31 -0
- package/dist/components/SettingsGroup.js +17 -0
- package/dist/components/Sort.js +42 -0
- package/dist/components/StatusBadge.js +63 -0
- package/dist/components/SwitchToggle.js +59 -0
- package/dist/{chunks/SwitchToggleSmall-FcsaYSTs.js → components/SwitchToggleSmall.js} +1 -1
- package/dist/{chunks/Table-DU2MW8xz.js → components/Table.js} +3 -3
- package/dist/components/Toggle.js +20 -0
- package/dist/{chunks/Tooltip-K5HJr4_p.js → components/Tooltip.js} +2 -27
- package/dist/{chunks/StatusBadge-C1Blx_cW.js → components/dropdownUtils.js} +2 -63
- package/dist/{chunks/focus-D_iZJTW1.js → components/focus.js} +1 -1
- package/dist/components/ghostButton.js +7 -0
- package/dist/components/inputClasses.js +4 -0
- package/dist/components/keys.js +27 -0
- package/dist/components/relativeTime.js +32 -0
- package/dist/{chunks/useCssIsDark-DHr05dG2.js → components/useCssIsDark.js} +1 -1
- package/dist/{chunks/duration-BOv8Phl8.js → duration.js} +1 -1
- package/dist/editor/Editor.js +13 -0
- package/dist/editor/EditorField.js +53 -0
- package/dist/editor/FormCodePanel.js +173 -0
- package/dist/{chunks/Monaco-DJ8MW-Dq.js → editor/Monaco.js} +5 -26
- package/dist/editor/index.js +6 -1
- package/dist/editor/themes.js +91 -0
- package/dist/editor/workers.d.ts +5 -0
- package/dist/editor/workers.js +35 -0
- package/dist/editor/yaml.d.ts +9 -1
- package/dist/editor/yaml.js +15 -0
- package/dist/editor/yaml.worker.d.ts +1 -0
- package/dist/editor/yamlLanguage.d.ts +6 -0
- package/dist/editor/yamlLanguage.js +312 -0
- package/dist/file-explorer/FileExplorer.js +1405 -0
- package/dist/file-explorer/FileExplorerContext.js +370 -0
- package/dist/{chunks/CodePreviewEditor-YqQBz1YL.js → file-explorer/FilePreview/CodePreviewEditor.js} +3 -2
- package/dist/file-explorer/FilePreview/Inline.js +45 -0
- package/dist/file-explorer/FilePreview/StreamedBadge.js +16 -0
- package/dist/file-explorer/FilePreview/Viewer.js +526 -0
- package/dist/file-explorer/FilePreview/index.js +266 -0
- package/dist/file-explorer/FilePreview/parse.js +63 -0
- package/dist/file-explorer/FilePreview/previewCache.js +98 -0
- package/dist/file-explorer/FilePreview/previewType.js +151 -0
- package/dist/file-explorer/FilePreview/readCappedBytes.js +196 -0
- package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +95 -0
- package/dist/file-explorer/FilePreview/useObjectText.js +109 -0
- package/dist/file-explorer/FilePreview/usePresignedUrl.js +73 -0
- package/dist/file-explorer/FileRow.js +165 -0
- package/dist/file-explorer/FileRowsWindow.js +92 -0
- package/dist/file-explorer/FileTable.js +172 -0
- package/dist/file-explorer/FileTableHeaders.js +49 -0
- package/dist/file-explorer/LoadMoreRow.js +46 -0
- package/dist/file-explorer/TreeView.js +376 -0
- package/dist/file-explorer/helpers.js +537 -0
- package/dist/file-explorer/index.js +7 -5671
- package/dist/file-explorer/lib/batch.js +39 -0
- package/dist/file-explorer/lib/errors.js +9 -0
- package/dist/file-explorer/lib/paging.js +124 -0
- package/dist/file-explorer/lib/utils.js +322 -0
- package/dist/file-explorer/toasts.js +400 -0
- package/dist/file-explorer/treeRows.js +73 -0
- package/dist/file-explorer/useNearEnd.js +27 -0
- package/dist/form/FieldWrapper.js +54 -0
- package/dist/form/Fields/BooleanField.js +51 -0
- package/dist/form/Fields/CheckboxGroupField.js +72 -0
- package/dist/form/Fields/ColorField.js +33 -0
- package/dist/form/Fields/DropdownField.js +49 -0
- package/dist/form/Fields/DurationField.js +130 -0
- package/dist/form/Fields/LabelField.js +19 -0
- package/dist/form/Fields/MultiDropdownField.js +40 -0
- package/dist/form/Fields/NumberField.js +51 -0
- package/dist/form/Fields/ObjectField.js +54 -0
- package/dist/form/Fields/RadioField.js +49 -0
- package/dist/form/Fields/RangeField.js +58 -0
- package/dist/form/Fields/ResourceOptionIcon.js +21 -0
- package/dist/form/Fields/StepField.js +6 -0
- package/dist/form/Fields/StringField.js +37 -0
- package/dist/form/Fields/TextAreaField.js +31 -0
- package/dist/form/Fields/durationValidity.js +11 -0
- package/dist/form/Form.js +643 -0
- package/dist/form/SpecialTypes/DropdownWrapper.js +30 -0
- package/dist/form/SpecialTypes/FormikCustomDropdown.js +122 -0
- package/dist/form/SpecialTypes/FormikCustomInput.js +111 -0
- package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +31 -0
- package/dist/form/SpecialTypes/FormikNumericInput.js +60 -0
- package/dist/form/Wizard/WizardContainer.js +138 -0
- package/dist/form/Wizard/WizardNavigation.js +92 -0
- package/dist/form/Wizard/WizardStepContent.js +35 -0
- package/dist/form/Wizard/WizardStepIndicator.js +108 -0
- package/dist/form/Wizard/useWizardState.js +118 -0
- package/dist/form/Wizard/utils.js +34 -0
- package/dist/form/fieldContext.js +26 -0
- package/dist/form/fieldRegistry.js +50 -0
- package/dist/form/index.js +17 -2321
- package/dist/{chunks/FieldWrapper-Cszwg-4B.js → form/lib.js} +2 -97
- package/dist/form/useParsedOpts.js +62 -0
- package/dist/form/usePrevious.js +11 -0
- package/dist/form/utils/checkShowIfObject.js +14 -0
- package/dist/form/utils/duration.js +69 -0
- package/dist/form/utils/getParentValue.js +23 -0
- package/dist/form/utils/getPlaceholder.js +9 -0
- package/dist/form/utils/getValueUsingPath.js +23 -0
- package/dist/form/utils/secondaryField.js +22 -0
- package/dist/graph/AnnotationBanner.js +141 -0
- package/dist/graph/Collapse.js +41 -0
- package/dist/graph/DependencyGraph.js +1398 -0
- package/dist/graph/JobSummary.js +104 -0
- package/dist/graph/MatrixGroup.js +107 -0
- package/dist/graph/Reveal.js +57 -0
- package/dist/graph/TreeView.js +711 -0
- package/dist/graph/index.js +1 -2519
- package/dist/graph/types.js +6 -0
- package/dist/icons.d.ts +4 -4
- package/dist/icons.js +5 -5
- package/dist/index.js +46 -599
- package/dist/list/ActionToolbar.js +184 -0
- package/dist/list/HoverCard.js +73 -0
- package/dist/list/ListPage.js +145 -0
- package/dist/list/ListPager.js +59 -0
- package/dist/list/ListTable.js +163 -0
- package/dist/list/ListViewControls.js +372 -0
- package/dist/list/RowContextMenu.js +351 -0
- package/dist/list/UserHoverCard.js +117 -0
- package/dist/list/index.js +11 -2
- package/dist/list/listSearch.js +137 -0
- package/dist/list/listView.js +210 -0
- package/dist/list/textEntry.js +10 -0
- package/dist/{chunks/logviewer-BTKuQWzw.js → logviewer/LogViewer.js} +4 -82
- package/dist/logviewer/index.js +2 -1
- package/dist/logviewer/segments.js +80 -0
- package/dist/safeUrl.d.ts +6 -0
- package/dist/safeUrl.js +22 -0
- package/package.json +7 -9
- package/dist/assets/editor.worker-BmHUIVG4.js +0 -14807
- package/dist/assets/json.worker-D8bJ92nw.js +0 -22207
- package/dist/assets/yaml.worker-C4gyGAko.js +0 -50201
- package/dist/chunks/PageHeader-0kG_iypP.js +0 -692
- package/dist/chunks/SwitchToggle-DShNdcao.js +0 -758
- package/dist/chunks/editor-Dk1rbV75.js +0 -361
- package/dist/chunks/list-CJm875m7.js +0 -1418
- /package/dist/{chunks/MarkdownImpl-CyeTVvSt.js → components/MarkdownImpl.js} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { useNotify, useStrings, useWorkflowEngine } from "../components/Provider.js";
|
|
2
|
+
import { CheckIcon, CopyIcon, EyeIcon, EyeOffIcon } from "../icons.js";
|
|
3
|
+
import SwitchToggleSmall from "../components/SwitchToggleSmall.js";
|
|
4
|
+
import Editor from "./Editor.js";
|
|
5
|
+
import { flattenGroups, impureSetValueFromPath } from "../form/lib.js";
|
|
6
|
+
import cx from "classnames";
|
|
7
|
+
import { useId, useRef, useState } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/editor/FormCodePanel.tsx
|
|
10
|
+
var isObject = (value) => typeof value === "object" && value !== null;
|
|
11
|
+
var shouldIgnoreField = (engine, fieldSchema, inputs, arrayIndex) => {
|
|
12
|
+
if (!fieldSchema?.["ignore"] || !fieldSchema?.["hidden"]) return false;
|
|
13
|
+
if (!engine.isReady()) return false;
|
|
14
|
+
return engine.evaluate({
|
|
15
|
+
inputs,
|
|
16
|
+
obj: engine.convertInputs(fieldSchema),
|
|
17
|
+
index: arrayIndex ?? -1
|
|
18
|
+
})["hidden"] === true;
|
|
19
|
+
};
|
|
20
|
+
var filterFields = (engine, formJSON, data, prefix, rootData, arrayIndex) => {
|
|
21
|
+
const filteredFields = [];
|
|
22
|
+
return {
|
|
23
|
+
filteredFields,
|
|
24
|
+
filtered: Object.keys(data).reduce((acc, key) => {
|
|
25
|
+
const value = data[key];
|
|
26
|
+
const fieldSchema = formJSON[key];
|
|
27
|
+
if (value !== null && Array.isArray(value)) {
|
|
28
|
+
const items = [];
|
|
29
|
+
acc[key] = items;
|
|
30
|
+
if (!fieldSchema) return acc;
|
|
31
|
+
const nestedSchema = isObject(fieldSchema) ? fieldSchema["options"] : void 0;
|
|
32
|
+
for (let i = 0; i < value.length; i++) {
|
|
33
|
+
let filteredFieldsNested = [];
|
|
34
|
+
let filteredNested = {};
|
|
35
|
+
const item = value[i];
|
|
36
|
+
if (isObject(item)) {
|
|
37
|
+
const result = filterFields(engine, isObject(nestedSchema) ? nestedSchema : {}, item, key + `[${i}].`, rootData || data, i);
|
|
38
|
+
filteredNested = result.filtered;
|
|
39
|
+
filteredFieldsNested = result.filteredFields;
|
|
40
|
+
} else filteredNested = item;
|
|
41
|
+
filteredFields.push(...filteredFieldsNested);
|
|
42
|
+
items[i] = filteredNested;
|
|
43
|
+
}
|
|
44
|
+
return acc;
|
|
45
|
+
}
|
|
46
|
+
if (fieldSchema && isObject(value)) {
|
|
47
|
+
const { filteredFields: filteredFieldsNested, filtered: filteredNested } = filterFields(engine, isObject(fieldSchema) ? fieldSchema : {}, value, key + ".", rootData || data, arrayIndex);
|
|
48
|
+
filteredFields.push(...filteredFieldsNested);
|
|
49
|
+
acc[key] = filteredNested;
|
|
50
|
+
return acc;
|
|
51
|
+
}
|
|
52
|
+
if (isObject(fieldSchema) && fieldSchema["sensitive"]) {
|
|
53
|
+
const name = prefix ? prefix + key : key;
|
|
54
|
+
filteredFields.push({
|
|
55
|
+
key: name,
|
|
56
|
+
value
|
|
57
|
+
});
|
|
58
|
+
return acc;
|
|
59
|
+
}
|
|
60
|
+
const contextData = rootData || data;
|
|
61
|
+
if (isObject(fieldSchema) && shouldIgnoreField(engine, fieldSchema, contextData, arrayIndex)) return acc;
|
|
62
|
+
acc[key] = value;
|
|
63
|
+
return acc;
|
|
64
|
+
}, {})
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
var populateFiltered = (filteredFields, data) => {
|
|
68
|
+
filteredFields.forEach((element) => {
|
|
69
|
+
impureSetValueFromPath(data, element.key, element.value);
|
|
70
|
+
});
|
|
71
|
+
return data;
|
|
72
|
+
};
|
|
73
|
+
function FormCodePanel({ formJSON, data, mutate, height = "600px", disabled = false }) {
|
|
74
|
+
const engine = useWorkflowEngine();
|
|
75
|
+
const notify = useNotify();
|
|
76
|
+
const { common: t } = useStrings();
|
|
77
|
+
const uid = useId();
|
|
78
|
+
const [jsonHasErrors, setJsonHasErrors] = useState(false);
|
|
79
|
+
const [showHidden, setShowHidden] = useState(false);
|
|
80
|
+
const [copied, setCopied] = useState(false);
|
|
81
|
+
const copyResetRef = useRef(void 0);
|
|
82
|
+
const isValidJson = (errors) => {
|
|
83
|
+
setJsonHasErrors(errors.length > 0);
|
|
84
|
+
};
|
|
85
|
+
const { filteredFields, filtered } = filterFields(engine, flattenGroups(formJSON), data || {});
|
|
86
|
+
const hasHiddenFields = filteredFields.length > 0;
|
|
87
|
+
const displayObj = showHidden && hasHiddenFields ? populateFiltered(filteredFields, structuredClone(filtered)) : filtered;
|
|
88
|
+
const showHiddenRef = useRef(showHidden);
|
|
89
|
+
showHiddenRef.current = showHidden;
|
|
90
|
+
const filteredFieldsRef = useRef(filteredFields);
|
|
91
|
+
filteredFieldsRef.current = filteredFields;
|
|
92
|
+
const json = JSON.stringify(displayObj, null, 2);
|
|
93
|
+
const handleCopy = async () => {
|
|
94
|
+
try {
|
|
95
|
+
await navigator.clipboard.writeText(json);
|
|
96
|
+
setCopied(true);
|
|
97
|
+
clearTimeout(copyResetRef.current);
|
|
98
|
+
copyResetRef.current = setTimeout(() => setCopied(false), 2e3);
|
|
99
|
+
} catch {
|
|
100
|
+
notify.error(t.copyFailed);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
104
|
+
style: { height },
|
|
105
|
+
className: "flex w-full flex-col gap-2",
|
|
106
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
107
|
+
className: cx("flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border", jsonHasErrors ? "border-red-500" : "border-(--theme-border)"),
|
|
108
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
109
|
+
className: "bg-(--theme-muted-panel-bg) text-(--theme-muted-panel-color) flex shrink-0 items-center gap-3 border-b border-(--theme-border) px-3 py-2",
|
|
110
|
+
children: [hasHiddenFields && /* @__PURE__ */ jsxs("label", {
|
|
111
|
+
htmlFor: `${uid}-show-hidden`,
|
|
112
|
+
title: t.showHiddenFieldsHint,
|
|
113
|
+
className: "flex cursor-pointer select-none items-center gap-2 text-sm text-(--theme-app)",
|
|
114
|
+
children: [/* @__PURE__ */ jsx(SwitchToggleSmall, {
|
|
115
|
+
id: `${uid}-show-hidden`,
|
|
116
|
+
value: showHidden,
|
|
117
|
+
"aria-label": t.showHiddenFields,
|
|
118
|
+
onClick: () => setShowHidden((prev) => !prev)
|
|
119
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
120
|
+
className: "flex items-center gap-1.5",
|
|
121
|
+
children: [showHidden ? /* @__PURE__ */ jsx(EyeIcon, {}) : /* @__PURE__ */ jsx(EyeOffIcon, {}), t.showHiddenFields]
|
|
122
|
+
})]
|
|
123
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
124
|
+
type: "button",
|
|
125
|
+
onClick: handleCopy,
|
|
126
|
+
"aria-label": copied ? t.copied : t.copy,
|
|
127
|
+
className: "ml-auto flex shrink-0 items-center gap-1.5 rounded-md border border-(--theme-border) px-2.5 py-1.5 text-sm text-(--theme-app) transition-colors duration-150 hover:bg-(--theme-hover) focus:outline-none focus-visible:ring-2 focus-visible:ring-(--theme-link)",
|
|
128
|
+
children: [copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-green-500" }) : /* @__PURE__ */ jsx(CopyIcon, { className: "text-(--theme-muted-text-color)" }), copied ? t.copied : t.copy]
|
|
129
|
+
})]
|
|
130
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
131
|
+
className: "min-h-0 flex-1",
|
|
132
|
+
children: /* @__PURE__ */ jsx(Editor, {
|
|
133
|
+
height: "100%",
|
|
134
|
+
value: json,
|
|
135
|
+
onValidate: isValidJson,
|
|
136
|
+
className: "!rounded-none !border-0",
|
|
137
|
+
minimap: { enabled: false },
|
|
138
|
+
scrollBeyondLastLine: false,
|
|
139
|
+
overviewRulerLanes: 0,
|
|
140
|
+
overviewRulerBorder: false,
|
|
141
|
+
lineNumbersMinChars: 3,
|
|
142
|
+
lineDecorationsWidth: 8,
|
|
143
|
+
renderLineHighlight: "none",
|
|
144
|
+
padding: {
|
|
145
|
+
top: 12,
|
|
146
|
+
bottom: 12
|
|
147
|
+
},
|
|
148
|
+
fontSize: 13,
|
|
149
|
+
scrollbar: {
|
|
150
|
+
verticalScrollbarSize: 10,
|
|
151
|
+
horizontalScrollbarSize: 10
|
|
152
|
+
},
|
|
153
|
+
onChange: (e) => {
|
|
154
|
+
try {
|
|
155
|
+
const parsed = JSON.parse(e);
|
|
156
|
+
if (!isObject(parsed)) return;
|
|
157
|
+
mutate(showHiddenRef.current ? parsed : populateFiltered(filteredFieldsRef.current, parsed));
|
|
158
|
+
} catch {
|
|
159
|
+
console.log("JSON.parse error in form code editor");
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
language: "json",
|
|
163
|
+
disabled
|
|
164
|
+
})
|
|
165
|
+
})]
|
|
166
|
+
}), jsonHasErrors && /* @__PURE__ */ jsx("p", {
|
|
167
|
+
className: "shrink-0 text-sm text-red-500",
|
|
168
|
+
children: t.jsonHasErrors
|
|
169
|
+
})]
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
173
|
+
export { FormCodePanel as default };
|
|
@@ -1,34 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useCssIsDark } from "../components/useCssIsDark.js";
|
|
2
|
+
import { defineEditorThemes, getThemeName } from "./themes.js";
|
|
3
|
+
import { setupMonacoWorkers } from "./workers.js";
|
|
4
|
+
import { ensureYamlLanguage } from "./yamlLanguage.js";
|
|
3
5
|
import cx from "classnames";
|
|
4
6
|
import { useEffect, useLayoutEffect, useRef } from "react";
|
|
5
7
|
import { jsx } from "react/jsx-runtime";
|
|
6
8
|
import * as monaco from "monaco-editor";
|
|
7
|
-
import { configureMonacoYaml } from "monaco-yaml";
|
|
8
9
|
//#region src/editor/Monaco.tsx
|
|
9
10
|
setupMonacoWorkers();
|
|
10
|
-
var monacoWithWorkerBridge = {
|
|
11
|
-
...monaco,
|
|
12
|
-
editor: {
|
|
13
|
-
...monaco.editor,
|
|
14
|
-
createWebWorker: (opts) => "worker" in opts ? monaco.editor.createWebWorker(opts) : monaco.createWebWorker(opts)
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var monacoYamlConfigured = false;
|
|
18
|
-
function ensureMonacoYamlConfigured() {
|
|
19
|
-
if (monacoYamlConfigured) return;
|
|
20
|
-
monacoYamlConfigured = true;
|
|
21
|
-
const options = (schemas) => ({
|
|
22
|
-
enableSchemaRequest: true,
|
|
23
|
-
completion: true,
|
|
24
|
-
validate: true,
|
|
25
|
-
hover: true,
|
|
26
|
-
format: { enable: true },
|
|
27
|
-
schemas
|
|
28
|
-
});
|
|
29
|
-
const monacoYaml = configureMonacoYaml(monacoWithWorkerBridge, options([]));
|
|
30
|
-
onYamlSchemas((schemas) => monacoYaml.update(options(schemas)));
|
|
31
|
-
}
|
|
32
11
|
function editorText(value) {
|
|
33
12
|
return value.replace(/\r/g, "");
|
|
34
13
|
}
|
|
@@ -100,7 +79,7 @@ function MonacoEditor({ className, disabled, onChange = noop, onValidate = noop,
|
|
|
100
79
|
model.onDidChangeDecorations(() => {
|
|
101
80
|
onValidate(monaco.editor.getModelMarkers({ resource: model.uri }));
|
|
102
81
|
});
|
|
103
|
-
|
|
82
|
+
ensureYamlLanguage();
|
|
104
83
|
monacoRef.current = editor;
|
|
105
84
|
}
|
|
106
85
|
}
|
package/dist/editor/index.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Editor from "./Editor.js";
|
|
2
|
+
import EditorField from "./EditorField.js";
|
|
3
|
+
import FormCodePanel from "./FormCodePanel.js";
|
|
4
|
+
import { defineEditorThemes, getThemeName } from "./themes.js";
|
|
5
|
+
import { setupMonacoWorkers } from "./workers.js";
|
|
6
|
+
import { configureEditorYaml } from "./yaml.js";
|
|
2
7
|
export { Editor, EditorField, FormCodePanel, configureEditorYaml, defineEditorThemes, getThemeName, setupMonacoWorkers };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
//#region src/editor/themes.ts
|
|
2
|
+
function expandShorthandHex(color) {
|
|
3
|
+
return /^#([0-9a-fA-F]{3,4})$/.test(color) ? "#" + color.slice(1).split("").map((c) => c + c).join("") : color;
|
|
4
|
+
}
|
|
5
|
+
function normalizeThemeColors(colors) {
|
|
6
|
+
return Object.fromEntries(Object.entries(colors).map(([key, value]) => [key, expandShorthandHex(value)]));
|
|
7
|
+
}
|
|
8
|
+
function themeVar(name, fallback) {
|
|
9
|
+
if (typeof window === "undefined") return fallback;
|
|
10
|
+
return getComputedStyle(document.documentElement).getPropertyValue(name).trim() || fallback;
|
|
11
|
+
}
|
|
12
|
+
function createEditorThemes() {
|
|
13
|
+
const dark = {
|
|
14
|
+
foreground: themeVar("--theme-app", "#e6edf3"),
|
|
15
|
+
background: themeVar("--theme-panel-bg", "#161b22"),
|
|
16
|
+
border: themeVar("--theme-border", "#30363d"),
|
|
17
|
+
lineHighlight: themeVar("--theme-muted-panel-bg", "#21262d"),
|
|
18
|
+
lineNumber: themeVar("--theme-muted-text-color", "#8b949e"),
|
|
19
|
+
selection: themeVar("--theme-element", "#2f81f7"),
|
|
20
|
+
selectionFg: themeVar("--theme-element-text", "#ffffff"),
|
|
21
|
+
disabledBg: themeVar("--theme-input-disabled-bg", "#1c2128"),
|
|
22
|
+
disabledFg: themeVar("--theme-muted-text-color", "#8b949e")
|
|
23
|
+
};
|
|
24
|
+
const light = {
|
|
25
|
+
disabledBg: themeVar("--theme-input-disabled-bg", "#f3f4f6"),
|
|
26
|
+
disabledFg: themeVar("--theme-muted-text-color", "#5f6b76"),
|
|
27
|
+
border: themeVar("--theme-border", "#d1d5db"),
|
|
28
|
+
selection: themeVar("--theme-element", "#2f81f7"),
|
|
29
|
+
selectionFg: themeVar("--theme-element-text", "#ffffff")
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
"app-dark": {
|
|
33
|
+
base: "vs-dark",
|
|
34
|
+
inherit: true,
|
|
35
|
+
rules: [],
|
|
36
|
+
colors: {
|
|
37
|
+
"editor.foreground": dark.foreground,
|
|
38
|
+
"editor.background": dark.background,
|
|
39
|
+
"editor.border": dark.border,
|
|
40
|
+
"editorCursor.foreground": dark.foreground,
|
|
41
|
+
"editor.lineHighlightBackground": dark.lineHighlight,
|
|
42
|
+
"editorLineNumber.foreground": dark.lineNumber,
|
|
43
|
+
"editor.selectionBackground": dark.selection,
|
|
44
|
+
"editor.selectionForeground": dark.selectionFg
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"app-dark-disabled": {
|
|
48
|
+
base: "vs-dark",
|
|
49
|
+
inherit: true,
|
|
50
|
+
rules: [],
|
|
51
|
+
colors: {
|
|
52
|
+
"editor.foreground": dark.disabledFg,
|
|
53
|
+
"editor.background": dark.disabledBg,
|
|
54
|
+
"editor.border": dark.border,
|
|
55
|
+
"editorCursor.foreground": "transparent",
|
|
56
|
+
"editor.lineHighlightBackground": dark.disabledBg,
|
|
57
|
+
"editorLineNumber.foreground": dark.disabledFg,
|
|
58
|
+
"editor.selectionBackground": dark.selection,
|
|
59
|
+
"editor.selectionForeground": dark.selectionFg
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"app-light-disabled": {
|
|
63
|
+
base: "vs",
|
|
64
|
+
inherit: true,
|
|
65
|
+
rules: [],
|
|
66
|
+
colors: {
|
|
67
|
+
"editor.foreground": light.disabledFg,
|
|
68
|
+
"editor.background": light.disabledBg,
|
|
69
|
+
"editor.border": light.border,
|
|
70
|
+
"editorCursor.foreground": "transparent",
|
|
71
|
+
"editor.lineHighlightBackground": light.disabledBg,
|
|
72
|
+
"editorLineNumber.foreground": light.disabledFg,
|
|
73
|
+
"editor.selectionBackground": light.selection,
|
|
74
|
+
"editor.selectionForeground": light.selectionFg
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function defineEditorThemes(monacoEditor) {
|
|
80
|
+
const themes = createEditorThemes();
|
|
81
|
+
for (const [name, themeData] of Object.entries(themes)) monacoEditor.defineTheme(name, {
|
|
82
|
+
...themeData,
|
|
83
|
+
colors: normalizeThemeColors(themeData.colors)
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function getThemeName(isDark, disabled) {
|
|
87
|
+
if (isDark) return disabled ? "app-dark-disabled" : "app-dark";
|
|
88
|
+
return disabled ? "app-light-disabled" : "vs";
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { defineEditorThemes, expandShorthandHex, getThemeName };
|
package/dist/editor/workers.d.ts
CHANGED
|
@@ -4,3 +4,8 @@
|
|
|
4
4
|
* calls this on first load only when nothing is configured.
|
|
5
5
|
*/
|
|
6
6
|
export declare function setupMonacoWorkers(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Starts the YAML language server. It is not a Monaco worker, so a host's own
|
|
9
|
+
* MonacoEnvironment never has to provide it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createYamlWorker(): Worker;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/editor/workers.ts
|
|
2
|
+
var monacoEnvironment = { getWorker(_moduleId, label) {
|
|
3
|
+
if (label === "json") return new Worker(new URL(
|
|
4
|
+
/* @vite-ignore */
|
|
5
|
+
new URL("../assets/json.worker-Dqgjpq9F.js", import.meta.url).href,
|
|
6
|
+
"" + import.meta.url
|
|
7
|
+
), { type: "module" });
|
|
8
|
+
return new Worker(new URL(
|
|
9
|
+
/* @vite-ignore */
|
|
10
|
+
new URL("../assets/editor.worker-DfmPPyOL.js", import.meta.url).href,
|
|
11
|
+
"" + import.meta.url
|
|
12
|
+
), { type: "module" });
|
|
13
|
+
} };
|
|
14
|
+
/**
|
|
15
|
+
* Points window.MonacoEnvironment at the bundled workers. Idempotent, and a
|
|
16
|
+
* host that already configured its own MonacoEnvironment wins — the editor
|
|
17
|
+
* calls this on first load only when nothing is configured.
|
|
18
|
+
*/
|
|
19
|
+
function setupMonacoWorkers() {
|
|
20
|
+
if (window.MonacoEnvironment) return;
|
|
21
|
+
window.MonacoEnvironment = monacoEnvironment;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Starts the YAML language server. It is not a Monaco worker, so a host's own
|
|
25
|
+
* MonacoEnvironment never has to provide it.
|
|
26
|
+
*/
|
|
27
|
+
function createYamlWorker() {
|
|
28
|
+
return new Worker(new URL(
|
|
29
|
+
/* @vite-ignore */
|
|
30
|
+
new URL("../assets/yaml.worker-DLx0whrM.js", import.meta.url).href,
|
|
31
|
+
"" + import.meta.url
|
|
32
|
+
), { type: "module" });
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { createYamlWorker, setupMonacoWorkers };
|
package/dist/editor/yaml.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/** A JSON schema for the YAML models whose URI matches one of `fileMatch`. */
|
|
2
|
+
export interface SchemasSettings {
|
|
3
|
+
/** Identifies the schema; fetched from here when `schema` is not given. */
|
|
4
|
+
uri: string;
|
|
5
|
+
/** Globs matched against model URIs, such as `**\/workflow.yaml`. */
|
|
6
|
+
fileMatch?: string[];
|
|
7
|
+
/** The schema itself, used instead of fetching `uri`. */
|
|
8
|
+
schema?: object;
|
|
9
|
+
}
|
|
2
10
|
/** Adds JSON schemas that validate and complete YAML models whose URI matches. */
|
|
3
11
|
export declare function configureEditorYaml(added: SchemasSettings[]): void;
|
|
4
12
|
/** Lets the loaded editor pick up schemas added before or after it loads. */
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/editor/yaml.ts
|
|
2
|
+
var schemas = [];
|
|
3
|
+
var apply;
|
|
4
|
+
/** Adds JSON schemas that validate and complete YAML models whose URI matches. */
|
|
5
|
+
function configureEditorYaml(added) {
|
|
6
|
+
schemas = [...schemas, ...added];
|
|
7
|
+
apply?.(schemas);
|
|
8
|
+
}
|
|
9
|
+
/** Lets the loaded editor pick up schemas added before or after it loads. */
|
|
10
|
+
function onYamlSchemas(listener) {
|
|
11
|
+
apply = listener;
|
|
12
|
+
listener(schemas);
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { configureEditorYaml, onYamlSchemas };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'yaml-language-server/lib/esm/webworker/yamlServerMain';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starts the YAML language server and connects every yaml model to it. Runs
|
|
3
|
+
* once per page and is never torn down: a per-editor lifecycle let navigation
|
|
4
|
+
* stop the service, killing suggestions until reload.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensureYamlLanguage(): void;
|