@gravity-ui/page-constructor 5.13.0 → 5.14.1

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 (80) hide show
  1. package/build/cjs/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +1 -0
  2. package/build/cjs/editor/components/AddBlock/AddBlock.css +1 -2
  3. package/build/cjs/editor/components/CodeEditor/CodeEditor.css +3 -1
  4. package/build/cjs/editor/components/ControlPanel/ControlPanel.css +2 -4
  5. package/build/cjs/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
  6. package/build/cjs/editor/components/ControlPanel/ControlPanel.js +24 -15
  7. package/build/cjs/editor/components/ControlPanel/i18n/en.json +2 -1
  8. package/build/cjs/editor/components/ControlPanel/i18n/index.d.ts +1 -1
  9. package/build/cjs/editor/components/ControlPanel/i18n/ru.json +2 -1
  10. package/build/cjs/editor/components/Layout/Layout.css +10 -6
  11. package/build/cjs/editor/components/Layout/Layout.d.ts +4 -7
  12. package/build/cjs/editor/components/Layout/Layout.js +8 -10
  13. package/build/cjs/editor/components/PageSettings/PageSettings.css +26 -0
  14. package/build/cjs/editor/components/PageSettings/PageSettings.d.ts +11 -0
  15. package/build/cjs/editor/components/PageSettings/PageSettings.js +30 -0
  16. package/build/cjs/editor/components/PageSettings/i18n/en.json +3 -0
  17. package/build/cjs/editor/components/PageSettings/i18n/index.d.ts +1 -0
  18. package/build/cjs/editor/components/PageSettings/i18n/index.js +9 -0
  19. package/build/cjs/editor/components/PageSettings/i18n/ru.json +3 -0
  20. package/build/cjs/editor/containers/Editor/Editor.css +17 -0
  21. package/build/cjs/editor/containers/Editor/Editor.d.ts +1 -1
  22. package/build/cjs/editor/containers/Editor/Editor.js +17 -65
  23. package/build/cjs/editor/containers/Editor/hooks/useCode.d.ts +14 -0
  24. package/build/cjs/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
  25. package/build/cjs/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
  26. package/build/cjs/editor/containers/Editor/hooks/useEditorState.js +99 -0
  27. package/build/cjs/editor/containers/Form/Form.css +0 -10
  28. package/build/cjs/editor/containers/Form/Form.d.ts +1 -8
  29. package/build/cjs/editor/containers/Form/Form.js +14 -39
  30. package/build/cjs/editor/store/main/index.js +1 -1
  31. package/build/cjs/editor/store/settings/index.d.ts +3 -3
  32. package/build/cjs/editor/store/settings/index.js +4 -4
  33. package/build/cjs/editor/store/settings/reducer.d.ts +9 -9
  34. package/build/cjs/editor/store/settings/reducer.js +6 -6
  35. package/build/cjs/editor/types/index.d.ts +3 -4
  36. package/build/cjs/editor/types/index.js +7 -8
  37. package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +1 -0
  38. package/build/esm/editor/components/AddBlock/AddBlock.css +1 -2
  39. package/build/esm/editor/components/CodeEditor/CodeEditor.css +3 -1
  40. package/build/esm/editor/components/ControlPanel/ControlPanel.css +2 -4
  41. package/build/esm/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
  42. package/build/esm/editor/components/ControlPanel/ControlPanel.js +26 -17
  43. package/build/esm/editor/components/ControlPanel/i18n/en.json +2 -1
  44. package/build/esm/editor/components/ControlPanel/i18n/index.d.ts +1 -1
  45. package/build/esm/editor/components/ControlPanel/i18n/ru.json +2 -1
  46. package/build/esm/editor/components/Layout/Layout.css +10 -6
  47. package/build/esm/editor/components/Layout/Layout.d.ts +4 -7
  48. package/build/esm/editor/components/Layout/Layout.js +9 -11
  49. package/build/esm/editor/components/PageSettings/PageSettings.css +26 -0
  50. package/build/esm/editor/components/PageSettings/PageSettings.d.ts +12 -0
  51. package/build/esm/editor/components/PageSettings/PageSettings.js +27 -0
  52. package/build/esm/editor/components/PageSettings/i18n/en.json +3 -0
  53. package/build/esm/editor/components/PageSettings/i18n/index.d.ts +1 -0
  54. package/build/esm/editor/components/PageSettings/i18n/index.js +5 -0
  55. package/build/esm/editor/components/PageSettings/i18n/ru.json +3 -0
  56. package/build/esm/editor/containers/Editor/Editor.css +17 -0
  57. package/build/esm/editor/containers/Editor/Editor.d.ts +2 -1
  58. package/build/esm/editor/containers/Editor/Editor.js +18 -66
  59. package/build/esm/editor/containers/Editor/hooks/useCode.d.ts +14 -0
  60. package/build/esm/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
  61. package/build/esm/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
  62. package/build/esm/editor/containers/Editor/hooks/useEditorState.js +95 -0
  63. package/build/esm/editor/containers/Form/Form.css +0 -10
  64. package/build/esm/editor/containers/Form/Form.d.ts +1 -8
  65. package/build/esm/editor/containers/Form/Form.js +16 -42
  66. package/build/esm/editor/store/main/index.js +1 -1
  67. package/build/esm/editor/store/settings/index.d.ts +3 -3
  68. package/build/esm/editor/store/settings/index.js +5 -5
  69. package/build/esm/editor/store/settings/reducer.d.ts +9 -9
  70. package/build/esm/editor/store/settings/reducer.js +6 -6
  71. package/build/esm/editor/types/index.d.ts +3 -4
  72. package/build/esm/editor/types/index.js +6 -7
  73. package/package.json +1 -1
  74. package/widget/index.js +1 -1
  75. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
  76. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.js +0 -17
  77. package/build/cjs/editor/containers/Form/hooks.d.ts +0 -8
  78. package/build/esm/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
  79. package/build/esm/editor/components/PagePropsForm/PagePropsForm.js +0 -13
  80. package/build/esm/editor/containers/Form/hooks.d.ts +0 -8
