@gravity-ui/page-constructor 5.12.0 → 5.14.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.
Files changed (150) hide show
  1. package/build/cjs/blocks/ContentLayout/schema.d.ts +4 -0
  2. package/build/cjs/blocks/Form/schema.d.ts +4 -0
  3. package/build/cjs/blocks/Info/schema.d.ts +8 -0
  4. package/build/cjs/blocks/Map/schema.d.ts +4 -0
  5. package/build/cjs/blocks/Media/schema.d.ts +8 -0
  6. package/build/cjs/blocks/Questions/schema.d.ts +4 -0
  7. package/build/cjs/blocks/Tabs/schema.d.ts +4 -0
  8. package/build/cjs/components/IconWrapper/IconWrapper.css +4 -2
  9. package/build/cjs/components/IconWrapper/IconWrapper.d.ts +2 -2
  10. package/build/cjs/components/IconWrapper/IconWrapper.js +3 -3
  11. package/build/cjs/constructor-items.d.ts +1 -1
  12. package/build/cjs/editor/components/AddBlock/AddBlock.css +1 -2
  13. package/build/cjs/editor/components/CodeEditor/CodeEditor.css +3 -1
  14. package/build/cjs/editor/components/ControlPanel/ControlPanel.css +2 -4
  15. package/build/cjs/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
  16. package/build/cjs/editor/components/ControlPanel/ControlPanel.js +24 -15
  17. package/build/cjs/editor/components/ControlPanel/i18n/en.json +2 -1
  18. package/build/cjs/editor/components/ControlPanel/i18n/index.d.ts +1 -1
  19. package/build/cjs/editor/components/ControlPanel/i18n/ru.json +2 -1
  20. package/build/cjs/editor/components/Layout/Layout.css +10 -6
  21. package/build/cjs/editor/components/Layout/Layout.d.ts +4 -7
  22. package/build/cjs/editor/components/Layout/Layout.js +8 -10
  23. package/build/cjs/editor/components/PageSettings/PageSettings.css +26 -0
  24. package/build/cjs/editor/components/PageSettings/PageSettings.d.ts +11 -0
  25. package/build/cjs/editor/components/PageSettings/PageSettings.js +30 -0
  26. package/build/cjs/editor/components/PageSettings/i18n/en.json +3 -0
  27. package/build/cjs/editor/components/PageSettings/i18n/index.d.ts +1 -0
  28. package/build/cjs/editor/components/PageSettings/i18n/index.js +9 -0
  29. package/build/cjs/editor/components/PageSettings/i18n/ru.json +3 -0
  30. package/build/cjs/editor/containers/Editor/Editor.css +17 -0
  31. package/build/cjs/editor/containers/Editor/Editor.d.ts +1 -1
  32. package/build/cjs/editor/containers/Editor/Editor.js +17 -65
  33. package/build/cjs/editor/containers/Editor/hooks/useCode.d.ts +14 -0
  34. package/build/cjs/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
  35. package/build/cjs/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
  36. package/build/cjs/editor/containers/Editor/hooks/useEditorState.js +99 -0
  37. package/build/cjs/editor/containers/Form/Form.css +0 -10
  38. package/build/cjs/editor/containers/Form/Form.d.ts +1 -8
  39. package/build/cjs/editor/containers/Form/Form.js +14 -39
  40. package/build/cjs/editor/store/main/index.js +1 -1
  41. package/build/cjs/editor/store/settings/index.d.ts +3 -3
  42. package/build/cjs/editor/store/settings/index.js +4 -4
  43. package/build/cjs/editor/store/settings/reducer.d.ts +9 -9
  44. package/build/cjs/editor/store/settings/reducer.js +6 -6
  45. package/build/cjs/editor/types/index.d.ts +3 -4
  46. package/build/cjs/editor/types/index.js +7 -8
  47. package/build/cjs/models/constructor-items/blocks.d.ts +1 -0
  48. package/build/cjs/models/constructor-items/sub-blocks.d.ts +3 -3
  49. package/build/cjs/schema/constants.d.ts +4 -0
  50. package/build/cjs/schema/validators/common.d.ts +6 -0
  51. package/build/cjs/schema/validators/common.js +8 -1
  52. package/build/cjs/sub-blocks/BackgroundCard/BackgroundCard.css +3 -6
  53. package/build/cjs/sub-blocks/BackgroundCard/BackgroundCard.js +2 -5
  54. package/build/cjs/sub-blocks/BackgroundCard/schema.js +2 -2
  55. package/build/cjs/sub-blocks/BasicCard/BasicCard.css +4 -4
  56. package/build/cjs/sub-blocks/BasicCard/BasicCard.js +3 -6
  57. package/build/cjs/sub-blocks/BasicCard/schema.js +2 -2
  58. package/build/cjs/sub-blocks/Content/Content.css +11 -0
  59. package/build/cjs/sub-blocks/Content/Content.js +2 -2
  60. package/build/cjs/sub-blocks/Content/schema.d.ts +8 -0
  61. package/build/cjs/sub-blocks/Content/schema.js +4 -0
  62. package/build/cjs/sub-blocks/ImageCard/ImageCard.css +2 -0
  63. package/build/cjs/sub-blocks/ImageCard/ImageCard.js +4 -2
  64. package/build/cjs/sub-blocks/ImageCard/schema.d.ts +4 -0
  65. package/build/cjs/sub-blocks/ImageCard/schema.js +2 -2
  66. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.css +3 -2
  67. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  68. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.js +4 -6
  69. package/build/cjs/sub-blocks/LayoutItem/schema.d.ts +4 -0
  70. package/build/cjs/sub-blocks/LayoutItem/schema.js +1 -4
  71. package/build/esm/blocks/ContentLayout/schema.d.ts +4 -0
  72. package/build/esm/blocks/Form/schema.d.ts +4 -0
  73. package/build/esm/blocks/Info/schema.d.ts +8 -0
  74. package/build/esm/blocks/Map/schema.d.ts +4 -0
  75. package/build/esm/blocks/Media/schema.d.ts +8 -0
  76. package/build/esm/blocks/Questions/schema.d.ts +4 -0
  77. package/build/esm/blocks/Tabs/schema.d.ts +4 -0
  78. package/build/esm/components/IconWrapper/IconWrapper.css +4 -2
  79. package/build/esm/components/IconWrapper/IconWrapper.d.ts +2 -2
  80. package/build/esm/components/IconWrapper/IconWrapper.js +3 -3
  81. package/build/esm/constructor-items.d.ts +1 -1
  82. package/build/esm/editor/components/AddBlock/AddBlock.css +1 -2
  83. package/build/esm/editor/components/CodeEditor/CodeEditor.css +3 -1
  84. package/build/esm/editor/components/ControlPanel/ControlPanel.css +2 -4
  85. package/build/esm/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
  86. package/build/esm/editor/components/ControlPanel/ControlPanel.js +26 -17
  87. package/build/esm/editor/components/ControlPanel/i18n/en.json +2 -1
  88. package/build/esm/editor/components/ControlPanel/i18n/index.d.ts +1 -1
  89. package/build/esm/editor/components/ControlPanel/i18n/ru.json +2 -1
  90. package/build/esm/editor/components/Layout/Layout.css +10 -6
  91. package/build/esm/editor/components/Layout/Layout.d.ts +4 -7
  92. package/build/esm/editor/components/Layout/Layout.js +9 -11
  93. package/build/esm/editor/components/PageSettings/PageSettings.css +26 -0
  94. package/build/esm/editor/components/PageSettings/PageSettings.d.ts +12 -0
  95. package/build/esm/editor/components/PageSettings/PageSettings.js +27 -0
  96. package/build/esm/editor/components/PageSettings/i18n/en.json +3 -0
  97. package/build/esm/editor/components/PageSettings/i18n/index.d.ts +1 -0
  98. package/build/esm/editor/components/PageSettings/i18n/index.js +5 -0
  99. package/build/esm/editor/components/PageSettings/i18n/ru.json +3 -0
  100. package/build/esm/editor/containers/Editor/Editor.css +17 -0
  101. package/build/esm/editor/containers/Editor/Editor.d.ts +2 -1
  102. package/build/esm/editor/containers/Editor/Editor.js +18 -66
  103. package/build/esm/editor/containers/Editor/hooks/useCode.d.ts +14 -0
  104. package/build/esm/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
  105. package/build/esm/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
  106. package/build/esm/editor/containers/Editor/hooks/useEditorState.js +95 -0
  107. package/build/esm/editor/containers/Form/Form.css +0 -10
  108. package/build/esm/editor/containers/Form/Form.d.ts +1 -8
  109. package/build/esm/editor/containers/Form/Form.js +16 -42
  110. package/build/esm/editor/store/main/index.js +1 -1
  111. package/build/esm/editor/store/settings/index.d.ts +3 -3
  112. package/build/esm/editor/store/settings/index.js +5 -5
  113. package/build/esm/editor/store/settings/reducer.d.ts +9 -9
  114. package/build/esm/editor/store/settings/reducer.js +6 -6
  115. package/build/esm/editor/types/index.d.ts +3 -4
  116. package/build/esm/editor/types/index.js +6 -7
  117. package/build/esm/models/constructor-items/blocks.d.ts +1 -0
  118. package/build/esm/models/constructor-items/sub-blocks.d.ts +3 -3
  119. package/build/esm/schema/constants.d.ts +4 -0
  120. package/build/esm/schema/validators/common.d.ts +6 -0
  121. package/build/esm/schema/validators/common.js +6 -0
  122. package/build/esm/sub-blocks/BackgroundCard/BackgroundCard.css +3 -6
  123. package/build/esm/sub-blocks/BackgroundCard/BackgroundCard.js +3 -6
  124. package/build/esm/sub-blocks/BackgroundCard/schema.js +3 -3
  125. package/build/esm/sub-blocks/BasicCard/BasicCard.css +4 -4
  126. package/build/esm/sub-blocks/BasicCard/BasicCard.js +4 -7
  127. package/build/esm/sub-blocks/BasicCard/schema.js +3 -3
  128. package/build/esm/sub-blocks/Content/Content.css +11 -0
  129. package/build/esm/sub-blocks/Content/Content.js +2 -2
  130. package/build/esm/sub-blocks/Content/schema.d.ts +8 -0
  131. package/build/esm/sub-blocks/Content/schema.js +4 -0
  132. package/build/esm/sub-blocks/ImageCard/ImageCard.css +2 -0
  133. package/build/esm/sub-blocks/ImageCard/ImageCard.js +4 -2
  134. package/build/esm/sub-blocks/ImageCard/schema.d.ts +4 -0
  135. package/build/esm/sub-blocks/ImageCard/schema.js +3 -3
  136. package/build/esm/sub-blocks/LayoutItem/LayoutItem.css +3 -2
  137. package/build/esm/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  138. package/build/esm/sub-blocks/LayoutItem/LayoutItem.js +5 -7
  139. package/build/esm/sub-blocks/LayoutItem/schema.d.ts +4 -0
  140. package/build/esm/sub-blocks/LayoutItem/schema.js +2 -5
  141. package/package.json +1 -1
  142. package/server/models/constructor-items/blocks.d.ts +1 -0
  143. package/server/models/constructor-items/sub-blocks.d.ts +3 -3
  144. package/widget/index.js +1 -1
  145. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
  146. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.js +0 -17
  147. package/build/cjs/editor/containers/Form/hooks.d.ts +0 -8
  148. package/build/esm/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
  149. package/build/esm/editor/components/PagePropsForm/PagePropsForm.js +0 -13
  150. package/build/esm/editor/containers/Form/hooks.d.ts +0 -8
