@alpaca-headless/alpaca-headless-nextjs 1.0.21 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/cjs/components/Error.js +15 -0
  2. package/dist/cjs/components/Link.js +5 -0
  3. package/dist/cjs/components/Picture.js +3 -0
  4. package/dist/cjs/components/PictureEditor.js +32 -6
  5. package/dist/cjs/components/Placeholder.js +9 -2
  6. package/dist/cjs/components/RichText.js +4 -1
  7. package/dist/cjs/components/RichTextEditor.js +1 -4
  8. package/dist/cjs/components/Text.js +3 -2
  9. package/dist/cjs/components/TextEditor.js +1 -4
  10. package/dist/cjs/editor/AiTerminal.js +2 -2
  11. package/dist/cjs/editor/ComponentPalette.js +20 -19
  12. package/dist/cjs/editor/EditorClient.js +32 -8
  13. package/dist/cjs/editor/FieldList.js +10 -5
  14. package/dist/cjs/editor/GraphQL.js +1 -2
  15. package/dist/cjs/editor/MediaSelector.js +16 -10
  16. package/dist/editor.css +42 -13
  17. package/dist/esm/components/Error.js +10 -0
  18. package/dist/esm/components/Link.js +5 -0
  19. package/dist/esm/components/Picture.js +3 -0
  20. package/dist/esm/components/PictureEditor.js +33 -7
  21. package/dist/esm/components/Placeholder.js +9 -2
  22. package/dist/esm/components/RichText.js +4 -1
  23. package/dist/esm/components/RichTextEditor.js +1 -4
  24. package/dist/esm/components/Text.js +3 -2
  25. package/dist/esm/components/TextEditor.js +1 -4
  26. package/dist/esm/editor/AiTerminal.js +2 -2
  27. package/dist/esm/editor/ComponentPalette.js +21 -20
  28. package/dist/esm/editor/EditorClient.js +32 -8
  29. package/dist/esm/editor/FieldList.js +10 -5
  30. package/dist/esm/editor/GraphQL.js +1 -2
  31. package/dist/esm/editor/MediaSelector.js +16 -10
  32. package/dist/primereact/resources/primereact.css +3 -6301
  33. package/dist/primereact/resources/primereact.min.css +3 -1
  34. package/dist/primereact/resources/themes/arya-blue/theme.css +5554 -5814
  35. package/dist/primereact/resources/themes/arya-green/theme.css +5554 -5814
  36. package/dist/primereact/resources/themes/arya-orange/theme.css +5554 -5814
  37. package/dist/primereact/resources/themes/arya-purple/theme.css +5554 -5814
  38. package/dist/primereact/resources/themes/bootstrap4-dark-blue/theme.css +5555 -5816
  39. package/dist/primereact/resources/themes/bootstrap4-dark-purple/theme.css +5555 -5816
  40. package/dist/primereact/resources/themes/bootstrap4-light-blue/theme.css +5539 -5800
  41. package/dist/primereact/resources/themes/bootstrap4-light-purple/theme.css +5539 -5800
  42. package/dist/primereact/resources/themes/fluent-light/theme.css +5662 -5922
  43. package/dist/primereact/resources/themes/lara-dark-blue/fonts/Inter-italic.var.woff2 +0 -0
  44. package/dist/primereact/resources/themes/lara-dark-blue/fonts/Inter-roman.var.woff2 +0 -0
  45. package/dist/primereact/resources/themes/lara-dark-blue/theme.css +5568 -5809
  46. package/dist/primereact/resources/themes/lara-dark-indigo/fonts/Inter-italic.var.woff2 +0 -0
  47. package/dist/primereact/resources/themes/lara-dark-indigo/fonts/Inter-roman.var.woff2 +0 -0
  48. package/dist/primereact/resources/themes/lara-dark-indigo/theme.css +5572 -5813
  49. package/dist/primereact/resources/themes/lara-dark-purple/fonts/Inter-italic.var.woff2 +0 -0
  50. package/dist/primereact/resources/themes/lara-dark-purple/fonts/Inter-roman.var.woff2 +0 -0
  51. package/dist/primereact/resources/themes/lara-dark-purple/theme.css +5572 -5813
  52. package/dist/primereact/resources/themes/lara-dark-teal/fonts/Inter-italic.var.woff2 +0 -0
  53. package/dist/primereact/resources/themes/lara-dark-teal/fonts/Inter-roman.var.woff2 +0 -0
  54. package/dist/primereact/resources/themes/lara-dark-teal/theme.css +5572 -5813
  55. package/dist/primereact/resources/themes/lara-light-blue/fonts/Inter-italic.var.woff2 +0 -0
  56. package/dist/primereact/resources/themes/lara-light-blue/fonts/Inter-roman.var.woff2 +0 -0
  57. package/dist/primereact/resources/themes/lara-light-blue/theme.css +5567 -5808
  58. package/dist/primereact/resources/themes/lara-light-indigo/fonts/Inter-italic.var.woff2 +0 -0
  59. package/dist/primereact/resources/themes/lara-light-indigo/fonts/Inter-roman.var.woff2 +0 -0
  60. package/dist/primereact/resources/themes/lara-light-indigo/theme.css +5562 -5803
  61. package/dist/primereact/resources/themes/lara-light-purple/fonts/Inter-italic.var.woff2 +0 -0
  62. package/dist/primereact/resources/themes/lara-light-purple/fonts/Inter-roman.var.woff2 +0 -0
  63. package/dist/primereact/resources/themes/lara-light-purple/theme.css +5562 -5803
  64. package/dist/primereact/resources/themes/lara-light-teal/fonts/Inter-italic.var.woff2 +0 -0
  65. package/dist/primereact/resources/themes/lara-light-teal/fonts/Inter-roman.var.woff2 +0 -0
  66. package/dist/primereact/resources/themes/lara-light-teal/theme.css +5562 -5803
  67. package/dist/primereact/resources/themes/luna-amber/theme.css +5508 -5770
  68. package/dist/primereact/resources/themes/luna-blue/theme.css +5508 -5770
  69. package/dist/primereact/resources/themes/luna-green/theme.css +5508 -5770
  70. package/dist/primereact/resources/themes/luna-pink/theme.css +5508 -5770
  71. package/dist/primereact/resources/themes/md-dark-deeppurple/theme.css +6906 -7209
  72. package/dist/primereact/resources/themes/md-dark-indigo/theme.css +6905 -7208
  73. package/dist/primereact/resources/themes/md-light-deeppurple/theme.css +6905 -7208
  74. package/dist/primereact/resources/themes/md-light-indigo/theme.css +6905 -7208
  75. package/dist/primereact/resources/themes/mdc-dark-deeppurple/theme.css +6907 -7210
  76. package/dist/primereact/resources/themes/mdc-dark-indigo/theme.css +6904 -7207
  77. package/dist/primereact/resources/themes/mdc-light-deeppurple/theme.css +6905 -7208
  78. package/dist/primereact/resources/themes/mdc-light-indigo/theme.css +6905 -7208
  79. package/dist/primereact/resources/themes/mira/theme.css +5723 -5979
  80. package/dist/primereact/resources/themes/nano/theme.css +5544 -5805
  81. package/dist/primereact/resources/themes/nova/theme.css +5497 -5758
  82. package/dist/primereact/resources/themes/nova-accent/theme.css +5529 -5790
  83. package/dist/primereact/resources/themes/nova-alt/theme.css +5514 -5775
  84. package/dist/primereact/resources/themes/rhea/theme.css +5526 -5787
  85. package/dist/primereact/resources/themes/saga-blue/theme.css +5554 -5814
  86. package/dist/primereact/resources/themes/saga-green/theme.css +5554 -5814
  87. package/dist/primereact/resources/themes/saga-orange/theme.css +5554 -5814
  88. package/dist/primereact/resources/themes/saga-purple/theme.css +5559 -5819
  89. package/dist/primereact/resources/themes/soho-dark/theme.css +5513 -5770
  90. package/dist/primereact/resources/themes/soho-light/theme.css +5565 -5822
  91. package/dist/primereact/resources/themes/tailwind-light/theme.css +5613 -5868
  92. package/dist/primereact/resources/themes/vela-blue/theme.css +5556 -5816
  93. package/dist/primereact/resources/themes/vela-green/theme.css +5556 -5816
  94. package/dist/primereact/resources/themes/vela-orange/theme.css +5556 -5816
  95. package/dist/primereact/resources/themes/vela-purple/theme.css +5556 -5816
  96. package/dist/primereact/resources/themes/viva-dark/theme.css +5669 -5925
  97. package/dist/primereact/resources/themes/viva-light/theme.css +5668 -5924
  98. package/package.json +3 -2
  99. package/types/components/Error.d.ts +2 -0
  100. package/types/components/RichTextEditor.d.ts +1 -1
  101. package/types/components/TextEditor.d.ts +1 -1
  102. package/types/editor/AiTerminal.d.ts +1 -1
  103. package/types/editor/editContext.d.ts +2 -0
  104. package/types/fieldTypes.d.ts +2 -2
  105. package/types/layoutData.d.ts +1 -0
  106. package/dist/primereact/resources/images/color.png +0 -0
  107. package/dist/primereact/resources/images/hue.png +0 -0
