@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.
- package/build/cjs/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +1 -0
- package/build/cjs/editor/components/AddBlock/AddBlock.css +1 -2
- package/build/cjs/editor/components/CodeEditor/CodeEditor.css +3 -1
- package/build/cjs/editor/components/ControlPanel/ControlPanel.css +2 -4
- package/build/cjs/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
- package/build/cjs/editor/components/ControlPanel/ControlPanel.js +24 -15
- package/build/cjs/editor/components/ControlPanel/i18n/en.json +2 -1
- package/build/cjs/editor/components/ControlPanel/i18n/index.d.ts +1 -1
- package/build/cjs/editor/components/ControlPanel/i18n/ru.json +2 -1
- package/build/cjs/editor/components/Layout/Layout.css +10 -6
- package/build/cjs/editor/components/Layout/Layout.d.ts +4 -7
- package/build/cjs/editor/components/Layout/Layout.js +8 -10
- package/build/cjs/editor/components/PageSettings/PageSettings.css +26 -0
- package/build/cjs/editor/components/PageSettings/PageSettings.d.ts +11 -0
- package/build/cjs/editor/components/PageSettings/PageSettings.js +30 -0
- package/build/cjs/editor/components/PageSettings/i18n/en.json +3 -0
- package/build/cjs/editor/components/PageSettings/i18n/index.d.ts +1 -0
- package/build/cjs/editor/components/PageSettings/i18n/index.js +9 -0
- package/build/cjs/editor/components/PageSettings/i18n/ru.json +3 -0
- package/build/cjs/editor/containers/Editor/Editor.css +17 -0
- package/build/cjs/editor/containers/Editor/Editor.d.ts +1 -1
- package/build/cjs/editor/containers/Editor/Editor.js +17 -65
- package/build/cjs/editor/containers/Editor/hooks/useCode.d.ts +14 -0
- package/build/cjs/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
- package/build/cjs/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
- package/build/cjs/editor/containers/Editor/hooks/useEditorState.js +99 -0
- package/build/cjs/editor/containers/Form/Form.css +0 -10
- package/build/cjs/editor/containers/Form/Form.d.ts +1 -8
- package/build/cjs/editor/containers/Form/Form.js +14 -39
- package/build/cjs/editor/store/main/index.js +1 -1
- package/build/cjs/editor/store/settings/index.d.ts +3 -3
- package/build/cjs/editor/store/settings/index.js +4 -4
- package/build/cjs/editor/store/settings/reducer.d.ts +9 -9
- package/build/cjs/editor/store/settings/reducer.js +6 -6
- package/build/cjs/editor/types/index.d.ts +3 -4
- package/build/cjs/editor/types/index.js +7 -8
- package/build/esm/blocks/Questions/QuestionBlockItem/QuestionBlockItem.css +1 -0
- package/build/esm/editor/components/AddBlock/AddBlock.css +1 -2
- package/build/esm/editor/components/CodeEditor/CodeEditor.css +3 -1
- package/build/esm/editor/components/ControlPanel/ControlPanel.css +2 -4
- package/build/esm/editor/components/ControlPanel/ControlPanel.d.ts +4 -2
- package/build/esm/editor/components/ControlPanel/ControlPanel.js +26 -17
- package/build/esm/editor/components/ControlPanel/i18n/en.json +2 -1
- package/build/esm/editor/components/ControlPanel/i18n/index.d.ts +1 -1
- package/build/esm/editor/components/ControlPanel/i18n/ru.json +2 -1
- package/build/esm/editor/components/Layout/Layout.css +10 -6
- package/build/esm/editor/components/Layout/Layout.d.ts +4 -7
- package/build/esm/editor/components/Layout/Layout.js +9 -11
- package/build/esm/editor/components/PageSettings/PageSettings.css +26 -0
- package/build/esm/editor/components/PageSettings/PageSettings.d.ts +12 -0
- package/build/esm/editor/components/PageSettings/PageSettings.js +27 -0
- package/build/esm/editor/components/PageSettings/i18n/en.json +3 -0
- package/build/esm/editor/components/PageSettings/i18n/index.d.ts +1 -0
- package/build/esm/editor/components/PageSettings/i18n/index.js +5 -0
- package/build/esm/editor/components/PageSettings/i18n/ru.json +3 -0
- package/build/esm/editor/containers/Editor/Editor.css +17 -0
- package/build/esm/editor/containers/Editor/Editor.d.ts +2 -1
- package/build/esm/editor/containers/Editor/Editor.js +18 -66
- package/build/esm/editor/containers/Editor/hooks/useCode.d.ts +14 -0
- package/build/esm/editor/containers/{Form/hooks.js → Editor/hooks/useCode.js} +4 -14
- package/build/esm/editor/containers/Editor/hooks/useEditorState.d.ts +49 -0
- package/build/esm/editor/containers/Editor/hooks/useEditorState.js +95 -0
- package/build/esm/editor/containers/Form/Form.css +0 -10
- package/build/esm/editor/containers/Form/Form.d.ts +1 -8
- package/build/esm/editor/containers/Form/Form.js +16 -42
- package/build/esm/editor/store/main/index.js +1 -1
- package/build/esm/editor/store/settings/index.d.ts +3 -3
- package/build/esm/editor/store/settings/index.js +5 -5
- package/build/esm/editor/store/settings/reducer.d.ts +9 -9
- package/build/esm/editor/store/settings/reducer.js +6 -6
- package/build/esm/editor/types/index.d.ts +3 -4
- package/build/esm/editor/types/index.js +6 -7
- package/package.json +1 -1
- package/widget/index.js +1 -1
- package/build/cjs/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
- package/build/cjs/editor/components/PagePropsForm/PagePropsForm.js +0 -17
- package/build/cjs/editor/containers/Form/hooks.d.ts +0 -8
- package/build/esm/editor/components/PagePropsForm/PagePropsForm.d.ts +0 -10
- package/build/esm/editor/components/PagePropsForm/PagePropsForm.js +0 -13
- package/build/esm/editor/containers/Form/hooks.d.ts +0 -8
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useEditorState = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const schema_1 = require("../../../../schema");
|
|
7
|
+
const EditBlock_1 = tslib_1.__importDefault(require("../../../components/EditBlock/EditBlock"));
|
|
8
|
+
const ErrorBoundary_1 = require("../../../components/ErrorBoundary/ErrorBoundary");
|
|
9
|
+
const NotFoundBlock_1 = require("../../../components/NotFoundBlock/NotFoundBlock");
|
|
10
|
+
const useCodeValidator_1 = require("../../../hooks/useCodeValidator");
|
|
11
|
+
const main_1 = require("../../../store/main");
|
|
12
|
+
const settings_1 = require("../../../store/settings");
|
|
13
|
+
const types_1 = require("../../../types");
|
|
14
|
+
const utils_1 = require("../../../utils");
|
|
15
|
+
const useCode_1 = require("./useCode");
|
|
16
|
+
// Editor business logic
|
|
17
|
+
const useEditorState = (_a) => {
|
|
18
|
+
var { customSchema, onChange, providerProps, transformContent, deviceEmulationSettings, theme: editorTheme } = _a, rest = tslib_1.__rest(_a, ["customSchema", "onChange", "providerProps", "transformContent", "deviceEmulationSettings", "theme"]);
|
|
19
|
+
const { content, activeBlockIndex, errorBoundaryState, onContentUpdate, onAdd, onSelect, injectEditBlockProps, } = (0, main_1.useMainState)(rest);
|
|
20
|
+
const { viewMode, editMode, onEditModeUpdate, theme: constructorTheme, onViewModeUpdate, onThemeUpdate, codeFullscreeModeOn, onCodeFullscreeModeOnUpdate, } = (0, settings_1.useSettingsState)();
|
|
21
|
+
const isCodeEditMode = editMode === types_1.EditModeItem.Code;
|
|
22
|
+
const isViewEditMode = editMode === types_1.EditModeItem.View;
|
|
23
|
+
const isFormEditMode = editMode === types_1.EditModeItem.Form;
|
|
24
|
+
const isDesktopViewMode = viewMode === types_1.ViewModeItem.Desktop;
|
|
25
|
+
const isCodeOnlyMode = codeFullscreeModeOn && isCodeEditMode;
|
|
26
|
+
const transformedContent = (0, react_1.useMemo)(() => (transformContent ? transformContent(content, { viewMode }) : content), [content, transformContent, viewMode]);
|
|
27
|
+
const schema = (0, react_1.useMemo)(() => (0, schema_1.generateDefaultSchema)(customSchema), [customSchema]);
|
|
28
|
+
const codeValidator = (0, useCodeValidator_1.useCodeValidator)(schema);
|
|
29
|
+
const outgoingProps = (0, react_1.useMemo)(() => {
|
|
30
|
+
const custom = isCodeEditMode || isViewEditMode
|
|
31
|
+
? rest.custom
|
|
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
|
+
return {
|
|
39
|
+
content: transformedContent,
|
|
40
|
+
custom,
|
|
41
|
+
viewMode,
|
|
42
|
+
};
|
|
43
|
+
}, [
|
|
44
|
+
injectEditBlockProps,
|
|
45
|
+
errorBoundaryState,
|
|
46
|
+
viewMode,
|
|
47
|
+
transformedContent,
|
|
48
|
+
rest.custom,
|
|
49
|
+
isCodeEditMode,
|
|
50
|
+
isViewEditMode,
|
|
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]);
|
|
72
|
+
const code = (0, useCode_1.useCode)({ isCodeEditMode, content, codeFullscreeModeOn });
|
|
73
|
+
return {
|
|
74
|
+
context,
|
|
75
|
+
viewMode,
|
|
76
|
+
editMode,
|
|
77
|
+
constructorTheme,
|
|
78
|
+
onThemeUpdate,
|
|
79
|
+
onViewModeUpdate,
|
|
80
|
+
onEditModeUpdate,
|
|
81
|
+
isCodeEditMode,
|
|
82
|
+
isDesktopViewMode,
|
|
83
|
+
content,
|
|
84
|
+
schema,
|
|
85
|
+
onContentUpdate,
|
|
86
|
+
code,
|
|
87
|
+
codeValidator,
|
|
88
|
+
codeFullscreeModeOn,
|
|
89
|
+
onCodeFullscreeModeOnUpdate,
|
|
90
|
+
activeBlockIndex,
|
|
91
|
+
onSelect,
|
|
92
|
+
isCodeOnlyMode,
|
|
93
|
+
errorBoundaryState,
|
|
94
|
+
outgoingProps,
|
|
95
|
+
onAdd,
|
|
96
|
+
isFormEditMode,
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
exports.useEditorState = useEditorState;
|
|
@@ -82,16 +82,6 @@ unpredictable css rules order in build */
|
|
|
82
82
|
.pc-editor-form + .pc-editor-form {
|
|
83
83
|
margin-top: 12px;
|
|
84
84
|
}
|
|
85
|
-
.pc-editor-form__tabs {
|
|
86
|
-
--g-color-base-brand: var(--pc-color-base-neon);
|
|
87
|
-
margin-bottom: 20px;
|
|
88
|
-
}
|
|
89
85
|
.pc-editor-form__block-form {
|
|
90
86
|
margin-bottom: 16px;
|
|
91
|
-
}
|
|
92
|
-
.pc-editor-form_code-editor-active {
|
|
93
|
-
height: calc(100% - var(--pc-editor-code-header-height));
|
|
94
|
-
}
|
|
95
|
-
.pc-editor-form_code-editor-active .pc-editor-form__tabs {
|
|
96
|
-
margin-bottom: 0;
|
|
97
87
|
}
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { JSONSchema4 } from 'json-schema';
|
|
3
3
|
import { PageContent } from '../../../models';
|
|
4
|
-
import { FormTab } from '../../types';
|
|
5
|
-
import { CodeEditorMessageProps } from '../../utils/validation';
|
|
6
4
|
export interface FormProps {
|
|
7
5
|
content: PageContent;
|
|
8
6
|
schema: JSONSchema4;
|
|
9
7
|
activeBlockIndex: number;
|
|
10
|
-
activeTab: FormTab;
|
|
11
|
-
codeFullscreeModeOn: boolean;
|
|
12
|
-
onActiveTabUpdate: (tab: FormTab) => void;
|
|
13
|
-
onCodeFullscreeModeOnUpdate: (codeFullscreeModeOn: boolean) => void;
|
|
14
|
-
codeValidator: (code: string) => CodeEditorMessageProps;
|
|
15
8
|
onChange: (content: PageContent) => void;
|
|
16
9
|
onSelect: (index: number) => void;
|
|
17
10
|
}
|
|
18
|
-
export declare const Form: React.MemoExoticComponent<({ content, onChange, activeBlockIndex, onSelect, schema
|
|
11
|
+
export declare const Form: React.MemoExoticComponent<({ content, onChange, activeBlockIndex, onSelect, schema }: FormProps) => JSX.Element>;
|
|
@@ -6,47 +6,22 @@ const react_1 = tslib_1.__importStar(require("react"));
|
|
|
6
6
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
7
|
const utils_1 = require("../../../utils");
|
|
8
8
|
const BlockForm_1 = require("../../components/BlockForm/BlockForm");
|
|
9
|
-
const CodeEditor_1 = require("../../components/CodeEditor/CodeEditor");
|
|
10
|
-
const PagePropsForm_1 = require("../../components/PagePropsForm/PagePropsForm");
|
|
11
9
|
const useFormSpec_1 = tslib_1.__importDefault(require("../../hooks/useFormSpec"));
|
|
12
|
-
const types_1 = require("../../types");
|
|
13
|
-
const hooks_1 = require("./hooks");
|
|
14
10
|
const b = (0, utils_1.block)('editor-form');
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}));
|
|
19
|
-
exports.Form = (0, react_1.memo)(({ content, onChange, activeBlockIndex, onSelect, schema, codeValidator, activeTab, onActiveTabUpdate, codeFullscreeModeOn, onCodeFullscreeModeOnUpdate, }) => {
|
|
20
|
-
const _a = content || {}, { blocks } = _a, page = tslib_1.__rest(_a, ["blocks"]);
|
|
21
|
-
const code = (0, hooks_1.useCode)({ activeTab, content, codeFullscreeModeOn });
|
|
11
|
+
// TODO in https://github.com/gravity-ui/page-constructor/issues/884 this component will be extremely refactor
|
|
12
|
+
exports.Form = (0, react_1.memo)(({ content, onChange, activeBlockIndex, onSelect, schema }) => {
|
|
13
|
+
const { blocks } = content || {};
|
|
22
14
|
const spec = (0, useFormSpec_1.default)(schema);
|
|
23
|
-
const { blocks: blocksSpec
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
react_1.default.createElement(BlockForm_1.BlockForm, { spec: blocksSpec[blockData.type], data: blockData, active: activeBlockIndex === index, onChange: (data) => {
|
|
35
|
-
onChange(Object.assign(Object.assign({}, content), { blocks: [
|
|
36
|
-
...blocks.slice(0, index),
|
|
37
|
-
data,
|
|
38
|
-
...blocks.slice(index + 1),
|
|
39
|
-
] }));
|
|
40
|
-
}, onSelect: () => onSelect(index) }))) : null)));
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
case types_1.FormTab.Code: {
|
|
44
|
-
form = (react_1.default.createElement(CodeEditor_1.CodeEditor, { code: code, onChange: onChange, validator: codeValidator, fullscreenModeOn: codeFullscreeModeOn, onFullscreenModeOnUpdate: onCodeFullscreeModeOnUpdate }));
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return (react_1.default.createElement("div", { className: b({ 'code-editor-active': activeTab === types_1.FormTab.Code }) },
|
|
49
|
-
react_1.default.createElement(uikit_1.Tabs, { activeTab: activeTab, className: b('tabs'), items: tabsItems, onSelectTab: onActiveTabUpdate }),
|
|
50
|
-
form));
|
|
15
|
+
const { blocks: blocksSpec } = spec || {};
|
|
16
|
+
return (react_1.default.createElement("div", { className: b() },
|
|
17
|
+
react_1.default.createElement(uikit_1.Text, { variant: "body-2" }, 'Blocks'),
|
|
18
|
+
blocks.map((blockData, index) => blocksSpec[blockData.type] ? (react_1.default.createElement("div", { className: b('block-form'), key: (0, utils_1.getBlockKey)(blockData, index) },
|
|
19
|
+
react_1.default.createElement(BlockForm_1.BlockForm, { spec: blocksSpec[blockData.type], data: blockData, active: activeBlockIndex === index, onChange: (data) => {
|
|
20
|
+
onChange(Object.assign(Object.assign({}, content), { blocks: [
|
|
21
|
+
...blocks.slice(0, index),
|
|
22
|
+
data,
|
|
23
|
+
...blocks.slice(index + 1),
|
|
24
|
+
] }));
|
|
25
|
+
}, onSelect: () => onSelect(index) }))) : null)));
|
|
51
26
|
});
|
|
52
27
|
exports.Form.displayName = 'Form';
|
|
@@ -15,7 +15,7 @@ function useMainState({ content: intialContent, custom }) {
|
|
|
15
15
|
activeBlockIndex: 0,
|
|
16
16
|
errorBoundaryState: 0,
|
|
17
17
|
content: (0, utils_2.addEditorProps)(intialContent),
|
|
18
|
-
viewMode: types_1.ViewModeItem.
|
|
18
|
+
viewMode: types_1.ViewModeItem.Desktop,
|
|
19
19
|
theme: constants_1.DEFAULT_THEME,
|
|
20
20
|
});
|
|
21
21
|
return (0, react_1.useMemo)(() => {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Theme } from '../../../models';
|
|
2
|
-
import {
|
|
2
|
+
import { EditModeItem, ViewModeItem } from '../../types';
|
|
3
3
|
export declare function useSettingsState(): {
|
|
4
|
-
formTab: FormTab;
|
|
5
4
|
viewMode: ViewModeItem;
|
|
5
|
+
editMode: EditModeItem;
|
|
6
6
|
theme: Theme;
|
|
7
7
|
codeFullscreeModeOn: boolean;
|
|
8
|
-
onFormTabUpdate: (newFormTab: FormTab) => void;
|
|
9
8
|
onViewModeUpdate: (newViewMode: ViewModeItem) => void;
|
|
9
|
+
onEditModeUpdate: (newEditMode: EditModeItem) => void;
|
|
10
10
|
onThemeUpdate: (newTheme: Theme) => void;
|
|
11
11
|
onCodeFullscreeModeOnUpdate: (newCodeFullscreeModeOn: boolean) => void;
|
|
12
12
|
};
|
|
@@ -4,18 +4,18 @@ exports.useSettingsState = void 0;
|
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const reducer_1 = require("./reducer");
|
|
6
6
|
function useSettingsState() {
|
|
7
|
-
const [{
|
|
7
|
+
const [{ viewMode, editMode, theme, codeFullscreeModeOn }, dispatch] = (0, react_1.useReducer)(reducer_1.reducer, reducer_1.initialState);
|
|
8
8
|
return (0, react_1.useMemo)(() => {
|
|
9
9
|
return {
|
|
10
|
-
formTab,
|
|
11
10
|
viewMode,
|
|
11
|
+
editMode,
|
|
12
12
|
theme,
|
|
13
13
|
codeFullscreeModeOn,
|
|
14
|
-
onFormTabUpdate: (newFormTab) => dispatch({ type: reducer_1.UPDATE_FORM_TAB, payload: newFormTab }),
|
|
15
14
|
onViewModeUpdate: (newViewMode) => dispatch({ type: reducer_1.UPDATE_VIEW_MODE, payload: newViewMode }),
|
|
15
|
+
onEditModeUpdate: (newEditMode) => dispatch({ type: reducer_1.UPDATE_EDIT_MODE, payload: newEditMode }),
|
|
16
16
|
onThemeUpdate: (newTheme) => dispatch({ type: reducer_1.UPDATE_THEME, payload: newTheme }),
|
|
17
17
|
onCodeFullscreeModeOnUpdate: (newCodeFullscreeModeOn) => dispatch({ type: reducer_1.UPDATE_CODE_FULLSCREEN_MODE_ON, payload: newCodeFullscreeModeOn }),
|
|
18
18
|
};
|
|
19
|
-
}, [
|
|
19
|
+
}, [viewMode, theme, codeFullscreeModeOn, editMode]);
|
|
20
20
|
}
|
|
21
21
|
exports.useSettingsState = useSettingsState;
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { Theme } from '../../../models';
|
|
2
|
-
import {
|
|
3
|
-
export declare const UPDATE_FORM_TAB = "UPDATE_FORM_TAB";
|
|
2
|
+
import { EditModeItem, ViewModeItem } from '../../types';
|
|
4
3
|
export declare const UPDATE_CODE_FULLSCREEN_MODE_ON = "UPDATE_CODE_FULLSCREEN_MODE_ON";
|
|
5
4
|
export declare const UPDATE_VIEW_MODE = "UPDATE_VIEW_MODE";
|
|
5
|
+
export declare const UPDATE_EDIT_MODE = "UPDATE_EDIT_MODE";
|
|
6
6
|
export declare const UPDATE_THEME = "UPDATE_THEME";
|
|
7
7
|
interface EditorSettingsState {
|
|
8
8
|
theme: Theme;
|
|
9
9
|
viewMode: ViewModeItem;
|
|
10
|
+
editMode: EditModeItem;
|
|
10
11
|
codeFullscreeModeOn: boolean;
|
|
11
|
-
formTab: FormTab;
|
|
12
12
|
}
|
|
13
13
|
interface UpdateViewMode {
|
|
14
14
|
type: typeof UPDATE_VIEW_MODE;
|
|
15
15
|
payload: ViewModeItem;
|
|
16
16
|
}
|
|
17
|
+
interface UpdateEditMode {
|
|
18
|
+
type: typeof UPDATE_EDIT_MODE;
|
|
19
|
+
payload: EditModeItem;
|
|
20
|
+
}
|
|
17
21
|
interface UpdateTheme {
|
|
18
22
|
type: typeof UPDATE_THEME;
|
|
19
23
|
payload: Theme;
|
|
@@ -22,16 +26,12 @@ interface UpdateCodeFullscreenModeOn {
|
|
|
22
26
|
type: typeof UPDATE_CODE_FULLSCREEN_MODE_ON;
|
|
23
27
|
payload: boolean;
|
|
24
28
|
}
|
|
25
|
-
|
|
26
|
-
type: typeof UPDATE_FORM_TAB;
|
|
27
|
-
payload: FormTab;
|
|
28
|
-
}
|
|
29
|
-
export type EditorSettingsAction = UpdateViewMode | UpdateTheme | UpdateCodeFullscreenModeOn | UpdateFormTab;
|
|
29
|
+
export type EditorSettingsAction = UpdateViewMode | UpdateEditMode | UpdateTheme | UpdateCodeFullscreenModeOn;
|
|
30
30
|
export declare const reducer: (state: EditorSettingsState, action: EditorSettingsAction) => EditorSettingsState;
|
|
31
31
|
export declare const initialState: {
|
|
32
32
|
viewMode: ViewModeItem;
|
|
33
|
+
editMode: EditModeItem;
|
|
33
34
|
theme: Theme;
|
|
34
35
|
codeFullscreeModeOn: boolean;
|
|
35
|
-
formTab: FormTab;
|
|
36
36
|
};
|
|
37
37
|
export {};
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.initialState = exports.reducer = exports.UPDATE_THEME = exports.
|
|
3
|
+
exports.initialState = exports.reducer = exports.UPDATE_THEME = exports.UPDATE_EDIT_MODE = exports.UPDATE_VIEW_MODE = exports.UPDATE_CODE_FULLSCREEN_MODE_ON = void 0;
|
|
4
4
|
const constants_1 = require("../../../components/constants");
|
|
5
5
|
const types_1 = require("../../types");
|
|
6
6
|
// actions
|
|
7
|
-
exports.UPDATE_FORM_TAB = 'UPDATE_FORM_TAB';
|
|
8
7
|
exports.UPDATE_CODE_FULLSCREEN_MODE_ON = 'UPDATE_CODE_FULLSCREEN_MODE_ON';
|
|
9
8
|
exports.UPDATE_VIEW_MODE = 'UPDATE_VIEW_MODE';
|
|
9
|
+
exports.UPDATE_EDIT_MODE = 'UPDATE_EDIT_MODE';
|
|
10
10
|
exports.UPDATE_THEME = 'UPDATE_THEME';
|
|
11
11
|
// reducer
|
|
12
12
|
const reducer = (state, action) => {
|
|
13
13
|
switch (action.type) {
|
|
14
14
|
case exports.UPDATE_VIEW_MODE:
|
|
15
15
|
return Object.assign(Object.assign({}, state), { viewMode: action.payload });
|
|
16
|
+
case exports.UPDATE_EDIT_MODE:
|
|
17
|
+
return Object.assign(Object.assign({}, state), { editMode: action.payload });
|
|
16
18
|
case exports.UPDATE_THEME:
|
|
17
19
|
return Object.assign(Object.assign({}, state), { theme: action.payload });
|
|
18
20
|
case exports.UPDATE_CODE_FULLSCREEN_MODE_ON:
|
|
19
21
|
return Object.assign(Object.assign({}, state), { codeFullscreeModeOn: action.payload });
|
|
20
|
-
case exports.UPDATE_FORM_TAB:
|
|
21
|
-
return Object.assign(Object.assign({}, state), { formTab: action.payload });
|
|
22
22
|
default:
|
|
23
23
|
return state;
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
exports.reducer = reducer;
|
|
27
27
|
exports.initialState = {
|
|
28
|
-
viewMode: types_1.ViewModeItem.
|
|
28
|
+
viewMode: types_1.ViewModeItem.Desktop,
|
|
29
|
+
editMode: types_1.EditModeItem.Form,
|
|
29
30
|
theme: constants_1.DEFAULT_THEME,
|
|
30
31
|
codeFullscreeModeOn: false,
|
|
31
|
-
formTab: types_1.FormTab.Blocks,
|
|
32
32
|
};
|
|
@@ -29,14 +29,13 @@ export interface EditBlockProps extends EditBlockEditorProps, BlockDecorationPro
|
|
|
29
29
|
isHeader?: boolean;
|
|
30
30
|
}
|
|
31
31
|
export declare enum ViewModeItem {
|
|
32
|
-
Edititng = "editing",
|
|
33
32
|
Desktop = "desktop",
|
|
34
33
|
Tablet = "tablet",
|
|
35
34
|
Mobile = "mobile"
|
|
36
35
|
}
|
|
37
|
-
export declare enum
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
export declare enum EditModeItem {
|
|
37
|
+
View = "view",
|
|
38
|
+
Form = "form",
|
|
40
39
|
Code = "code"
|
|
41
40
|
}
|
|
42
41
|
export {};
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.EditModeItem = exports.ViewModeItem = void 0;
|
|
4
4
|
var ViewModeItem;
|
|
5
5
|
(function (ViewModeItem) {
|
|
6
|
-
ViewModeItem["Edititng"] = "editing";
|
|
7
6
|
ViewModeItem["Desktop"] = "desktop";
|
|
8
7
|
ViewModeItem["Tablet"] = "tablet";
|
|
9
8
|
ViewModeItem["Mobile"] = "mobile";
|
|
10
9
|
})(ViewModeItem = exports.ViewModeItem || (exports.ViewModeItem = {}));
|
|
11
|
-
var
|
|
12
|
-
(function (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
})(
|
|
10
|
+
var EditModeItem;
|
|
11
|
+
(function (EditModeItem) {
|
|
12
|
+
EditModeItem["View"] = "view";
|
|
13
|
+
EditModeItem["Form"] = "form";
|
|
14
|
+
EditModeItem["Code"] = "code";
|
|
15
|
+
})(EditModeItem = exports.EditModeItem || (exports.EditModeItem = {}));
|
|
@@ -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-
|
|
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,11 +1,13 @@
|
|
|
1
1
|
import { ClassNameProps, Theme } from '../../../models';
|
|
2
|
-
import { ViewModeItem } from '../../types';
|
|
2
|
+
import { EditModeItem, ViewModeItem } from '../../types';
|
|
3
3
|
import './ControlPanel.css';
|
|
4
4
|
export interface ControlPanelProps extends ClassNameProps {
|
|
5
5
|
viewMode?: ViewModeItem;
|
|
6
|
+
editMode?: EditModeItem;
|
|
6
7
|
onViewModeChange: (viewMode: ViewModeItem) => void;
|
|
8
|
+
onEditModeChange: (editMode: EditModeItem) => void;
|
|
7
9
|
theme: Theme;
|
|
8
10
|
onThemeChange: (theme: Theme) => void;
|
|
9
11
|
}
|
|
10
|
-
declare const ControlPanel: ({ viewMode, onViewModeChange, className, theme, onThemeChange, }: ControlPanelProps) => JSX.Element;
|
|
12
|
+
declare const ControlPanel: ({ viewMode, editMode, onViewModeChange, onEditModeChange, className, theme, onThemeChange, }: ControlPanelProps) => JSX.Element;
|
|
11
13
|
export default ControlPanel;
|
|
@@ -1,33 +1,42 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Display,
|
|
2
|
+
import { Code, Display, Eye, Smartphone, SquareDashedText } from '@gravity-ui/icons';
|
|
3
3
|
import { RadioButton, Select } from '@gravity-ui/uikit';
|
|
4
4
|
import { Theme, themeNames } from '../../../models';
|
|
5
5
|
import { block } from '../../../utils';
|
|
6
6
|
import { Tablet } from '../../icons/Tablet';
|
|
7
|
-
import { ViewModeItem } from '../../types';
|
|
7
|
+
import { EditModeItem, ViewModeItem } from '../../types';
|
|
8
8
|
import { i18n } from './i18n';
|
|
9
9
|
import './ControlPanel.css';
|
|
10
10
|
const ICON_SIZE = 14;
|
|
11
11
|
const b = block('control-panel');
|
|
12
12
|
const ControlPanelViewModeIcons = {
|
|
13
|
-
[ViewModeItem.Edititng]: Pencil,
|
|
14
13
|
[ViewModeItem.Desktop]: Display,
|
|
15
14
|
[ViewModeItem.Tablet]: Tablet,
|
|
16
15
|
[ViewModeItem.Mobile]: Smartphone,
|
|
17
16
|
};
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
React.createElement("span", null, i18n('mode')),
|
|
23
|
-
React.createElement(RadioButton, { className: b('radio-button'), value: viewMode, onUpdate: (value) => onViewModeChange(value) }, Object.values(ViewModeItem).map((item) => {
|
|
24
|
-
const Icon = ControlPanelViewModeIcons[item];
|
|
25
|
-
return (React.createElement(RadioButton.Option, { key: item, value: item },
|
|
26
|
-
React.createElement("span", { className: b('icon') },
|
|
27
|
-
React.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
|
|
28
|
-
}))),
|
|
29
|
-
React.createElement("div", { className: b('theme-switch') },
|
|
30
|
-
React.createElement("span", null, i18n('theme')),
|
|
31
|
-
React.createElement(Select, { value: [theme], onUpdate: (value) => onThemeChange(value[0]) }, Object.values(Theme).map((item) => (React.createElement(Select.Option, { key: item, value: item }, themeNames[item])))))));
|
|
17
|
+
const ControlPanelEditModeIcons = {
|
|
18
|
+
[EditModeItem.View]: Eye,
|
|
19
|
+
[EditModeItem.Form]: SquareDashedText,
|
|
20
|
+
[EditModeItem.Code]: Code,
|
|
32
21
|
};
|
|
22
|
+
const ControlPanel = ({ viewMode = ViewModeItem.Desktop, editMode = EditModeItem.Form, onViewModeChange, onEditModeChange, className, theme, onThemeChange, }) => (React.createElement("div", { className: b(null, className) },
|
|
23
|
+
React.createElement("div", { className: b('switch-container') },
|
|
24
|
+
React.createElement("span", null, i18n('edit_mode')),
|
|
25
|
+
React.createElement(RadioButton, { className: b('radio-button'), value: editMode, onUpdate: (value) => onEditModeChange(value) }, Object.values(EditModeItem).map((item) => {
|
|
26
|
+
const Icon = ControlPanelEditModeIcons[item];
|
|
27
|
+
return (React.createElement(RadioButton.Option, { key: item, value: item },
|
|
28
|
+
React.createElement("span", { className: b('icon') },
|
|
29
|
+
React.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
|
|
30
|
+
}))),
|
|
31
|
+
React.createElement("div", { className: b('switch-container') },
|
|
32
|
+
React.createElement("span", null, i18n('view_mode')),
|
|
33
|
+
React.createElement(RadioButton, { className: b('radio-button'), value: viewMode, onUpdate: (value) => onViewModeChange(value) }, Object.values(ViewModeItem).map((item) => {
|
|
34
|
+
const Icon = ControlPanelViewModeIcons[item];
|
|
35
|
+
return (React.createElement(RadioButton.Option, { key: item, value: item },
|
|
36
|
+
React.createElement("span", { className: b('icon') },
|
|
37
|
+
React.createElement(Icon, { width: ICON_SIZE, height: ICON_SIZE }))));
|
|
38
|
+
}))),
|
|
39
|
+
React.createElement("div", { className: b('switch-container') },
|
|
40
|
+
React.createElement("span", null, i18n('theme')),
|
|
41
|
+
React.createElement(Select, { value: [theme], onUpdate: (value) => onThemeChange(value[0]) }, Object.values(Theme).map((item) => (React.createElement(Select.Option, { key: item, value: item }, themeNames[item])))))));
|
|
33
42
|
export default ControlPanel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const i18n: (key: "theme" | "
|
|
1
|
+
export declare const i18n: (key: "theme" | "view_mode" | "edit_mode", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
|
@@ -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
|
|
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,15 +1,12 @@
|
|
|
1
1
|
import React, { PropsWithChildren } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { ViewModeItem } from '../../types';
|
|
2
|
+
import { EditModeItem, ViewModeItem } from '../../types';
|
|
4
3
|
import './Layout.css';
|
|
5
4
|
export interface LayoutProps {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
theme: Theme;
|
|
9
|
-
onThemeChange: (theme: Theme) => void;
|
|
5
|
+
editMode: EditModeItem;
|
|
6
|
+
viewMode: ViewModeItem;
|
|
10
7
|
}
|
|
11
8
|
declare const Layout: {
|
|
12
|
-
({ children,
|
|
9
|
+
({ children, editMode, viewMode }: PropsWithChildren<LayoutProps>): JSX.Element;
|
|
13
10
|
Left: React.FC<{
|
|
14
11
|
children?: React.ReactNode;
|
|
15
12
|
}>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import React, { Children, Fragment } from 'react';
|
|
2
2
|
import { block } from '../../../utils';
|
|
3
|
-
import {
|
|
4
|
-
import ControlPanel from '../ControlPanel/ControlPanel';
|
|
3
|
+
import { EditModeItem } from '../../types';
|
|
5
4
|
import DeviceEmulation from '../DeviceEmulation/DeviceEmulation';
|
|
6
5
|
import './Layout.css';
|
|
7
6
|
const b = block('editor-layout');
|
|
8
7
|
const Left = () => null;
|
|
9
8
|
const Right = () => null;
|
|
10
|
-
|
|
9
|
+
// TODO in https://github.com/gravity-ui/page-constructor/issues/884 this component will be disappeared
|
|
10
|
+
const Layout = ({ children, editMode, viewMode }) => {
|
|
11
11
|
let left, right;
|
|
12
|
-
const isEditingMode =
|
|
12
|
+
const isEditingMode = editMode === EditModeItem.Form;
|
|
13
13
|
function handleChild(child) {
|
|
14
14
|
switch (child === null || child === void 0 ? void 0 : child.type) {
|
|
15
15
|
case Left:
|
|
@@ -23,13 +23,11 @@ const Layout = ({ children, mode, onModeChange, theme, onThemeChange, }) => {
|
|
|
23
23
|
if (React.Children.toArray(children).length) {
|
|
24
24
|
Children.forEach(children, handleChild);
|
|
25
25
|
}
|
|
26
|
-
return (React.createElement("div", { className: b() },
|
|
27
|
-
React.createElement(
|
|
28
|
-
|
|
29
|
-
React.createElement(
|
|
30
|
-
|
|
31
|
-
right && (React.createElement("div", { className: b('right', { editing: isEditingMode }) },
|
|
32
|
-
React.createElement(DeviceEmulation, { mode: mode }, right)))))));
|
|
26
|
+
return (React.createElement("div", { className: b('container') },
|
|
27
|
+
React.createElement(Fragment, null,
|
|
28
|
+
left && React.createElement("div", { className: b('left') }, left),
|
|
29
|
+
right && (React.createElement("div", { className: b('right', { editing: isEditingMode }) },
|
|
30
|
+
React.createElement(DeviceEmulation, { mode: viewMode }, right))))));
|
|
33
31
|
};
|
|
34
32
|
Layout.Left = Left;
|
|
35
33
|
Layout.Right = Right;
|