@@ -173,6 +173,10 @@ export declare const ContentLayoutBlock: {
173
173
  };
174
174
  };
175
175
  };
176
+ controlPosition: {
177
+ type: string;
178
+ enum: string[];
179
+ };
176
180
  };
177
181
  };
178
182
  fileContent: {
@@ -164,6 +164,10 @@ export declare const FormBlock: {
164
164
  };
165
165
  };
166
166
  };
167
+ controlPosition: {
168
+ type: string;
169
+ enum: string[];
170
+ };
167
171
  }>;
168
172
  };
169
173
  direction: {
@@ -135,6 +135,10 @@ export declare const InfoBlock: {
135
135
  };
136
136
  };
137
137
  };
138
+ controlPosition: {
139
+ type: string;
140
+ enum: string[];
141
+ };
138
142
  }>;
139
143
  };
140
144
  rightContent: {
@@ -222,6 +226,10 @@ export declare const InfoBlock: {
222
226
  };
223
227
  };
224
228
  };
229
+ controlPosition: {
230
+ type: string;
231
+ enum: string[];
232
+ };
225
233
  }>;
226
234
  };
227
235
  type: {};
@@ -368,6 +368,10 @@ export declare const MapBlock: {
368
368
  };
369
369
  };
370
370
  };
371
+ controlPosition: {
372
+ type: string;
373
+ enum: string[];
374
+ };
371
375
  animated: {
372
376
  type: string;
373
377
  };