@@ -11,11 +11,12 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
- import { useState } from "react";
14
+ import { useEffect, useState } from "react";
15
15
  import { Picture } from "./Picture";
16
16
  import { useEditContext } from "..";
17
17
  import { MediaSelector } from "../editor/MediaSelector";
18
18
  import { Dialog } from "primereact/dialog";
19
+ import { Button } from "primereact/button";
19
20
  export const PictureEditor = (_a) => {
20
21
  var _b, _c;
21
22
  var { field, imageParams, sources, defaultVariant, renderJsonLinkedData } = _a, otherProps = __rest(_a, ["field", "imageParams", "sources", "defaultVariant", "renderJsonLinkedData"]);
@@ -26,13 +27,38 @@ export const PictureEditor = (_a) => {
26
27
  if (!editContext)
27
28
  return;
28
29
  function imageSelected(imageId) {
29
- const value = (field === null || field === void 0 ? void 0 : field.value) || {};
30
- //value.variants[0].mediaId = imageId;
30
+ if (!selectedVariant)
31
+ return;
32
+ const value = (field === null || field === void 0 ? void 0 : field.rawValue)
33
+ ? JSON.parse(field === null || field === void 0 ? void 0 : field.rawValue)
34
+ : { variants: [] };
35
+ const selected = value.variants.find((x) => x.name == selectedVariant.name);
36
+ if (!selected) {
37
+ value.variants.push({
38
+ name: selectedVariant.name,
39
+ mediaId: imageId,
40
+ });
41
+ }
42
+ else {
43
+ selected.mediaId = imageId;
44
+ }
31
45
  console.log(imageId);
32
- if (field)
46
+ console.log(JSON.stringify(value));
47
+ if (field) {
33
48
  editContext === null || editContext === void 0 ? void 0 : editContext.editField(field, JSON.stringify(value), false);
49
+ editContext === null || editContext === void 0 ? void 0 : editContext.requestRefresh("immediate");
50
+ }
34
51
  }
35
- console.log(JSON.stringify(field));
36
- return (_jsxs(_Fragment, { children: [_jsx(MediaSelector, { visible: mediaSelectorVisible, onHide: () => setMediaSelectorVisible(false), onMediaSelected: imageSelected }), _jsx(Dialog, { header: "Edit picture", visible: editorVisible, style: { width: "50vw" }, onHide: () => setEditorVisible(false), children: _jsx("div", { className: "a-flex a-gap-1", children: (_c = (_b = field === null || field === void 0 ? void 0 : field.value) === null || _b === void 0 ? void 0 : _b.variants) === null || _c === void 0 ? void 0 : _c.map((variant) => (_jsxs("div", { onClick: () => setSelectedVariant(variant), children: [_jsxs("div", { className: "a-h-24 a-w-24 a-border a-relative" +
37
- (selectedVariant == variant ? " a-shadow-xl " : ""), children: [variant.src && _jsx("img", { src: variant.src }), _jsx("div", { className: "a-absolute a-top-0 a-right-0 ", children: _jsx("i", { className: "pi pi-pencil a-m-1 a-cursor-pointer", onClick: () => setMediaSelectorVisible(true) }) })] }, variant.name), _jsx("div", { children: variant.name }), _jsx("div", { children: variant.aspectRatioText })] }))) }) }), _jsxs("span", Object.assign({}, otherProps, { onClick: () => setEditorVisible(true), children: ["PICTURE", _jsx(Picture, { field: field, imageParams: imageParams, sources: sources })] }))] }));
52
+ useEffect(() => {
53
+ var _a;
54
+ setSelectedVariant((_a = field === null || field === void 0 ? void 0 : field.value) === null || _a === void 0 ? void 0 : _a.variants[0]);
55
+ }, []);
56
+ console.log("Picture Field: " + JSON.stringify(field));
57
+ return (_jsxs(_Fragment, { children: [_jsx(MediaSelector, { visible: mediaSelectorVisible, onHide: () => setMediaSelectorVisible(false), onMediaSelected: imageSelected }), _jsx(Dialog, { header: "Edit picture", visible: editorVisible, style: { width: "50vw", height: "50vh" }, onHide: () => setEditorVisible(false), children: _jsxs("div", { className: "a-flex a-gap-1 a-flex-col a-justify a-h-full", children: [_jsxs("div", { className: "a-flex-1 a-flex a-gap-1", children: [_jsx("div", { className: "a-flex a-flex-col a-gap-1 a-h-full a-border-r", children: (_c = (_b = field === null || field === void 0 ? void 0 : field.value) === null || _b === void 0 ? void 0 : _b.variants) === null || _c === void 0 ? void 0 : _c.map((variant) => (_jsxs("div", { onClick: () => setSelectedVariant(variant), children: [_jsxs("div", { className: "a-h-24 a-w-24 a-border a-relative" +
58
+ (selectedVariant == variant ? " a-shadow-xl " : ""), children: [variant.src && _jsx("img", { src: variant.thumbSrc }), _jsx("div", { className: "a-absolute a-top-0 a-right-0 ", children: _jsx("i", { className: "pi pi-pencil a-m-1 a-cursor-pointer", onClick: () => setMediaSelectorVisible(true) }) })] }, variant.name), _jsx("div", { children: variant.name }), _jsx("div", { children: variant.aspectRatioText })] }))) }), _jsx("div", { className: "a-flex-1 a-relative", children: _jsx("div", { className: "a-absolute a-inset-0 a-overflow-auto", children: selectedVariant && _jsx("img", { src: selectedVariant.src }) }) })] }), _jsxs("div", { className: "a-flex a-justify-end a-gap-3 a-mt-3", children: [_jsx(Button, { onClick: () => {
59
+ setEditorVisible(false);
60
+ }, children: "Ok" }), _jsx(Button, { onClick: () => {
61
+ setEditorVisible(false);
62
+ editContext === null || editContext === void 0 ? void 0 : editContext.requestRefresh("immediate");
63
+ }, children: "Cancel" })] })] }) }), _jsx("span", Object.assign({}, otherProps, { onClick: () => setEditorVisible(true), className: "a-cursor-pointer", children: _jsx(Picture, { field: field, imageParams: imageParams, sources: sources }) }))] }));
38
64
  };
@@ -12,6 +12,8 @@ import { EditFrame } from "../editor/EditFrame";
12
12
  import { useAlpacaContext, } from "..";
13
13
  import { PlaceholderDropZoneHost } from "../editor/PlaceholderDropZoneHost";
14
14
  import Slot from "./Slot";
15
+ import { ErrorBoundary } from "react-error-boundary";
16
+ import { ErrorFallbackWithDetails, ErrorFallback } from "./Error";
15
17
  export function Placeholder({ name, content, }) {
16
18
  return __awaiter(this, void 0, void 0, function* () {
17
19
  const data = yield content;
@@ -44,11 +46,16 @@ export function Placeholder({ name, content, }) {
44
46
  const components = yield Promise.all(promises);
45
47
  if (context.pageContext.pageEditing) {
46
48
  return (_jsxs(_Fragment, { children: [components.map(({ Component, data, parent }, index) => {
47
- return (_jsxs(_Fragment, { children: [_jsx(PlaceholderDropZoneHost, { parentName: parent === null || parent === void 0 ? void 0 : parent.name, placeholder: placeholderData, index: index + 1 }), _jsx(EditFrame, { componentId: data.id, children: _jsx(Component, { component: data }) }, data.id)] }));
49
+ try {
50
+ return (_jsxs(_Fragment, { children: [_jsx(PlaceholderDropZoneHost, { parentName: parent === null || parent === void 0 ? void 0 : parent.name, placeholder: placeholderData, index: index + 1 }), _jsx(EditFrame, { componentId: data.id, children: _jsx(ErrorBoundary, { FallbackComponent: ErrorFallbackWithDetails, children: _jsx(Component, { component: data }) }) }, data.id)] }));
51
+ }
52
+ catch (e) {
53
+ return (_jsxs("div", { children: ["Error rendering component ", data.name, ": ", e.message] }));
54
+ }
48
55
  }), _jsx(PlaceholderDropZoneHost, { parentName: data === null || data === void 0 ? void 0 : data.name, placeholder: placeholderData, index: components.length + 1 })] }));
49
56
  }
50
57
  else
51
- return (_jsx(_Fragment, { children: components.map(({ Component, data }) => (_jsx(_Fragment, { children: _jsx(Component, { component: data }) }))) }));
58
+ return (_jsx(_Fragment, { children: components.map(({ Component, data }) => (_jsx(_Fragment, { children: _jsx(ErrorBoundary, { FallbackComponent: ErrorFallback, children: _jsx(Component, { component: data }) }) }))) }));
52
59
  });
53
60
  }
54
61
  function ComponentNotFound({ component }) {
@@ -27,9 +27,12 @@ export function RichText(_a) {
27
27
  return __awaiter(this, void 0, void 0, function* () {
28
28
  if (!field)
29
29
  return;
30
+ if (field.jsonValue) {
31
+ field = field.jsonValue;
32
+ }
30
33
  const internalProps = Object.assign(Object.assign({}, props), { dangerouslySetInnerHTML: {
31
34
  __html: field.value,
32
- }, editable: editable, contentEditable: true, "data-test": "test", placeholder: '[' + field.name + ']' });
35
+ }, editable: editable, contentEditable: true, "data-test": "test", placeholder: "[" + field.name + "]" });
33
36
  if (useAlpacaContext().pageContext.pageEditing)
34
37
  return _jsx(RichTextEditor, Object.assign({ field: field, tag: tag }, props));
35
38
  return React.createElement(tag || "div", Object.assign(props, internalProps));
@@ -20,10 +20,7 @@ export function RichTextEditor(_a) {
20
20
  if (!editContext)
21
21
  return;
22
22
  const { updateContentEditingFields } = editContext;
23
- const component = editContext.getComponentById(field.itemId);
24
- if (!component)
25
- return;
26
- const liveField = Object.values(component.fields).find((f) => f.id == field.id);
23
+ const liveField = editContext.getLiveField(field);
27
24
  useEffect(() => {
28
25
  if (editedValue != liveField.value &&
29
26
  "<p>" + editedValue + "</p>" != liveField.value) {
@@ -30,8 +30,9 @@ export function Text(_a) {
30
30
  if (field.jsonValue) {
31
31
  field = field.jsonValue;
32
32
  }
33
- if (useAlpacaContext().pageContext.pageEditing)
34
- return _jsx(TextEditor, Object.assign({ field: field, tag: tag }, props));
33
+ if (useAlpacaContext().pageContext.pageEditing) {
34
+ return (_jsx("div", { children: _jsx(TextEditor, Object.assign({ field: field, tag: tag }, props)) }));
35
+ }
35
36
  else
36
37
  return React.createElement(tag || "div", props, field.value);
37
38
  });
@@ -20,10 +20,7 @@ export function TextEditor(_a) {
20
20
  if (!editContext)
21
21
  return;
22
22
  const { updateContentEditingFields } = editContext;
23
- const component = editContext.getComponentById(field.itemId);
24
- if (!component)
25
- return;
26
- const liveField = Object.values(component.fields).find((f) => f.id == field.id);
23
+ const liveField = editContext.getLiveField(field);
27
24
  useEffect(() => {
28
25
  if (editedValue != liveField.value)
29
26
  setValue(liveField.value);
@@ -42,7 +42,7 @@ export function AiTerminal({ requestRefresh, selection, }) {
42
42
  handleResponse(response, callback, false);
43
43
  if (response.editOperations.length) {
44
44
  if (new Date().getTime() - lastRefresh > 500) {
45
- requestRefresh(false);
45
+ requestRefresh("delayed");
46
46
  router.refresh();
47
47
  lastRefresh = new Date().getTime();
48
48
  }
@@ -83,7 +83,7 @@ export function AiTerminal({ requestRefresh, selection, }) {
83
83
  TerminalService.off("command", commandHandler);
84
84
  };
85
85
  }, []);
86
- return (_jsxs("div", { className: "a-h-full a-flex a-flex-col a-relative", children: [_jsx("div", { className: "a-flex-1 a-relative", children: _jsx("div", { className: "a-inset-0 a-absolute", children: _jsx(Terminal, { onReset: () => setMessages([]), commandHandler: (v, callback) => {
86
+ return (_jsxs("div", { className: "a-h-full a-flex a-flex-col a-relative a-flex-1", children: [_jsx("div", { className: "a-flex-1 a-relative", children: _jsx("div", { className: "a-inset-0 a-absolute", children: _jsx(Terminal, { onReset: () => setMessages([]), commandHandler: (v, callback) => {
87
87
  commandHandler(v, callback);
88
88
  } }) }) }), _jsxs("div", { className: "a-text-xs", children: ["Tokens in: ", tokens.in, " out: ", tokens.out] })] }));
89
89
  }
@@ -1,4 +1,5 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { TabPanel, TabView } from "primereact/tabview";
2
3
  import { useEditContext } from "..";
3
4
  import ContentTree from "./ContentTree";
4
5
  export function ComponentPalette({ selection, page, dragStart, dragEnd, }) {
@@ -28,25 +29,25 @@ export function ComponentPalette({ selection, page, dragStart, dragEnd, }) {
28
29
  // editContext!.droppedInPlaceholder(key, parseInt(index));
29
30
  // }
30
31
  // }
31
- return (_jsxs(_Fragment, { children: [_jsx("h2", { className: "a-text-xl a-font-bold a-mb-8", children: "New" }), _jsx("div", { className: "a-grid a-grid-cols-4 a-gap-1", children: insertOptions.map((option) => {
32
- function handleDragStart(event) {
33
- dragStart({ type: "template", templateId: option.id });
34
- event.stopPropagation();
35
- }
36
- function handleDragEnd() {
37
- dragEnd();
38
- }
39
- return (_jsxs("div", {
40
- // onClick={directInsert}
41
- draggable: true, onDragStart: handleDragStart, onDragEnd: handleDragEnd, className: "a-p-3 a-shadow-md a-flex a-items-center a-flex-col a-gap-1 a-cursor-grab", children: [_jsx("img", { src: option.icon, width: "32", height: "32" }), option.name] }, option.id));
42
- }) }), _jsx("h2", { className: "a-text-xl a-font-bold a-my-8", children: "Existing" }), _jsx(ContentTree, { rootItemId: "0DE95AE4-41AB-4D01-9EB0-67441B7C2450", dragStart: (itemNode) => {
43
- dragStart({
44
- type: "link-component",
45
- templateId: itemNode.templateId,
46
- componentId: itemNode.id,
47
- });
48
- }, expandIdPath: page.idPath, dragEnd: dragEnd, isDraggable: (x) => x.isComponent &&
49
- (insertOptions === null || insertOptions === void 0 ? void 0 : insertOptions.find((insertOption) => insertOption.id == x.templateId)) != undefined })] }));
32
+ return (_jsxs(TabView, { children: [_jsx(TabPanel, { header: "New", children: _jsx("div", { className: "a-grid a-grid-cols-4 a-gap-1", children: insertOptions.map((option) => {
33
+ function handleDragStart(event) {
34
+ dragStart({ type: "template", templateId: option.id });
35
+ event.stopPropagation();
36
+ }
37
+ function handleDragEnd() {
38
+ dragEnd();
39
+ }
40
+ return (_jsxs("div", {
41
+ // onClick={directInsert}
42
+ draggable: true, onDragStart: handleDragStart, onDragEnd: handleDragEnd, className: "a-p-3 a-shadow-md a-flex a-items-center a-flex-col a-gap-1 a-cursor-grab", children: [_jsx("img", { src: option.icon, width: "32", height: "32" }), option.name] }, option.id));
43
+ }) }) }), _jsx(TabPanel, { header: "Existing", children: _jsx(ContentTree, { rootItemId: "0DE95AE4-41AB-4D01-9EB0-67441B7C2450", dragStart: (itemNode) => {
44
+ dragStart({
45
+ type: "link-component",
46
+ templateId: itemNode.templateId,
47
+ componentId: itemNode.id,
48
+ });
49
+ }, expandIdPath: page.idPath, dragEnd: dragEnd, isDraggable: (x) => x.isComponent &&
50
+ (insertOptions === null || insertOptions === void 0 ? void 0 : insertOptions.find((insertOption) => insertOption.id == x.templateId)) != undefined }) })] }));
50
51
  }
51
52
  function collectInsertOptions(page, placeholderKeys) {
52
53
  const insertOptionsMap = new Map();
@@ -74,6 +74,7 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
74
74
  const searchParams = useSearchParams();
75
75
  const [selection, setSelection] = useState([]);
76
76
  const [selectedForInsertion, setSelectedForInsertion] = useState("");
77
+ const [liveUpdatingFields, setLiveUpdatingFields] = useState([]);
77
78
  const [currentEditOperation, setCurrentEditOperation] = useState();
78
79
  const [dictionary, setDictionary] = useState(dictionaryObject);
79
80
  const [unresolvedDictionaryKeys, setUnresolvedDictionaryKeys] = useState([]);
@@ -141,23 +142,33 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
141
142
  setSelection([result.componentId]);
142
143
  }
143
144
  if (!currentEditOperation.noRefresh)
144
- requestRefresh(currentEditOperation.refreshAfterQuietPeriod);
145
+ requestRefresh(currentEditOperation.refreshAfterQuietPeriod
146
+ ? "waitForQuietPeriod"
147
+ : "delayed");
145
148
  }
146
149
  });
147
150
  sync();
148
151
  }, [currentEditOperation]);
149
- const requestRefresh = (waitForQuietPeriod) => {
150
- console.log("request refresh with " + waitForQuietPeriod);
151
- if (waitForQuietPeriod && refreshTimer) {
152
+ const requestRefresh = (mode) => {
153
+ if (mode === "immediate") {
154
+ console.log("Immediate refresh requested");
155
+ clearTimeout(refreshTimer);
156
+ router.refresh();
157
+ setRefreshCompletedFlag(!refreshCompletedFlag);
158
+ setRefreshTimer(undefined);
159
+ return;
160
+ }
161
+ console.log("request refresh with mode: " + mode);
162
+ if (mode === "waitForQuietPeriod" && refreshTimer) {
152
163
  clearTimeout(refreshTimer);
153
164
  }
154
- if (!refreshTimer || waitForQuietPeriod) {
165
+ if (!refreshTimer || mode === "waitForQuietPeriod") {
155
166
  setRefreshTimer(setTimeout(() => {
156
167
  console.log("refreshing");
157
168
  router.refresh();
158
169
  setRefreshCompletedFlag(!refreshCompletedFlag);
159
170
  setRefreshTimer(undefined);
160
- }, waitForQuietPeriod ? 2000 : 1000));
171
+ }, mode === "waitForQuietPeriod" ? 2000 : 1000));
161
172
  }
162
173
  };
163
174
  const saveAndRefresh = (callback) => __awaiter(this, void 0, void 0, function* () {
@@ -262,6 +273,16 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
262
273
  }
263
274
  });
264
275
  }
276
+ const getLiveField = (field) => {
277
+ const existingField = liveUpdatingFields.find((f) => f.id === field.id &&
278
+ f.language === field.language &&
279
+ f.version === field.version &&
280
+ f.itemId === field.itemId);
281
+ if (existingField)
282
+ return existingField;
283
+ setLiveUpdatingFields([...liveUpdatingFields, field]);
284
+ return field;
285
+ };
265
286
  const selectedComponent = selection.length === 1 && page ? getComponentById(selection[0]) : null;
266
287
  const editField = (field, value, noRefresh = true) => {
267
288
  var _a;
@@ -294,6 +315,7 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
294
315
  op.noRefresh = noRefresh;
295
316
  op.refreshAfterQuietPeriod = !noRefresh;
296
317
  op.value = value;
318
+ getLiveField(field).value = value;
297
319
  function getField(fields, id) {
298
320
  return Object.values(fields).find((f) => f.id === id);
299
321
  }
@@ -343,10 +365,12 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
343
365
  dragObject,
344
366
  dictionary,
345
367
  setDictionary,
368
+ requestRefresh,
346
369
  refreshCompletedFlag,
347
370
  unresolvedDictionaryKeys,
348
371
  setUnresolvedDictionaryKeys,
349
372
  updateContentEditingFields,
373
+ getLiveField,
350
374
  showToast: () => { },
351
375
  removeComponent: (componentId, callback) => {
352
376
  confirmDialog({
@@ -432,7 +456,7 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
432
456
  setCurrentEditOperation(op);
433
457
  setDragObject(undefined);
434
458
  }),
435
- }, children: [_jsx(Toast, { ref: toast }), _jsxs(PrimeReactProvider, { children: [_jsx(ConfirmDialog, {}), _jsx(Sidebar, { style: { width: "40%" }, visible: componentsPaletteVisible, position: "right", onHide: () => setComponentsPaletteVisible(false), pt: {
459
+ }, children: [_jsx(Toast, { ref: toast }), _jsxs(PrimeReactProvider, { children: [_jsx(ConfirmDialog, {}), _jsx(Sidebar, { style: { width: "40%" }, visible: componentsPaletteVisible, position: "right", onHide: () => setComponentsPaletteVisible(false), header: "Insert component", pt: {
436
460
  mask: {
437
461
  onDragOver: () => setHidePalette(true),
438
462
  style: {
@@ -449,5 +473,5 @@ export function EditorClient({ content, dictionaryObject, edit, children, }) {
449
473
  setHidePalette(false);
450
474
  }
451
475
  setSelectedForInsertion("");
452
- } })) }), _jsxs(BlockUI, { blocked: uiBlocked, template: spinner, children: [_jsx(Menubar, { model: menuItems, end: endContent }), _jsxs(Splitter, { children: [_jsx(SplitterPanel, { size: 25, className: "alpaca-overflow-scroll", children: _jsxs(Splitter, { layout: "vertical", children: [_jsx(SplitterPanel, { className: "a-overflow-hidden a-relative", children: _jsx("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: _jsx(ComponentTree, { page: page, selection: selection }) }) }), _jsx(SplitterPanel, { className: "alpaca-editor-tabs", children: _jsxs(TabView, { className: "a-inset-0 a-absolute", scrollable: true, children: [selectedComponent && (_jsxs(TabPanel, { header: "Fields", children: [_jsx(ComponentInfo, { component: selectedComponent }), _jsx(FieldList, { fields: selectedComponent.fields })] })), selectedComponent && (_jsx(TabPanel, { header: "GraphQL", style: { height: "100%" }, children: _jsx(GraphQL, { component: selectedComponent }) })), _jsxs(TabPanel, { header: "Page", children: [page && _jsx(PageInfo, { page: page }), page && _jsx(FieldList, { fields: page.fields })] }), _jsx(TabPanel, { header: "Dictionary", children: _jsx(DictionaryEditor, { dictionary: dictionary }) }), _jsx(TabPanel, { header: "Debug", children: _jsx(Debug, { component: selectedComponent, page: page }) })] }) })] }) }), _jsx(SplitterPanel, { size: 55, className: "alpaca-overflow-scroll alpaca-editor-content", children: _jsx("div", { onDragEndCapture: () => setDragObject(undefined), className: "alpaca-editor-container", children: children }) }), _jsx(SplitterPanel, { size: 20, children: _jsxs(Splitter, { layout: "vertical", className: "alpaca-editor", children: [_jsx(SplitterPanel, { className: "overflow-hidden a-relative", children: _jsx(EditHistory, { operations: editData === null || editData === void 0 ? void 0 : editData.operations }) }), _jsx(SplitterPanel, { className: "overflow-hidden a-relative", children: _jsx(AiTerminal, { selection: selection, requestRefresh: requestRefresh }) })] }) })] })] })] })] }));
476
+ } })) }), _jsxs(BlockUI, { blocked: uiBlocked, template: spinner, children: [_jsx(Menubar, { model: menuItems, end: endContent }), _jsxs(Splitter, { children: [_jsx(SplitterPanel, { size: 30, className: "alpaca-overflow-scroll", children: _jsxs(Splitter, { layout: "vertical", children: [_jsx(SplitterPanel, { size: 30, className: "a-overflow-hidden a-relative", children: _jsx("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: _jsx(ComponentTree, { page: page, selection: selection }) }) }), _jsx(SplitterPanel, { className: "alpaca-editor-tabs", children: _jsxs(TabView, { className: "a-inset-0 a-absolute", scrollable: true, children: [selectedComponent && (_jsxs(TabPanel, { header: "Fields", children: [_jsx(ComponentInfo, { component: selectedComponent }), _jsx(FieldList, { fields: selectedComponent.fields })] })), selectedComponent && (_jsx(TabPanel, { header: "GraphQL", style: { height: "100%" }, children: _jsx(GraphQL, { component: selectedComponent }) })), _jsxs(TabPanel, { header: "Page", children: [page && _jsx(PageInfo, { page: page }), page && _jsx(FieldList, { fields: page.fields })] }), _jsx(TabPanel, { header: "Dictionary", children: _jsx(DictionaryEditor, { dictionary: dictionary }) }), _jsx(TabPanel, { header: "Debug", children: _jsx(Debug, { component: selectedComponent, page: page }) })] }) })] }) }), _jsx(SplitterPanel, { size: 55, className: "alpaca-overflow-scroll alpaca-editor-content", children: _jsx("div", { onDragEndCapture: () => setDragObject(undefined), className: "alpaca-editor-container", children: children }) }), _jsx(SplitterPanel, { size: 15, children: _jsxs(Splitter, { layout: "vertical", className: "alpaca-editor", children: [_jsx(SplitterPanel, { className: "overflow-hidden a-relative", children: _jsx(EditHistory, { operations: editData === null || editData === void 0 ? void 0 : editData.operations }) }), _jsx(SplitterPanel, { className: "overflow-hidden a-relative", children: _jsx(AiTerminal, { selection: selection, requestRefresh: requestRefresh }) })] }) })] })] })] })] }));
453
477
  }
@@ -1,12 +1,15 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEditContext, } from "..";
3
4
  import { InputText } from "primereact/inputtext";
4
5
  import { Checkbox } from "primereact/checkbox";
5
6
  import { SingleLineText } from "./fieldTypes/SingleLineText";
6
7
  import { RichTextEditor } from "./fieldTypes/RichTextEditor";
7
8
  export function FieldList({ fields }) {
8
- if (!fields)
9
- return;
9
+ const editContext = useEditContext();
10
+ if (!editContext)
11
+ if (!fields)
12
+ return;
10
13
  if (!Array.isArray(fields))
11
14
  fields = Object.values(fields);
12
15
  const sections = fields.reduce((acc, value) => {
@@ -20,10 +23,12 @@ export function FieldList({ fields }) {
20
23
  }, {});
21
24
  const sectionList = Object.values(sections);
22
25
  sectionList.sort((a, b) => b[0].sortOrder - a[0].sortOrder);
23
- return (_jsx("div", { className: "a-p-1", children: Object.keys(sections).map((section) => (_jsxs("div", { children: [_jsx("div", { className: "alpaca-fields-section-headline", children: section }), getSectionFields(sections[section])] }, section))) }));
26
+ return (_jsx("div", { className: "a-p-1", children: Object.keys(sections).map((section) => (_jsxs("div", { children: [_jsx("div", { className: "alpaca-fields-section-headline", children: section }), getSectionFields(sections[section], editContext)] }, section))) }));
24
27
  }
25
- function getSectionFields(fields) {
26
- return fields.map((field) => (_jsxs("div", { children: [_jsx("label", { className: "alpaca-field-label", children: field.name }), !field.containsFallbackValue ? (_jsx("button", { className: "a-text-xs a-p-0 a-m-1", children: "Reset " })) : (_jsx("button", { children: "Fallback" })), _jsx("div", { children: getFieldEditor(field) })] }, field.id)));
28
+ function getSectionFields(fields, editContext) {
29
+ return fields
30
+ .map((field) => editContext.getLiveField(field))
31
+ .map((field) => (_jsxs("div", { children: [_jsx("label", { className: "alpaca-field-label", children: field.name }), !field.containsFallbackValue ? (_jsx("button", { className: "a-text-xs a-p-0 a-m-1", children: "Reset " })) : (_jsx("button", { children: "Fallback" })), _jsx("div", { children: getFieldEditor(field) })] }, field.id)));
27
32
  }
28
33
  function getFieldEditor(field) {
29
34
  switch (field.type) {
@@ -73,11 +73,10 @@ export function GraphQL({ component }) {
73
73
  type: "jsonValue",
74
74
  };
75
75
  const prettyQuery = format(query);
76
- console.log(query);
77
- console.log(prettyQuery);
78
76
  setQuery(prettyQuery);
79
77
  editContext === null || editContext === void 0 ? void 0 : editContext.editField(field, prettyQuery, false);
80
78
  setShowSpinner(true);
79
+ editContext === null || editContext === void 0 ? void 0 : editContext.requestRefresh("immediate");
81
80
  }
82
81
  return (_jsxs(Splitter, { layout: "vertical", style: { height: "100%" }, children: [_jsx(SplitterPanel, { size: 50, className: "a-relative", children: _jsxs("div", { className: "a-absolute a-inset-0 a-flex", children: [_jsx(InputTextarea, { value: query, onChange: (e) => setQuery(e.target.value), className: "a-flex-1", style: { height: "100%" } }), _jsx(Button, { icon: "pi pi-refresh" + (showSpinner ? " pi-spin" : ""), onClick: refresh, disabled: showSpinner })] }) }), _jsx(SplitterPanel, { className: "alpaca-editor-tabs", children: _jsxs(TabView, { className: "a-inset-0 a-absolute", children: [_jsx(TabPanel, { header: "Data", style: { height: "100%" }, className: "a-relative", children: _jsx("div", { className: "a-m-1", children: Object.values(fieldsjsonValues).map((x) => renderItem(x)) }) }), _jsx(TabPanel, { header: "JSON", className: "a-relative", style: { height: "100%" }, children: _jsx("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: _jsx(JSONPretty, { data: component.graphql }) }) })] }) })] }));
83
82
  }
@@ -15,6 +15,7 @@ import { getChildren } from "./contentService";
15
15
  import { useEditContext } from "./editContext";
16
16
  import { Button } from "primereact/button";
17
17
  import { Dialog } from "primereact/dialog";
18
+ import { FileUpload } from "primereact/fileupload";
18
19
  export const MediaSelector = ({ visible, onHide, onMediaSelected, }) => {
19
20
  const [selectedFolderId, setSelectedFolderId] = useState();
20
21
  const [images, setImages] = useState();
@@ -34,21 +35,26 @@ export const MediaSelector = ({ visible, onHide, onMediaSelected, }) => {
34
35
  "F1828A2C-7E5D-4BBD-98CA-320474871548",
35
36
  ]);
36
37
  setImages(children);
38
+ return children;
37
39
  }
38
40
  });
39
41
  }
40
- return (_jsx(Dialog, { style: { width: "60%" }, visible: visible, onHide: onHide, children: _jsxs("div", { className: "a-flex a-flex-col a-h-full", children: [_jsxs(Splitter, { className: "a-flex-1 a-border-0", children: [_jsx(SplitterPanel, { size: 35, className: "alpaca-overflow-scroll", children: _jsxs(Splitter, { layout: "vertical", children: [_jsx(SplitterPanel, { size: 70, children: _jsx(ContentTree, { rootItemId: "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", selectionMode: "single", selectedItemIds: selection, templateIds: ["FE5DD826-48C6-436D-B87A-7C4210C7413B"], expandIdPath: "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", onSelectionChange: (selection) => {
41
- if (selection.length)
42
- setSelectedFolderId(selection[0]);
43
- else
44
- setSelectedFolderId(undefined);
45
- } }) }), _jsx(SplitterPanel, { children: selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.name })] }) }), _jsx(SplitterPanel, { className: "alpaca-overflow-scroll a-relative", children: _jsx("div", { className: "a-grid a-grid-cols-3 a-gap-2 a-absolute a-inset-0", children: images === null || images === void 0 ? void 0 : images.map((t) => {
46
- return (_jsxs("div", { className: "a-flex a-flex-col a-justify-between hover:a-shadow-md a-cursor-pointer a-p-1", onDoubleClick: () => {
42
+ return (_jsx(Dialog, { style: { width: "80%", height: "80%" }, visible: visible, onHide: onHide, children: _jsxs("div", { className: "a-flex a-flex-col a-h-full", children: [_jsxs(Splitter, { className: "a-flex-1 a-border-0", children: [_jsx(SplitterPanel, { size: 35, className: "alpaca-overflow-scroll", children: _jsxs(Splitter, { layout: "vertical", children: [_jsx(SplitterPanel, { size: 70, className: "a-relative", children: _jsx("div", { className: "a-absolute a-inset-0 a-overflow-auto", children: _jsx(ContentTree, { rootItemId: "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", selectionMode: "single", selectedItemIds: selection, templateIds: ["FE5DD826-48C6-436D-B87A-7C4210C7413B"], expandIdPath: "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", onSelectionChange: (selection) => {
43
+ if (selection.length)
44
+ setSelectedFolderId(selection[0]);
45
+ else
46
+ setSelectedFolderId(undefined);
47
+ } }) }) }), _jsx(SplitterPanel, { className: "a-flex a-justify-center a-align-center", children: _jsx("img", { src: selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.previewUrl }) })] }) }), _jsx(SplitterPanel, { className: "a-relative", children: _jsx("div", { className: "a-flex a-flex-wrap a-content-start a-items-start a-gap-2 a-absolute a-inset-0 a-overflow-auto", children: images === null || images === void 0 ? void 0 : images.map((t) => {
48
+ return (_jsxs("div", { className: "a-w-24 a-flex a-flex-col a-justify-between hover:a-shadow-md a-cursor-pointer a-p-1", onDoubleClick: () => {
47
49
  onMediaSelected(t.id);
48
50
  onHide();
49
- }, onClick: () => setSelectedImage(t), children: [_jsx("img", { src: t.imageUrl }), _jsx("div", { className: "a-text-xs a-break-all", children: t.name })] }));
50
- }) }) })] }), _jsxs("div", { className: "a-flex a-justify-end a-gap-3", children: [_jsx(Button, { onClick: () => onHide(), children: "Cancel" }), _jsx(Button, { disabled: !selectedImage, onClick: () => {
51
+ }, onClick: () => setSelectedImage(t), children: [_jsx("img", { src: t.imageUrl, className: "a-w-24 a-h-24" }), _jsx("div", { className: "a-text-xs a-break-all", children: t.name })] }, t.id));
52
+ }) }) })] }), _jsxs("div", { className: "a-flex a-justify-end a-gap-3 a-mt-3", children: [_jsx(FileUpload, { mode: "basic", disabled: !selectedFolderId, auto: true, chooseLabel: "Upload", accept: "image/*", url: "/alpaca/headless/editor/upload?folder=" + selection[0], onUpload: ({ xhr }) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const response = JSON.parse(xhr.responseText);
54
+ const thumbs = yield loadThumbnails(selectedFolderId);
55
+ setSelectedImage(thumbs === null || thumbs === void 0 ? void 0 : thumbs.find((x) => x.id === response.id));
56
+ }) }), _jsx(Button, { disabled: !selectedImage, onClick: () => {
51
57
  onMediaSelected(selectedImage.id);
52
58
  onHide();
53
- }, children: "Select" })] })] }) }));
59
+ }, children: "Select" }), _jsx(Button, { onClick: () => onHide(), children: "Cancel" })] })] }) }));
54
60
  };