@@ -56,6 +56,7 @@ unpredictable css rules order in build */
56
56
  .pc-QuestionsBlockItem__link.pc-QuestionsBlockItem__link a {
57
57
  outline-offset: -2px;
58
58
  border-radius: calc(var(--g-focus-border-radius) + 2px);
59
+ display: inline-block;
59
60
  }
60
61
 
61
62
  .pc-QuestionsBlockItem__text {
@@ -2,8 +2,7 @@
2
2
  unpredictable css rules order in build */
3
3
  .pc-add-block {
4
4
  position: absolute;
5
- bottom: 32px;
6
- left: calc(50% + var(--pc-editor-left-column-width) / 2);
5
+ left: 50%;
7
6
  transform: translateX(-50%);
8
7
  z-index: 110;
9
8
  }
@@ -1,7 +1,9 @@
1
1
  .pc-code-editor {
2
- height: 100%;
2
+ z-index: 2;
3
+ height: 60vh;
3
4
  position: relative;
4
5
  overflow: hidden;
6
+ box-shadow: 0 4px 24px var(--pc-color-sfx-shadow), 0 2px 8px var(--pc-color-sfx-shadow);
5
7
  }
6
8
  .pc-code-editor_fullscreen {
7
9
  position: absolute;
@@ -14,17 +14,15 @@ unpredictable css rules order in build */
14
14
  display: flex;
15
15
  align-items: center;
16
16
  }
17
- .pc-control-panel__radio-button {
18
- margin-left: 12px;
19
- }
20
17
  .pc-control-panel__radio-button .g-radio-button__option {
21
18
  display: flex;
22
19
  align-items: center;
23
20
  }
24
- .pc-control-panel__mode-switch {
21
+ .pc-control-panel__switch-container {
25
22
  display: flex;
26
23
  align-items: center;
27
24
  place-self: center;
25
+ gap: 12px;
28
26
  }
29
27
  .pc-control-panel__theme-switch {
30
28
  place-self: center end;
@@ -1,10 +1,12 @@
1
1
  import { ClassNameProps, Theme } from '../../../models';
2
- import { ViewModeItem } from '../../types';
2
+ import { EditModeItem, ViewModeItem } from '../../types';
3
3
  export interface ControlPanelProps extends ClassNameProps {
4
4
  viewMode?: ViewModeItem;
5
+ editMode?: EditModeItem;
5
6
  onViewModeChange: (viewMode: ViewModeItem) => void;
7
+ onEditModeChange: (editMode: EditModeItem) => void;
6
8
  theme: Theme;
7
9
  onThemeChange: (theme: Theme) => void;
8
10
  }
9
- declare const ControlPanel: ({ viewMode, onViewModeChange, className, theme, onThemeChange, }: ControlPanelProps) => JSX.Element;
11
+ declare const ControlPanel: ({ viewMode, editMode, onViewModeChange, onEditModeChange, className, theme, onThemeChange, }: ControlPanelProps) => JSX.Element;
10
12
  export default ControlPanel;
@@ -12,24 +12,33 @@ const i18n_1 = require("./i18n");
12
12
  const ICON_SIZE = 14;
13
13
  const b = (0, utils_1.block)('control-panel');
14
14
  const ControlPanelViewModeIcons = {
15
- [types_1.ViewModeItem.Edititng]: icons_1.Pencil,
16
15
  [types_1.ViewModeItem.Desktop]: icons_1.Display,
17
16
  [types_1.ViewModeItem.Tablet]: Tablet_1.Tablet,
18
17
  [types_1.ViewModeItem.Mobile]: icons_1.Smartphone,
19
18
  };
20
- const ControlPanel = ({ viewMode = types_1.ViewModeItem.Edititng, onViewModeChange, className, theme, onThemeChange, }) => {
21
- return (react_1.default.createElement("div", { className: b(null, className) },
22
- react_1.default.createElement("div", null),
23
- react_1.default.createElement("div", { className: b('mode-switch') },
24
- react_1.default.createElement("span", null, (0, i18n_1.i18n)('mode')),
25
- react_1.default.createElement(uikit_1.RadioButton, { className: b('radio-button'), value: viewMode, onUpdate: (value) => onViewModeChange(value) }, Object.values(types_1.ViewModeItem).map((item) => {
26
- const Icon = ControlPanelViewModeIcons[item];
27
- return (react_1.default.createElement(uikit_1.RadioButton.Option, { key: item, value: item },
28
- react_1.default.createElement("span", { className: b('icon') },
29
- react_1.default.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
30
- }))),
31
- react_1.default.createElement("div", { className: b('theme-switch') },
32
- react_1.default.createElement("span", null, (0, i18n_1.i18n)('theme')),
33
- react_1.default.createElement(uikit_1.Select, { value: [theme], onUpdate: (value) => onThemeChange(value[0]) }, Object.values(models_1.Theme).map((item) => (react_1.default.createElement(uikit_1.Select.Option, { key: item, value: item }, models_1.themeNames[item])))))));
19
+ const ControlPanelEditModeIcons = {
20
+ [types_1.EditModeItem.View]: icons_1.Eye,
21
+ [types_1.EditModeItem.Form]: icons_1.SquareDashedText,
22
+ [types_1.EditModeItem.Code]: icons_1.Code,
34
23
  };
24
+ const ControlPanel = ({ viewMode = types_1.ViewModeItem.Desktop, editMode = types_1.EditModeItem.Form, onViewModeChange, onEditModeChange, className, theme, onThemeChange, }) => (react_1.default.createElement("div", { className: b(null, className) },
25
+ react_1.default.createElement("div", { className: b('switch-container') },
26
+ react_1.default.createElement("span", null, (0, i18n_1.i18n)('edit_mode')),
27
+ react_1.default.createElement(uikit_1.RadioButton, { className: b('radio-button'), value: editMode, onUpdate: (value) => onEditModeChange(value) }, Object.values(types_1.EditModeItem).map((item) => {
28
+ const Icon = ControlPanelEditModeIcons[item];
29
+ return (react_1.default.createElement(uikit_1.RadioButton.Option, { key: item, value: item },
30
+ react_1.default.createElement("span", { className: b('icon') },
31
+ react_1.default.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
32
+ }))),
33
+ react_1.default.createElement("div", { className: b('switch-container') },
34
+ react_1.default.createElement("span", null, (0, i18n_1.i18n)('view_mode')),
35
+ react_1.default.createElement(uikit_1.RadioButton, { className: b('radio-button'), value: viewMode, onUpdate: (value) => onViewModeChange(value) }, Object.values(types_1.ViewModeItem).map((item) => {
36
+ const Icon = ControlPanelViewModeIcons[item];
37
+ return (react_1.default.createElement(uikit_1.RadioButton.Option, { key: item, value: item },
38
+ react_1.default.createElement("span", { className: b('icon') },
39
+ react_1.default.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
40
+ }))),
41
+ react_1.default.createElement("div", { className: b('switch-container') },
42
+ react_1.default.createElement("span", null, (0, i18n_1.i18n)('theme')),
43
+ react_1.default.createElement(uikit_1.Select, { value: [theme], onUpdate: (value) => onThemeChange(value[0]) }, Object.values(models_1.Theme).map((item) => (react_1.default.createElement(uikit_1.Select.Option, { key: item, value: item }, models_1.themeNames[item])))))));
35
44
  exports.default = ControlPanel;
@@ -1,4 +1,5 @@
1
1
  {
2
- "mode": "Mode",
2
+ "view_mode": "View mode",
3
+ "edit_mode": "Edit mode",
3
4
  "theme": "Theme"
4
5
  }
@@ -1 +1 @@
1
- export declare const i18n: (key: "theme" | "mode", params?: import("@gravity-ui/i18n").Params | undefined) => string;
1
+ export declare const i18n: (key: "theme" | "view_mode" | "edit_mode", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -1,4 +1,5 @@
1
1
  {
2
- "mode": "Режим",
2
+ "view_mode": "Режим просмотра",
3
+ "edit_mode": "Режим редактирования",
3
4
  "theme": "Тема"
4
5
  }
@@ -20,11 +20,6 @@ body {
20
20
  .pc-editor-layout {
21
21
  position: relative;
22
22
  }
23
- .pc-editor-layout__panel {
24
- top: 0;
25
- position: sticky;
26
- z-index: 2;
27
- }
28
23
  .pc-editor-layout__container {
29
24
  position: relative;
30
25
  display: flex;
@@ -33,14 +28,23 @@ body {
33
28
  }
34
29
  .pc-editor-layout__left {
35
30
  flex: 0 0 auto;
36
- padding: 24px 16px;
31
+ padding: 24px;
37
32
  width: var(--pc-editor-left-column-width);
38
33
  border-right: var(--pc-editor-divider-width) solid var(--g-color-line-generic);
39
34
  overflow-x: auto;
40
35
  }
36
+ .pc-editor-layout__left_closed {
37
+ display: none;
38
+ }
41
39
  .pc-editor-layout__right {
40
+ position: relative;
42
41
  width: 100%;
43
42
  }
44
43
  .pc-editor-layout__right_editing {
45
44
  padding-bottom: 200px;
45
+ }
46
+ .pc-editor-layout__arrow-toggle {
47
+ padding: 12px;
48
+ cursor: pointer;
49
+ border-right: 1px solid var(--g-color-line-generic);
46
50
  }
@@ -1,14 +1,11 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
- import { Theme } from '../../../models';
3
- import { ViewModeItem } from '../../types';
2
+ import { EditModeItem, ViewModeItem } from '../../types';
4
3
  export interface LayoutProps {
5
- mode: ViewModeItem;
6
- onModeChange: (mode: ViewModeItem) => void;
7
- theme: Theme;
8
- onThemeChange: (theme: Theme) => void;
4
+ editMode: EditModeItem;
5
+ viewMode: ViewModeItem;
9
6
  }
10
7
  declare const Layout: {
11
- ({ children, mode, onModeChange, theme, onThemeChange, }: PropsWithChildren<LayoutProps>): JSX.Element;
8
+ ({ children, editMode, viewMode }: PropsWithChildren<LayoutProps>): JSX.Element;
12
9
  Left: React.FC<{
13
10
  children?: React.ReactNode;
14
11
  }>;
@@ -4,14 +4,14 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const utils_1 = require("../../../utils");
6
6
  const types_1 = require("../../types");
7
- const ControlPanel_1 = tslib_1.__importDefault(require("../ControlPanel/ControlPanel"));
8
7
  const DeviceEmulation_1 = tslib_1.__importDefault(require("../DeviceEmulation/DeviceEmulation"));
9
8
  const b = (0, utils_1.block)('editor-layout');
10
9
  const Left = () => null;
11
10
  const Right = () => null;
12
- const Layout = ({ children, mode, onModeChange, theme, onThemeChange, }) => {
11
+ // TODO in https://github.com/gravity-ui/page-constructor/issues/884 this component will be disappeared
12
+ const Layout = ({ children, editMode, viewMode }) => {
13
13
  let left, right;
14
- const isEditingMode = mode === types_1.ViewModeItem.Edititng;
14
+ const isEditingMode = editMode === types_1.EditModeItem.Form;
15
15
  function handleChild(child) {
16
16
  switch (child === null || child === void 0 ? void 0 : child.type) {
17
17
  case Left:
@@ -25,13 +25,11 @@ const Layout = ({ children, mode, onModeChange, theme, onThemeChange, }) => {
25
25
  if (react_1.default.Children.toArray(children).length) {
26
26
  react_1.Children.forEach(children, handleChild);
27
27
  }
28
- return (react_1.default.createElement("div", { className: b() },
29
- react_1.default.createElement(ControlPanel_1.default, { viewMode: mode, onViewModeChange: onModeChange, className: b('panel'), theme: theme, onThemeChange: onThemeChange }),
30
- react_1.default.createElement("div", { className: b('container') },
31
- react_1.default.createElement(react_1.Fragment, null,
32
- left && react_1.default.createElement("div", { className: b('left') }, left),
33
- right && (react_1.default.createElement("div", { className: b('right', { editing: isEditingMode }) },
34
- react_1.default.createElement(DeviceEmulation_1.default, { mode: mode }, right)))))));
28
+ return (react_1.default.createElement("div", { className: b('container') },
29
+ react_1.default.createElement(react_1.Fragment, null,
30
+ left && react_1.default.createElement("div", { className: b('left') }, left),
31
+ right && (react_1.default.createElement("div", { className: b('right', { editing: isEditingMode }) },
32
+ react_1.default.createElement(DeviceEmulation_1.default, { mode: viewMode }, right))))));
35
33
  };
36
34
  Layout.Left = Left;
37
35
  Layout.Right = Right;
@@ -0,0 +1,26 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ body {
4
+ --pc-editor-header-height: 48px;
5
+ --pc-editor-code-header-height: 36px;
6
+ --pc-editor-divider-width: 12px;
7
+ --pc-editor-left-column-width: calc(400px + var(--pc-editor-divider-width));
8
+ --pc-editor-base-color: var(--g-color-base-brand);
9
+ --pc-editor-control-color: var(--g-color-base-brand);
10
+ --pc-editor-control-icon-color: var(--g-color-text-dark-primary);
11
+ }
12
+
13
+ .pc-editor-page-settings__container {
14
+ display: flex;
15
+ flex-direction: column;
16
+ align-items: center;
17
+ width: 100%;
18
+ padding: 12px;
19
+ border-bottom: 1px solid var(--g-color-line-generic);
20
+ }
21
+ .pc-editor-page-settings__container .g-disclosure__content {
22
+ width: 100%;
23
+ }
24
+ .pc-editor-page-settings__form {
25
+ margin-top: 16px;
26
+ }
@@ -0,0 +1,11 @@
1
+ import { JSONSchema4 } from 'json-schema';
2
+ import { PageContent } from '../../../models';
3
+ export interface PageSettingsProps {
4
+ content: PageContent;
5
+ schema: JSONSchema4;
6
+ onChange: (content: PageContent) => void;
7
+ }
8
+ export declare const PageSettings: {
9
+ ({ schema, content, onChange }: PageSettingsProps): JSX.Element;
10
+ displayName: string;
11
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PageSettings = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const dynamic_forms_1 = require("@gravity-ui/dynamic-forms");
7
+ const uikit_1 = require("@gravity-ui/uikit");
8
+ const noop_1 = tslib_1.__importDefault(require("lodash/noop"));
9
+ const react_final_form_1 = require("react-final-form");
10
+ const utils_1 = require("../../../utils");
11
+ const config_1 = require("../../dynamic-forms-custom/config");
12
+ const useFormSpec_1 = tslib_1.__importDefault(require("../../hooks/useFormSpec"));
13
+ const i18n_1 = require("./i18n");
14
+ const b = (0, utils_1.block)('editor-page-settings');
15
+ const PageSettings = ({ schema, content, onChange }) => {
16
+ const spec = (0, useFormSpec_1.default)(schema);
17
+ const { page: pageSpec } = spec || {};
18
+ const initialPage = (0, react_1.useMemo)(() => {
19
+ const _a = content || {}, { blocks: _ } = _a, page = tslib_1.__rest(_a, ["blocks"]);
20
+ return page;
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ }, []);
23
+ return (react_1.default.createElement(uikit_1.Disclosure, { className: b('container'), summary: (0, i18n_1.i18n)('page-settings-title'), size: "l" },
24
+ react_1.default.createElement("div", { className: b('form') },
25
+ react_1.default.createElement(react_final_form_1.Form, { initialValues: { content: initialPage }, onSubmit: noop_1.default }, () => (react_1.default.createElement("div", null,
26
+ react_1.default.createElement(react_final_form_1.FormSpy, { onChange: ({ values }) => onChange(Object.assign(Object.assign({}, content), values.content)), subscription: { values: true } }),
27
+ react_1.default.createElement(dynamic_forms_1.DynamicField, { name: "content", spec: pageSpec, config: config_1.dynamicConfig })))))));
28
+ };
29
+ exports.PageSettings = PageSettings;
30
+ exports.PageSettings.displayName = 'PageSettings';
@@ -0,0 +1,3 @@
1
+ {
2
+ "page-settings-title": "Global page settings"
3
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "page-settings-title", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.i18n = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const i18n_1 = require("@gravity-ui/uikit/i18n");
6
+ const cn_1 = require("../../../../utils/cn");
7
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
8
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
9
+ exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}PageSettings`);
@@ -0,0 +1,3 @@
1
+ {
2
+ "page-settings-title": "Глобальные настройки страницы"
3
+ }
@@ -0,0 +1,17 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ body {
4
+ --pc-editor-header-height: 48px;
5
+ --pc-editor-code-header-height: 36px;
6
+ --pc-editor-divider-width: 12px;
7
+ --pc-editor-left-column-width: calc(400px + var(--pc-editor-divider-width));
8
+ --pc-editor-base-color: var(--g-color-base-brand);
9
+ --pc-editor-control-color: var(--g-color-base-brand);
10
+ --pc-editor-control-icon-color: var(--g-color-text-dark-primary);
11
+ }
12
+
13
+ .pc-editor__panel {
14
+ top: 0;
15
+ position: sticky;
16
+ z-index: 2;
17
+ }
@@ -1,2 +1,2 @@
1
1
  import { EditorProps } from '../../types';
2
- export declare const Editor: ({ customSchema, onChange, providerProps, transformContent, deviceEmulationSettings, theme: editorTheme, ...rest }: EditorProps) => JSX.Element;
2
+ export declare const Editor: (props: EditorProps) => JSX.Element;
@@ -2,81 +2,33 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Editor = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const react_1 = tslib_1.__importStar(require("react"));
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const PageConstructor_1 = require("../../../containers/PageConstructor");
7
- const schema_1 = require("../../../schema");
7
+ const utils_1 = require("../../../utils");
8
8
  const AddBlock_1 = tslib_1.__importDefault(require("../../components/AddBlock/AddBlock"));
9
- const EditBlock_1 = tslib_1.__importDefault(require("../../components/EditBlock/EditBlock"));
9
+ const CodeEditor_1 = require("../../components/CodeEditor/CodeEditor");
10
+ const ControlPanel_1 = tslib_1.__importDefault(require("../../components/ControlPanel/ControlPanel"));
10
11
  const ErrorBoundary_1 = require("../../components/ErrorBoundary/ErrorBoundary");
11
12
  const Layout_1 = tslib_1.__importDefault(require("../../components/Layout/Layout"));
12
- const NotFoundBlock_1 = require("../../components/NotFoundBlock/NotFoundBlock");
13
+ const PageSettings_1 = require("../../components/PageSettings/PageSettings");
13
14
  const context_1 = require("../../context");
14
- const useCodeValidator_1 = require("../../hooks/useCodeValidator");
15
- const main_1 = require("../../store/main");
16
- const settings_1 = require("../../store/settings");
17
- const types_1 = require("../../types");
18
- const index_1 = require("../../types/index");
19
- const utils_1 = require("../../utils");
20
15
  const Form_1 = require("../Form/Form");
21
- const Editor = (_a) => {
22
- var { customSchema, onChange, providerProps, transformContent, deviceEmulationSettings, theme: editorTheme } = _a, rest = tslib_1.__rest(_a, ["customSchema", "onChange", "providerProps", "transformContent", "deviceEmulationSettings", "theme"]);
23
- const { content, activeBlockIndex, errorBoundaryState, onContentUpdate, onAdd, onSelect, injectEditBlockProps, } = (0, main_1.useMainState)(rest);
24
- const { viewMode, theme: constructorTheme, onViewModeUpdate, onThemeUpdate, formTab, onFormTabUpdate, codeFullscreeModeOn, onCodeFullscreeModeOnUpdate, } = (0, settings_1.useSettingsState)();
25
- const isEditingMode = viewMode === types_1.ViewModeItem.Edititng;
26
- const isCodeOnlyMode = codeFullscreeModeOn && formTab === index_1.FormTab.Code && viewMode === types_1.ViewModeItem.Edititng;
27
- const transformedContent = (0, react_1.useMemo)(() => (transformContent ? transformContent(content, { viewMode }) : content), [content, transformContent, viewMode]);
28
- const schema = (0, react_1.useMemo)(() => (0, schema_1.generateDefaultSchema)(customSchema), [customSchema]);
29
- const codeValidator = (0, useCodeValidator_1.useCodeValidator)(schema);
30
- const outgoingProps = (0, react_1.useMemo)(() => {
31
- const custom = isEditingMode
32
- ? (0, utils_1.addCustomDecorator)([
33
- (props) => react_1.default.createElement(NotFoundBlock_1.NotFoundBlock, Object.assign({}, props)),
34
- (props) => (react_1.default.createElement(EditBlock_1.default, Object.assign({}, injectEditBlockProps(props)))),
35
- // need errorBoundaryState flag to reset error on content update
36
- (props) => (react_1.default.createElement(ErrorBoundary_1.ErrorBoundary, Object.assign({}, props, { key: `${(0, utils_1.getBlockId)(props)}-${errorBoundaryState}` }))),
37
- ], rest.custom)
38
- : rest.custom;
39
- return {
40
- content: transformedContent,
41
- custom,
42
- viewMode,
43
- };
44
- }, [
45
- injectEditBlockProps,
46
- errorBoundaryState,
47
- isEditingMode,
48
- viewMode,
49
- transformedContent,
50
- rest.custom,
51
- ]);
52
- const context = (0, react_1.useMemo)(() => ({
53
- constructorProps: {
54
- content: transformedContent,
55
- custom: rest.custom,
56
- },
57
- providerProps: Object.assign(Object.assign({}, providerProps), { isMobile: (0, utils_1.checkIsMobile)(viewMode), theme: constructorTheme }),
58
- deviceEmulationSettings,
59
- theme: editorTheme,
60
- }), [
61
- providerProps,
62
- rest.custom,
63
- viewMode,
64
- transformedContent,
65
- deviceEmulationSettings,
66
- constructorTheme,
67
- editorTheme,
68
- ]);
69
- (0, react_1.useEffect)(() => {
70
- onChange === null || onChange === void 0 ? void 0 : onChange(content);
71
- }, [content, onChange]);
16
+ const useEditorState_1 = require("./hooks/useEditorState");
17
+ const b = (0, utils_1.block)('editor');
18
+ const Editor = (props) => {
19
+ const { providerProps } = props;
20
+ const { context, viewMode, editMode, constructorTheme, onThemeUpdate, onViewModeUpdate, onEditModeUpdate, isCodeEditMode, isFormEditMode, isDesktopViewMode, content, schema, onContentUpdate, code, codeValidator, codeFullscreeModeOn, onCodeFullscreeModeOnUpdate, activeBlockIndex, onSelect, isCodeOnlyMode, errorBoundaryState, outgoingProps, onAdd, } = (0, useEditorState_1.useEditorState)(props);
72
21
  return (react_1.default.createElement(context_1.EditorContext.Provider, { value: context },
73
- react_1.default.createElement(Layout_1.default, { mode: viewMode, onModeChange: onViewModeUpdate, theme: constructorTheme, onThemeChange: onThemeUpdate },
74
- isEditingMode && (react_1.default.createElement(Layout_1.default.Left, null,
75
- react_1.default.createElement(Form_1.Form, { content: content, onChange: onContentUpdate, activeBlockIndex: activeBlockIndex, activeTab: formTab, codeFullscreeModeOn: codeFullscreeModeOn, schema: schema, codeValidator: codeValidator, onActiveTabUpdate: onFormTabUpdate, onCodeFullscreeModeOnUpdate: onCodeFullscreeModeOnUpdate, onSelect: onSelect }))),
22
+ react_1.default.createElement(ControlPanel_1.default, { viewMode: viewMode, onViewModeChange: onViewModeUpdate, editMode: editMode, onEditModeChange: onEditModeUpdate, theme: constructorTheme, className: b('panel'), onThemeChange: onThemeUpdate }),
23
+ isFormEditMode && isDesktopViewMode && (react_1.default.createElement(PageSettings_1.PageSettings, { content: content, schema: schema, onChange: onContentUpdate })),
24
+ isCodeEditMode && (react_1.default.createElement(CodeEditor_1.CodeEditor, { code: code, onChange: onContentUpdate, validator: codeValidator, fullscreenModeOn: codeFullscreeModeOn, onFullscreenModeOnUpdate: onCodeFullscreeModeOnUpdate })),
25
+ react_1.default.createElement(Layout_1.default, { editMode: editMode, viewMode: viewMode },
26
+ isFormEditMode && isDesktopViewMode && (react_1.default.createElement(Layout_1.default.Left, null,
27
+ react_1.default.createElement(Form_1.Form, { content: content, onChange: onContentUpdate, activeBlockIndex: activeBlockIndex, schema: schema, onSelect: onSelect }))),
76
28
  !isCodeOnlyMode && (react_1.default.createElement(Layout_1.default.Right, null,
77
29
  react_1.default.createElement(ErrorBoundary_1.ErrorBoundary, { key: errorBoundaryState },
78
30
  react_1.default.createElement(PageConstructor_1.PageConstructorProvider, Object.assign({}, providerProps, { theme: constructorTheme }),
79
31
  react_1.default.createElement(PageConstructor_1.PageConstructor, Object.assign({}, outgoingProps)))),
80
- isEditingMode && react_1.default.createElement(AddBlock_1.default, { onAdd: onAdd }))))));
32
+ isFormEditMode && react_1.default.createElement(AddBlock_1.default, { onAdd: onAdd }))))));
81
33
  };
82
34
  exports.Editor = Editor;
@@ -0,0 +1,14 @@
1
+ import { PageContent } from '../../../../models';
2
+ type UseCodeProps = {
3
+ content: PageContent;
4
+ codeFullscreeModeOn: boolean;
5
+ isCodeEditMode: boolean;
6
+ };
7
+ /**
8
+ * Transorms PageConstructor content in JSON to YAML on code editor mode switching
9
+ *
10
+ * @param {Object} props - props parent from form
11
+ * @returns {string} - updated code
12
+ */
13
+ export declare function useCode({ content, codeFullscreeModeOn, isCodeEditMode }: UseCodeProps): string;
14
+ export {};
@@ -4,36 +4,26 @@ exports.useCode = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = require("react");
6
6
  const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
7
- const usePreviousValue_1 = tslib_1.__importDefault(require("../../hooks/usePreviousValue"));
8
- const types_1 = require("../../types");
7
+ const usePreviousValue_1 = tslib_1.__importDefault(require("../../../hooks/usePreviousValue"));
9
8
  /**
10
9
  * Transorms PageConstructor content in JSON to YAML on code editor mode switching
11
10
  *
12
11
  * @param {Object} props - props parent from form
13
12
  * @returns {string} - updated code
14
13
  */
15
- function useCode({ activeTab, content, codeFullscreeModeOn, }) {
14
+ function useCode({ content, codeFullscreeModeOn, isCodeEditMode }) {
16
15
  var _a;
17
16
  const [code, setCode] = (0, react_1.useState)('');
18
- const prevTab = (0, usePreviousValue_1.default)(activeTab);
19
17
  const prevContentLength = (0, usePreviousValue_1.default)((_a = content.blocks) === null || _a === void 0 ? void 0 : _a.length);
20
18
  const prevCodeFullscreeModeOn = (0, usePreviousValue_1.default)(codeFullscreeModeOn);
21
19
  (0, react_1.useEffect)(() => {
22
20
  var _a;
23
- const switchedToCodeEditing = activeTab !== prevTab && activeTab === types_1.FormTab.Code;
24
21
  const blocksCountChanged = prevContentLength !== ((_a = content.blocks) === null || _a === void 0 ? void 0 : _a.length);
25
22
  const codeModeSwitched = codeFullscreeModeOn !== prevCodeFullscreeModeOn;
26
- if (blocksCountChanged || switchedToCodeEditing || codeModeSwitched) {
23
+ if (blocksCountChanged || isCodeEditMode || codeModeSwitched) {
27
24
  setCode(js_yaml_1.default.dump(content, { lineWidth: -1 }));
28
25
  }
29
- }, [
30
- activeTab,
31
- prevTab,
32
- content,
33
- prevContentLength,
34
- codeFullscreeModeOn,
35
- prevCodeFullscreeModeOn,
36
- ]);
26
+ }, [isCodeEditMode, content, prevContentLength, codeFullscreeModeOn, prevCodeFullscreeModeOn]);
37
27
  return code;
38
28
  }
39
29
  exports.useCode = useCode;
@@ -0,0 +1,49 @@
1
+ import { EditModeItem, EditorProps, ViewModeItem } from '../../../types';
2
+ export declare const useEditorState: ({ customSchema, onChange, providerProps, transformContent, deviceEmulationSettings, theme: editorTheme, ...rest }: EditorProps) => {
3
+ context: {
4
+ constructorProps: {
5
+ content: import("../../../../models").PageContent;
6
+ custom: import("../../../../models").CustomConfig | undefined;
7
+ };
8
+ providerProps: {
9
+ isMobile: boolean;
10
+ theme: import("../../../../models").Theme;
11
+ locale?: import("../../../../context/localeContext").LocaleContextProps | undefined;
12
+ location?: import("../../../../context/locationContext").LocationContextProps | undefined;
13
+ ssrConfig?: import("../../../../context/ssrContext").SSRContextProps | undefined;
14
+ mapsContext?: import("../../../../context/mapsContext/mapsContext").MapsContextType | undefined;
15
+ projectSettings?: import("../../../../context/projectSettingsContext").ProjectSettingsContextProps | undefined;
16
+ analytics?: import("../../../..").AnalyticsContextProps | undefined;
17
+ forms?: import("../../../../context/formsContext").FormsContextProps | undefined;
18
+ image?: import("../../../../context/imageContext").ImageContextProps | undefined;
19
+ };
20
+ deviceEmulationSettings: import("../../../types").DeviceEmulationSettings | undefined;
21
+ theme: import("../../../../models").Theme | undefined;
22
+ };
23
+ viewMode: ViewModeItem;
24
+ editMode: EditModeItem;
25
+ constructorTheme: import("../../../../models").Theme;
26
+ onThemeUpdate: (newTheme: import("../../../../models").Theme) => void;
27
+ onViewModeUpdate: (newViewMode: ViewModeItem) => void;
28
+ onEditModeUpdate: (newEditMode: EditModeItem) => void;
29
+ isCodeEditMode: boolean;
30
+ isDesktopViewMode: boolean;
31
+ content: import("../../../../models").PageContent;
32
+ schema: import("json-schema").JSONSchema4;
33
+ onContentUpdate: (newContent: import("../../../../models").PageContent) => void;
34
+ code: string;
35
+ codeValidator: import("../../../hooks/useCodeValidator").CodeValidator;
36
+ codeFullscreeModeOn: boolean;
37
+ onCodeFullscreeModeOnUpdate: (newCodeFullscreeModeOn: boolean) => void;
38
+ activeBlockIndex: number;
39
+ onSelect: (index: number) => void;
40
+ isCodeOnlyMode: boolean;
41
+ errorBoundaryState: number;
42
+ outgoingProps: {
43
+ content: import("../../../../models").PageContent;
44
+ custom: import("../../../../models").CustomConfig | undefined;
45
+ viewMode: ViewModeItem;
46
+ };
47
+ onAdd: (block: import("../../../../models").Block) => void;
48
+ isFormEditMode: boolean;
49
+ };