@@ -538,6 +538,10 @@ export declare const MediaBlockBaseProps: {
538
538
  };
539
539
  };
540
540
  };
541
+ controlPosition: {
542
+ type: string;
543
+ enum: string[];
544
+ };
541
545
  animated: {
542
546
  type: string;
543
547
  };
@@ -1139,6 +1143,10 @@ export declare const MediaBlock: {
1139
1143
  };
1140
1144
  };
1141
1145
  };
1146
+ controlPosition: {
1147
+ type: string;
1148
+ enum: string[];
1149
+ };
1142
1150
  animated: {
1143
1151
  type: string;
1144
1152
  };
@@ -88,6 +88,10 @@ export declare const QuestionsBlock: {
88
88
  };
89
89
  };
90
90
  };
91
+ controlPosition: {
92
+ type: string;
93
+ enum: string[];
94
+ };
91
95
  anchor: {
92
96
  type: string;
93
97
  additionalProperties: boolean;
@@ -522,6 +522,10 @@ export declare const tabsItem: {
522
522
  };
523
523
  };
524
524
  } | undefined;
525
+ controlPosition?: {
526
+ type: string;
527
+ enum: string[];
528
+ } | undefined;
525
529
  };
526
530
  };
527
531
  export declare const TabsBlock: {
@@ -22,6 +22,8 @@ unpredictable css rules order in build */
22
22
  width: 22px;
23
23
  margin: 1px 12px 1px 0px;
24
24
  }
25
- .pc-icon-wrapper_content_left.pc-icon-wrapper_content_left {
26
- flex: 1 0 0;
25
+ .pc-icon-wrapper__content {
26
+ display: flex;
27
+ flex-direction: column;
28
+ flex: 1 0 auto;
27
29
  }
@@ -1,4 +1,4 @@
1
1
  import { PropsWithChildren } from 'react';
2
- import { IconWrapperProps } from '../../models';
3
- declare const IconWrapper: (props: PropsWithChildren<IconWrapperProps>) => JSX.Element;
2
+ import type { ClassNameProps, IconWrapperProps } from '../../models';
3
+ declare const IconWrapper: (props: PropsWithChildren<IconWrapperProps> & ClassNameProps) => JSX.Element;
4
4
  export default IconWrapper;
@@ -7,14 +7,14 @@ const Image_1 = tslib_1.__importDefault(require("../Image/Image"));
7
7
  const utils_2 = require("../Media/Image/utils");
8
8
  const b = (0, utils_1.block)('icon-wrapper');
9
9
  const IconWrapper = (props) => {
10
- const { icon, children } = props;
10
+ const { icon, children, className } = props;
11
11
  if (!icon) {
12
12
  return react_1.default.createElement(react_1.Fragment, null, children);
13
13
  }
14
14
  const iconProps = (0, utils_2.getMediaImage)(icon.value);
15
15
  const iconPosition = icon === null || icon === void 0 ? void 0 : icon.position;
16
- return (react_1.default.createElement("div", { className: b({ ['icon-position']: iconPosition }) },
16
+ return (react_1.default.createElement("div", { className: b({ ['icon-position']: iconPosition }, className) },
17
17
  iconProps && (react_1.default.createElement(Image_1.default, Object.assign({}, iconProps, { containerClassName: b('icon-container'), className: b('icon', { ['icon-position']: iconPosition }) }))),
18
- react_1.default.createElement("div", { className: b({ ['content']: iconPosition }) }, children)));
18
+ react_1.default.createElement("div", { className: b('content') }, children)));
19
19
  };
20
20
  exports.default = IconWrapper;
@@ -24,7 +24,7 @@ export declare const subBlockMap: {
24
24
  "price-detailed": (props: import("./models").PriceDetailedProps) => JSX.Element;
25
25
  "media-card": ({ border, analyticsEvents, ...mediaProps }: import("./models").MediaCardProps) => JSX.Element;
26
26
  "banner-card": (props: import("./models").BannerCardProps) => JSX.Element;
27
- "layout-item": ({ content: { links, buttons, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, controlPosition, }: import("./models").LayoutItemProps) => JSX.Element;
27
+ "layout-item": ({ content: { links, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, controlPosition, }: import("./models").LayoutItemProps) => JSX.Element;
28
28
  "background-card": (props: import("./models").BackgroundCardProps) => JSX.Element;
29
29
  "basic-card": (props: import("./models").BasicCardProps) => JSX.Element;
30
30
  content: (props: import("./sub-blocks/Content/Content").ContentProps) => JSX.Element;
@@ -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 {};