@gravity-ui/page-constructor 3.5.0-alpha.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +2 -0
- package/build/cjs/blocks/Banner/schema.d.ts +63 -21
- package/build/cjs/blocks/CardLayout/schema.d.ts +10 -4
- package/build/cjs/blocks/Companies/schema.d.ts +5 -2
- package/build/cjs/blocks/ContentLayout/ContentLayout.js +3 -2
- package/build/cjs/blocks/ContentLayout/schema.d.ts +107 -61
- package/build/cjs/blocks/ContentLayout/schema.js +23 -18
- package/build/cjs/blocks/ExtendedFeatures/schema.d.ts +31 -4
- package/build/cjs/blocks/ExtendedFeatures/schema.js +2 -3
- package/build/cjs/blocks/FilterBlock/schema.d.ts +13 -5
- package/build/cjs/blocks/FilterBlock/schema.js +13 -2
- package/build/cjs/blocks/Header/Header.css +6 -7
- package/build/cjs/blocks/Header/schema.d.ts +92 -36
- package/build/cjs/blocks/Header/schema.js +1 -0
- package/build/cjs/blocks/HeaderSlider/schema.d.ts +48 -53
- package/build/cjs/blocks/HeaderSlider/schema.js +3 -1
- package/build/cjs/blocks/Icons/schema.d.ts +3 -1
- package/build/cjs/blocks/Icons/schema.js +2 -1
- package/build/cjs/blocks/Info/schema.d.ts +19 -8
- package/build/cjs/blocks/Map/schema.d.ts +17 -6
- package/build/cjs/blocks/Media/schema.d.ts +204 -152
- package/build/cjs/blocks/Media/schema.js +1 -1
- package/build/cjs/blocks/PromoFeaturesBlock/schema.d.ts +22 -8
- package/build/cjs/blocks/PromoFeaturesBlock/schema.js +1 -0
- package/build/cjs/blocks/Questions/schema.d.ts +7 -3
- package/build/cjs/blocks/Slider/schema.d.ts +13 -18
- package/build/cjs/blocks/Slider/schema.js +4 -5
- package/build/cjs/blocks/Table/schema.d.ts +5 -2
- package/build/cjs/blocks/Table/schema.js +12 -2
- package/build/cjs/blocks/Tabs/schema.d.ts +43 -16
- package/build/cjs/components/BlockBase/BlockBase.js +2 -2
- package/build/cjs/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +1 -1
- package/build/cjs/components/Image/schema.d.ts +1 -0
- package/build/cjs/components/Image/schema.js +3 -2
- package/build/cjs/containers/PageConstructor/components/ConstructorBlock/ConstructorBlock.js +1 -1
- package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +1 -1
- package/build/cjs/customization/BlockDecoration.d.ts +1 -1
- package/build/cjs/customization/BlockDecoration.js +5 -6
- package/build/cjs/editor/{Components → components}/AddBlock/AddBlock.css +1 -1
- package/build/cjs/editor/components/AddBlock/AddBlock.d.ts +7 -0
- package/build/cjs/editor/{Components → components}/AddBlock/AddBlock.js +2 -2
- package/build/cjs/editor/components/BlockForm/BlockForm.d.ts +12 -0
- package/build/cjs/editor/components/BlockForm/BlockForm.js +33 -0
- package/build/cjs/editor/components/ControlPanel/ControlPanel.css +26 -0
- package/build/cjs/editor/components/ControlPanel/ControlPanel.d.ts +8 -0
- package/build/cjs/editor/components/ControlPanel/ControlPanel.js +25 -0
- package/build/cjs/editor/components/ControlPanel/i18n/en.json +3 -0
- package/build/cjs/editor/components/ControlPanel/i18n/index.d.ts +2 -0
- package/build/cjs/editor/components/ControlPanel/i18n/index.js +8 -0
- package/build/cjs/editor/components/ControlPanel/i18n/ru.json +3 -0
- package/build/cjs/editor/components/EditBlock/EditBlock.d.ts +13 -0
- package/build/cjs/editor/components/EditBlock/EditBlock.js +44 -0
- package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.css +27 -0
- package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.d.ts +13 -0
- package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.js +35 -0
- package/build/cjs/editor/components/ErrorBoundary/i18n/en.json +4 -0
- package/build/cjs/editor/components/ErrorBoundary/i18n/index.d.ts +2 -0
- package/build/cjs/editor/components/ErrorBoundary/i18n/index.js +8 -0
- package/build/cjs/editor/components/ErrorBoundary/i18n/ru.json +4 -0
- package/build/cjs/editor/components/Layout/Layout.css +39 -0
- package/build/cjs/editor/components/Layout/Layout.d.ts +16 -0
- package/build/cjs/editor/components/Layout/Layout.js +34 -0
- package/build/cjs/editor/components/PagePropsForm/PagePropsForm.d.ts +10 -0
- package/build/cjs/editor/components/PagePropsForm/PagePropsForm.js +17 -0
- package/build/cjs/editor/containers/Editor/Editor.d.ts +2 -0
- package/build/cjs/editor/containers/Editor/Editor.js +40 -0
- package/build/cjs/editor/containers/Form/Form.css +94 -0
- package/build/cjs/editor/containers/Form/Form.d.ts +11 -0
- package/build/cjs/editor/containers/Form/Form.js +47 -0
- package/build/cjs/editor/containers/Form/dynamic-form-custom.css +0 -0
- package/build/cjs/editor/data/templates/banner-block.json +25 -0
- package/build/cjs/editor/data/templates/card-layout-block.json +39 -0
- package/build/cjs/editor/data/templates/companies-block.json +20 -0
- package/build/cjs/editor/data/templates/content-layout-block.json +56 -0
- package/build/cjs/editor/data/templates/extended-features-block.json +56 -0
- package/build/cjs/editor/data/templates/filter-block.json +62 -0
- package/build/cjs/editor/data/templates/header-block.json +19 -0
- package/build/cjs/editor/data/templates/header-slider-block.json +69 -0
- package/build/cjs/editor/data/templates/icons-block.json +32 -0
- package/build/cjs/editor/data/templates/info-block.json +40 -0
- package/build/cjs/editor/data/templates/link-table-block.json +10 -0
- package/build/cjs/editor/data/templates/map-block.json +48 -0
- package/build/cjs/editor/data/templates/media-block.json +15 -0
- package/build/cjs/editor/data/templates/preview-block.json +38 -0
- package/build/cjs/editor/data/templates/promo-features-block.json +52 -0
- package/build/cjs/editor/data/templates/questions-block.json +105 -0
- package/build/cjs/editor/data/templates/security-block.json +36 -0
- package/build/cjs/editor/data/templates/share-block.json +6 -0
- package/build/cjs/editor/data/templates/simple-block.json +7 -0
- package/build/cjs/editor/data/templates/slider-block.json +46 -0
- package/build/cjs/editor/data/templates/table-block.json +18 -0
- package/build/cjs/editor/data/templates/tabs-block.json +90 -0
- package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.css +27 -0
- package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.d.ts +19 -0
- package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.js +72 -0
- package/build/cjs/editor/dynamic-forms-custom/config.d.ts +2 -0
- package/build/cjs/editor/dynamic-forms-custom/config.js +13 -0
- package/build/cjs/editor/dynamic-forms-custom/hooks/useOneOf.d.ts +12 -0
- package/build/cjs/editor/dynamic-forms-custom/hooks/useOneOf.js +75 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/detect.d.ts +9 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/detect.js +36 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/index.d.ts +28 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/index.js +188 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/types.d.ts +29 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/types.js +2 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/views.d.ts +37 -0
- package/build/cjs/editor/dynamic-forms-custom/parser/views.js +46 -0
- package/build/cjs/editor/hooks/useFormSpec.d.ts +2 -0
- package/build/cjs/editor/hooks/useFormSpec.js +13 -0
- package/build/cjs/editor/hooks/usePreviousValue.d.ts +1 -0
- package/build/cjs/editor/hooks/usePreviousValue.js +11 -0
- package/build/cjs/editor/index.d.ts +1 -1
- package/build/cjs/editor/index.js +1 -1
- package/build/cjs/editor/store/index.d.ts +10 -11
- package/build/cjs/editor/store/index.js +66 -15
- package/build/cjs/editor/store/reducer.d.ts +24 -9
- package/build/cjs/editor/store/reducer.js +17 -31
- package/build/cjs/editor/store/utils.d.ts +1 -0
- package/build/cjs/editor/store/utils.js +3 -1
- package/build/cjs/editor/styles/root.css +5 -0
- package/build/cjs/editor/types/index.d.ts +15 -9
- package/build/cjs/editor/types/index.js +6 -0
- package/build/cjs/editor/utils/index.d.ts +4 -3
- package/build/cjs/editor/utils/index.js +6 -4
- package/build/cjs/grid/Col/Col.d.ts +1 -1
- package/build/cjs/models/constructor-items/blocks.d.ts +13 -8
- package/build/cjs/models/constructor.d.ts +2 -2
- package/build/cjs/models/customization.d.ts +3 -8
- package/build/cjs/models/navigation.d.ts +1 -0
- package/build/cjs/navigation/components/Header/Header.css +2 -0
- package/build/cjs/navigation/components/Header/Header.js +15 -4
- package/build/cjs/navigation/schema.d.ts +1 -0
- package/build/cjs/schema/constants.d.ts +908 -0
- package/build/cjs/schema/constants.js +42 -0
- package/build/cjs/schema/index.d.ts +9 -228
- package/build/cjs/schema/index.js +8 -46
- package/build/cjs/schema/validators/common.d.ts +71 -27
- package/build/cjs/schema/validators/common.js +50 -17
- package/build/cjs/sub-blocks/BackgroundCard/schema.d.ts +12 -5
- package/build/cjs/sub-blocks/BasicCard/schema.d.ts +8 -3
- package/build/cjs/sub-blocks/Content/schema.d.ts +14 -6
- package/build/cjs/sub-blocks/Content/schema.js +9 -1
- package/build/cjs/sub-blocks/LayoutItem/schema.d.ts +23 -9
- package/build/cjs/sub-blocks/MediaCard/schema.d.ts +16 -6
- package/build/cjs/sub-blocks/PriceDetailed/schema.d.ts +1 -0
- package/build/cjs/sub-blocks/PriceDetailed/schema.js +5 -1
- package/build/cjs/sub-blocks/Quote/schema.d.ts +6 -2
- package/build/esm/blocks/Banner/schema.d.ts +63 -21
- package/build/esm/blocks/CardLayout/schema.d.ts +10 -4
- package/build/esm/blocks/Companies/schema.d.ts +5 -2
- package/build/esm/blocks/ContentLayout/ContentLayout.js +3 -2
- package/build/esm/blocks/ContentLayout/schema.d.ts +107 -61
- package/build/esm/blocks/ContentLayout/schema.js +23 -18
- package/build/esm/blocks/ExtendedFeatures/schema.d.ts +31 -4
- package/build/esm/blocks/ExtendedFeatures/schema.js +3 -4
- package/build/esm/blocks/FilterBlock/schema.d.ts +13 -5
- package/build/esm/blocks/FilterBlock/schema.js +13 -2
- package/build/esm/blocks/Header/Header.css +6 -7
- package/build/esm/blocks/Header/schema.d.ts +92 -36
- package/build/esm/blocks/Header/schema.js +1 -0
- package/build/esm/blocks/HeaderSlider/schema.d.ts +48 -53
- package/build/esm/blocks/HeaderSlider/schema.js +2 -1
- package/build/esm/blocks/Icons/schema.d.ts +3 -1
- package/build/esm/blocks/Icons/schema.js +2 -1
- package/build/esm/blocks/Info/schema.d.ts +19 -8
- package/build/esm/blocks/Map/schema.d.ts +17 -6
- package/build/esm/blocks/Media/schema.d.ts +204 -152
- package/build/esm/blocks/Media/schema.js +2 -2
- package/build/esm/blocks/PromoFeaturesBlock/schema.d.ts +22 -8
- package/build/esm/blocks/PromoFeaturesBlock/schema.js +1 -0
- package/build/esm/blocks/Questions/schema.d.ts +7 -3
- package/build/esm/blocks/Slider/schema.d.ts +13 -18
- package/build/esm/blocks/Slider/schema.js +4 -5
- package/build/esm/blocks/Table/schema.d.ts +5 -2
- package/build/esm/blocks/Table/schema.js +12 -2
- package/build/esm/blocks/Tabs/schema.d.ts +43 -16
- package/build/esm/components/BlockBase/BlockBase.js +2 -2
- package/build/esm/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +1 -1
- package/build/esm/components/Image/schema.d.ts +1 -0
- package/build/esm/components/Image/schema.js +3 -2
- package/build/esm/containers/PageConstructor/components/ConstructorBlock/ConstructorBlock.js +1 -1
- package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +1 -1
- package/build/esm/customization/BlockDecoration.d.ts +1 -1
- package/build/esm/customization/BlockDecoration.js +6 -6
- package/build/esm/editor/{Components → components}/AddBlock/AddBlock.css +1 -1
- package/build/esm/editor/components/AddBlock/AddBlock.d.ts +8 -0
- package/build/esm/editor/{Components → components}/AddBlock/AddBlock.js +2 -2
- package/build/esm/editor/components/BlockForm/BlockForm.d.ts +12 -0
- package/build/esm/editor/components/BlockForm/BlockForm.js +30 -0
- package/build/esm/editor/components/ControlPanel/ControlPanel.css +26 -0
- package/build/esm/editor/components/ControlPanel/ControlPanel.d.ts +9 -0
- package/build/esm/editor/components/ControlPanel/ControlPanel.js +23 -0
- package/build/esm/editor/components/ControlPanel/i18n/en.json +3 -0
- package/build/esm/editor/components/ControlPanel/i18n/index.d.ts +2 -0
- package/build/esm/editor/components/ControlPanel/i18n/index.js +5 -0
- package/build/esm/editor/components/ControlPanel/i18n/ru.json +3 -0
- package/build/esm/editor/components/EditBlock/EditBlock.d.ts +14 -0
- package/build/esm/editor/components/EditBlock/EditBlock.js +41 -0
- package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.css +27 -0
- package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.d.ts +14 -0
- package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.js +31 -0
- package/build/esm/editor/components/ErrorBoundary/i18n/en.json +4 -0
- package/build/esm/editor/components/ErrorBoundary/i18n/index.d.ts +2 -0
- package/build/esm/editor/components/ErrorBoundary/i18n/index.js +5 -0
- package/build/esm/editor/components/ErrorBoundary/i18n/ru.json +4 -0
- package/build/esm/editor/components/Layout/Layout.css +39 -0
- package/build/esm/editor/components/Layout/Layout.d.ts +17 -0
- package/build/esm/editor/components/Layout/Layout.js +32 -0
- package/build/esm/editor/components/PagePropsForm/PagePropsForm.d.ts +10 -0
- package/build/esm/editor/components/PagePropsForm/PagePropsForm.js +13 -0
- package/build/esm/editor/containers/Editor/Editor.d.ts +2 -0
- package/build/esm/editor/containers/Editor/Editor.js +36 -0
- package/build/esm/editor/containers/Form/Form.css +94 -0
- package/build/esm/editor/containers/Form/Form.d.ts +12 -0
- package/build/esm/editor/containers/Form/Form.js +45 -0
- package/build/esm/editor/containers/Form/dynamic-form-custom.css +0 -0
- package/build/esm/editor/data/templates/banner-block.json +25 -0
- package/build/esm/editor/data/templates/card-layout-block.json +39 -0
- package/build/esm/editor/data/templates/companies-block.json +20 -0
- package/build/esm/editor/data/templates/content-layout-block.json +56 -0
- package/build/esm/editor/data/templates/extended-features-block.json +56 -0
- package/build/esm/editor/data/templates/filter-block.json +62 -0
- package/build/esm/editor/data/templates/header-block.json +19 -0
- package/build/esm/editor/data/templates/header-slider-block.json +69 -0
- package/build/esm/editor/data/templates/icons-block.json +32 -0
- package/build/esm/editor/data/templates/info-block.json +40 -0
- package/build/esm/editor/data/templates/link-table-block.json +10 -0
- package/build/esm/editor/data/templates/map-block.json +48 -0
- package/build/esm/editor/data/templates/media-block.json +15 -0
- package/build/esm/editor/data/templates/preview-block.json +38 -0
- package/build/esm/editor/data/templates/promo-features-block.json +52 -0
- package/build/esm/editor/data/templates/questions-block.json +105 -0
- package/build/esm/editor/data/templates/security-block.json +36 -0
- package/build/esm/editor/data/templates/share-block.json +6 -0
- package/build/esm/editor/data/templates/simple-block.json +7 -0
- package/build/esm/editor/data/templates/slider-block.json +46 -0
- package/build/esm/editor/data/templates/table-block.json +18 -0
- package/build/esm/editor/data/templates/tabs-block.json +90 -0
- package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.css +27 -0
- package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.d.ts +20 -0
- package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.js +68 -0
- package/build/esm/editor/dynamic-forms-custom/config.d.ts +2 -0
- package/build/esm/editor/dynamic-forms-custom/config.js +9 -0
- package/build/esm/editor/dynamic-forms-custom/hooks/useOneOf.d.ts +12 -0
- package/build/esm/editor/dynamic-forms-custom/hooks/useOneOf.js +69 -0
- package/build/esm/editor/dynamic-forms-custom/parser/detect.d.ts +9 -0
- package/build/esm/editor/dynamic-forms-custom/parser/detect.js +32 -0
- package/build/esm/editor/dynamic-forms-custom/parser/index.d.ts +28 -0
- package/build/esm/editor/dynamic-forms-custom/parser/index.js +186 -0
- package/build/esm/editor/dynamic-forms-custom/parser/types.d.ts +29 -0
- package/build/esm/editor/dynamic-forms-custom/parser/types.js +1 -0
- package/build/esm/editor/dynamic-forms-custom/parser/views.d.ts +37 -0
- package/build/esm/editor/dynamic-forms-custom/parser/views.js +39 -0
- package/build/esm/editor/hooks/useFormSpec.d.ts +2 -0
- package/build/esm/editor/hooks/useFormSpec.js +9 -0
- package/build/esm/editor/hooks/usePreviousValue.d.ts +1 -0
- package/build/esm/editor/hooks/usePreviousValue.js +8 -0
- package/build/esm/editor/index.d.ts +1 -1
- package/build/esm/editor/index.js +1 -1
- package/build/esm/editor/store/index.d.ts +10 -11
- package/build/esm/editor/store/index.js +68 -17
- package/build/esm/editor/store/reducer.d.ts +24 -9
- package/build/esm/editor/store/reducer.js +15 -29
- package/build/esm/editor/store/utils.d.ts +1 -0
- package/build/esm/editor/store/utils.js +1 -0
- package/build/esm/editor/styles/root.css +5 -0
- package/build/esm/editor/types/index.d.ts +15 -9
- package/build/esm/editor/types/index.js +5 -1
- package/build/esm/editor/utils/index.d.ts +4 -3
- package/build/esm/editor/utils/index.js +4 -3
- package/build/esm/grid/Col/Col.d.ts +1 -1
- package/build/esm/models/constructor-items/blocks.d.ts +13 -8
- package/build/esm/models/constructor.d.ts +2 -2
- package/build/esm/models/customization.d.ts +3 -8
- package/build/esm/models/navigation.d.ts +1 -0
- package/build/esm/navigation/components/Header/Header.css +2 -0
- package/build/esm/navigation/components/Header/Header.js +16 -5
- package/build/esm/navigation/schema.d.ts +1 -0
- package/build/esm/schema/constants.d.ts +908 -0
- package/build/esm/schema/constants.js +39 -0
- package/build/esm/schema/index.d.ts +9 -228
- package/build/esm/schema/index.js +4 -42
- package/build/esm/schema/validators/common.d.ts +71 -27
- package/build/esm/schema/validators/common.js +49 -16
- package/build/esm/sub-blocks/BackgroundCard/schema.d.ts +12 -5
- package/build/esm/sub-blocks/BasicCard/schema.d.ts +8 -3
- package/build/esm/sub-blocks/Content/schema.d.ts +14 -6
- package/build/esm/sub-blocks/Content/schema.js +9 -1
- package/build/esm/sub-blocks/LayoutItem/schema.d.ts +23 -9
- package/build/esm/sub-blocks/MediaCard/schema.d.ts +16 -6
- package/build/esm/sub-blocks/PriceDetailed/schema.d.ts +1 -0
- package/build/esm/sub-blocks/PriceDetailed/schema.js +5 -1
- package/build/esm/sub-blocks/Quote/schema.d.ts +6 -2
- package/package.json +39 -7
- package/server/models/constructor-items/blocks.d.ts +13 -8
- package/server/models/constructor.d.ts +2 -2
- package/server/models/customization.d.ts +3 -8
- package/server/models/navigation.d.ts +1 -0
- package/build/cjs/editor/Components/AddBlock/AddBlock.d.ts +0 -7
- package/build/cjs/editor/Components/EditBlock/EditBlock.d.ts +0 -4
- package/build/cjs/editor/Components/EditBlock/EditBlock.js +0 -32
- package/build/cjs/editor/Containers/Editor.d.ts +0 -2
- package/build/cjs/editor/Containers/Editor.js +0 -24
- package/build/esm/editor/Components/AddBlock/AddBlock.d.ts +0 -8
- package/build/esm/editor/Components/EditBlock/EditBlock.d.ts +0 -5
- package/build/esm/editor/Components/EditBlock/EditBlock.js +0 -30
- package/build/esm/editor/Containers/Editor.d.ts +0 -2
- package/build/esm/editor/Containers/Editor.js +0 -20
- /package/build/cjs/editor/{Components → components}/EditBlock/EditBlock.css +0 -0
- /package/build/esm/editor/{Components → components}/EditBlock/EditBlock.css +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
/* eslint-disable no-param-reassign */
|
|
3
|
+
/* eslint-disable no-not-accumulator-reassign/no-not-accumulator-reassign */
|
|
4
|
+
import { SpecTypes } from '@gravity-ui/dynamic-forms';
|
|
5
|
+
import { BlockType } from '../../../models';
|
|
6
|
+
import { ParserType, detectParserType } from './detect';
|
|
7
|
+
import { getArrayViewSpec, getObjectViewSpec, getOneOfViewSpec, getPrimitiveViewSpec } from './views';
|
|
8
|
+
class FormSpecParser {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.schema = {};
|
|
11
|
+
this.definitions = {};
|
|
12
|
+
this.getChildrenSpec = (data) => {
|
|
13
|
+
var _a, _b, _c;
|
|
14
|
+
const childrenType = (_c = (_b = (_a = data.items) === null || _a === void 0 ? void 0 : _a.$ref) === null || _b === void 0 ? void 0 : _b.split('/')) === null || _c === void 0 ? void 0 : _c.pop();
|
|
15
|
+
return this.definitions[childrenType];
|
|
16
|
+
};
|
|
17
|
+
this.getRequiredProperties = (data) => Array.isArray(data.required) ? data.required : [];
|
|
18
|
+
this.childrenParser = ({ data, name, required }) => {
|
|
19
|
+
const childSpec = this.getChildrenSpec(data);
|
|
20
|
+
const properties = childSpec &&
|
|
21
|
+
Object.entries(childSpec).reduce((parsedChildSpecProperties, [childName, childSchema]) => {
|
|
22
|
+
const childRequiredProperties = this.getRequiredProperties(childSchema);
|
|
23
|
+
const childProperies = childSchema.properties &&
|
|
24
|
+
Object.entries(childSchema.properties).reduce((parsedChildProperties, [childPropertyName, childPropertyData]) => {
|
|
25
|
+
parsedChildProperties[childPropertyName] = this.parseSchemaProperty({
|
|
26
|
+
data: childPropertyData,
|
|
27
|
+
name: childPropertyName,
|
|
28
|
+
required: childRequiredProperties.includes(childPropertyName),
|
|
29
|
+
});
|
|
30
|
+
return parsedChildProperties;
|
|
31
|
+
}, {});
|
|
32
|
+
const childJsonSchema = Object.assign(Object.assign({}, childSchema), { properties: Object.assign(Object.assign({}, childSchema.properties), { type: {
|
|
33
|
+
type: SpecTypes.String,
|
|
34
|
+
enum: [childName],
|
|
35
|
+
} }) });
|
|
36
|
+
parsedChildSpecProperties[childName] = {
|
|
37
|
+
type: SpecTypes.Array,
|
|
38
|
+
items: Object.assign(Object.assign({}, childSchema), { type: SpecTypes.Object, properties: Object.assign(Object.assign({}, childProperies), { type: {
|
|
39
|
+
type: SpecTypes.String,
|
|
40
|
+
defaultValue: childName,
|
|
41
|
+
viewSpec: {
|
|
42
|
+
type: 'hidden',
|
|
43
|
+
},
|
|
44
|
+
} }), viewSpec: childProperies &&
|
|
45
|
+
getObjectViewSpec({
|
|
46
|
+
properties: childProperies,
|
|
47
|
+
layoutTitle: childName,
|
|
48
|
+
}), __schema: childJsonSchema }),
|
|
49
|
+
required: false,
|
|
50
|
+
viewSpec: getArrayViewSpec({ layoutTitle: childName }),
|
|
51
|
+
__schema: {
|
|
52
|
+
type: SpecTypes.Array,
|
|
53
|
+
items: childJsonSchema,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
return parsedChildSpecProperties;
|
|
57
|
+
}, {});
|
|
58
|
+
return {
|
|
59
|
+
type: SpecTypes.Object,
|
|
60
|
+
properties,
|
|
61
|
+
viewSpec: {
|
|
62
|
+
type: 'oneof_custom',
|
|
63
|
+
layout: 'row',
|
|
64
|
+
layoutTitle: name,
|
|
65
|
+
oneOfParams: {
|
|
66
|
+
toggler: 'select',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
required,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
this.oneOfParser = ({ data, name, required }) => {
|
|
73
|
+
const requiredProperties = this.getRequiredProperties(data);
|
|
74
|
+
const properties = data.oneOf &&
|
|
75
|
+
data.oneOf.reduce((result, propertyData, index) => {
|
|
76
|
+
const propertyName = (propertyData === null || propertyData === void 0 ? void 0 : propertyData.optionName)
|
|
77
|
+
? propertyData === null || propertyData === void 0 ? void 0 : propertyData.optionName
|
|
78
|
+
: `${name}_${index}`;
|
|
79
|
+
result[propertyName] = this.parseSchemaProperty({
|
|
80
|
+
data: propertyData,
|
|
81
|
+
name: propertyName,
|
|
82
|
+
required: requiredProperties.includes(propertyName),
|
|
83
|
+
});
|
|
84
|
+
return result;
|
|
85
|
+
}, {});
|
|
86
|
+
return {
|
|
87
|
+
type: SpecTypes.Object,
|
|
88
|
+
properties,
|
|
89
|
+
required,
|
|
90
|
+
viewSpec: getOneOfViewSpec({ layoutTitle: name }),
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
this.arrayParser = ({ data, name }) => {
|
|
94
|
+
const items = data.items && this.parseSchemaProperty({ data: data.items, name });
|
|
95
|
+
return Object.assign(Object.assign({}, data), { type: SpecTypes.Array, items, viewSpec: getArrayViewSpec({ layoutTitle: name }) });
|
|
96
|
+
};
|
|
97
|
+
this.objectParser = ({ data, name, required }) => {
|
|
98
|
+
const requiredProperties = this.getRequiredProperties(data);
|
|
99
|
+
const properties = data.properties &&
|
|
100
|
+
Object.entries(data.properties).reduce((result, [propertyName, propertyData]) => {
|
|
101
|
+
result[propertyName] = this.parseSchemaProperty({
|
|
102
|
+
data: propertyData,
|
|
103
|
+
name: propertyName,
|
|
104
|
+
required: requiredProperties.includes(propertyName),
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
}, {});
|
|
108
|
+
return Object.assign(Object.assign({}, data), { type: SpecTypes.Object, properties, viewSpec: getObjectViewSpec({ properties, layoutTitle: name }), required });
|
|
109
|
+
};
|
|
110
|
+
this.primitiveParser = ({ data, name, required }) => {
|
|
111
|
+
return Object.assign(Object.assign({}, data), { type: data.type, required, defaultValue: data.default, viewSpec: getPrimitiveViewSpec({ layoutTitle: name, data }), validator: 'base' });
|
|
112
|
+
};
|
|
113
|
+
//eslint-disable-next-line @typescript-eslint/member-ordering
|
|
114
|
+
this.schemaParserMap = {
|
|
115
|
+
[ParserType.Object]: this.objectParser,
|
|
116
|
+
[ParserType.Array]: this.arrayParser,
|
|
117
|
+
[ParserType.Primitive]: this.primitiveParser,
|
|
118
|
+
[ParserType.OneOf]: this.oneOfParser,
|
|
119
|
+
[ParserType.Children]: this.childrenParser,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Transforms page-constructor json schema into dynamic-forms specs for each block
|
|
124
|
+
*
|
|
125
|
+
* @param schema {Schema} - page-constructor json schema
|
|
126
|
+
* @returns {FormSpecs} - object containig dynamic-forms specs for each constructor block
|
|
127
|
+
*/
|
|
128
|
+
parse(schema) {
|
|
129
|
+
this.init(schema);
|
|
130
|
+
return this.getFormSpec();
|
|
131
|
+
}
|
|
132
|
+
parseSchemaProperty({ data, name, required }) {
|
|
133
|
+
const parserType = detectParserType(data);
|
|
134
|
+
const parser = this.schemaParserMap[parserType];
|
|
135
|
+
return Object.assign(Object.assign({}, parser({ data, name, required })), {
|
|
136
|
+
//save json schema from constructor to compare with incoming intial data inside oneOf form fields
|
|
137
|
+
__schema: data });
|
|
138
|
+
}
|
|
139
|
+
getBlocksSpec() {
|
|
140
|
+
const blocks = this.definitions.children;
|
|
141
|
+
return Object.values(BlockType).reduce((result, blockName) => {
|
|
142
|
+
result[blockName] = this.parseSchemaProperty({
|
|
143
|
+
name: blockName,
|
|
144
|
+
data: Object.assign({}, blocks[blockName]),
|
|
145
|
+
required: true,
|
|
146
|
+
});
|
|
147
|
+
return result;
|
|
148
|
+
}, {});
|
|
149
|
+
}
|
|
150
|
+
getPageSpec() {
|
|
151
|
+
var _a;
|
|
152
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
153
|
+
const _b = ((_a = this.schema) === null || _a === void 0 ? void 0 : _a.properties) || {}, { blocks } = _b, pageSchema = __rest(_b, ["blocks"]);
|
|
154
|
+
const requiredProperties = this.getRequiredProperties(this.schema);
|
|
155
|
+
const properties = Object.entries(pageSchema).reduce((result, [propertyName, propertyData]) => {
|
|
156
|
+
result[propertyName] = this.parseSchemaProperty({
|
|
157
|
+
name: propertyName,
|
|
158
|
+
data: propertyData,
|
|
159
|
+
required: requiredProperties.includes(propertyName),
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
}, {});
|
|
163
|
+
return {
|
|
164
|
+
type: SpecTypes.Object,
|
|
165
|
+
properties,
|
|
166
|
+
viewSpec: getObjectViewSpec({ properties, layout: 'section' }),
|
|
167
|
+
required: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
getFormSpec() {
|
|
171
|
+
return {
|
|
172
|
+
blocks: this.getBlocksSpec(),
|
|
173
|
+
page: this.getPageSpec(),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
init(schema) {
|
|
177
|
+
this.schema = schema;
|
|
178
|
+
if (schema.definitions) {
|
|
179
|
+
this.definitions = Object.entries(schema.definitions).reduce((result, [childType, childSpec]) => {
|
|
180
|
+
result[childType] = childSpec === null || childSpec === void 0 ? void 0 : childSpec.selectCases;
|
|
181
|
+
return result;
|
|
182
|
+
}, {});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export default new FormSpecParser();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Spec as DynamicFormSpec, ObjectSpec } from '@gravity-ui/dynamic-forms';
|
|
2
|
+
import { BlockType } from '../../../models';
|
|
3
|
+
import { Schema } from '../../../schema';
|
|
4
|
+
export type OneOfSpec = {
|
|
5
|
+
oneOf: DynamicFormSpec[];
|
|
6
|
+
viewSpec: ObjectSpec['viewSpec'];
|
|
7
|
+
};
|
|
8
|
+
export type CustomObjectSpec = Omit<ObjectSpec, 'properties'> & {
|
|
9
|
+
properties: Record<string, CustomSpec>;
|
|
10
|
+
};
|
|
11
|
+
export interface SpecCustomProps {
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
inputType?: string;
|
|
14
|
+
__schema?: Schema;
|
|
15
|
+
}
|
|
16
|
+
export type Spec = Exclude<DynamicFormSpec, 'ObjectSpec'> | CustomObjectSpec | OneOfSpec;
|
|
17
|
+
export type CustomSpec = Spec & SpecCustomProps;
|
|
18
|
+
export type BlocksSpec = Record<BlockType, CustomSpec>;
|
|
19
|
+
export type PageSpec = CustomSpec;
|
|
20
|
+
export interface FormSpecs {
|
|
21
|
+
blocks: BlocksSpec;
|
|
22
|
+
page: PageSpec;
|
|
23
|
+
}
|
|
24
|
+
export interface SchemaParserParams {
|
|
25
|
+
data: Schema;
|
|
26
|
+
name: string;
|
|
27
|
+
required?: Schema['required'];
|
|
28
|
+
}
|
|
29
|
+
export type SchemaParser = (params: SchemaParserParams) => CustomSpec;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Schema } from '../../../schema';
|
|
2
|
+
import { CustomObjectSpec, CustomSpec } from './types';
|
|
3
|
+
interface BaseParams {
|
|
4
|
+
layoutTitle?: string;
|
|
5
|
+
}
|
|
6
|
+
interface GetObjectViewSpecParams extends BaseParams, Partial<Extract<CustomSpec, CustomObjectSpec>> {
|
|
7
|
+
layout?: string;
|
|
8
|
+
}
|
|
9
|
+
type GetPrimitiveViewSpecParams = BaseParams & Schema;
|
|
10
|
+
export declare const getOneOfViewSpec: ({ layoutTitle }: BaseParams) => {
|
|
11
|
+
type: string;
|
|
12
|
+
layout: string;
|
|
13
|
+
layoutTitle: string | undefined;
|
|
14
|
+
oneOfParams: {
|
|
15
|
+
toggler: "select";
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare const getObjectViewSpec: ({ properties, disabled, layoutTitle, layout, }: GetObjectViewSpecParams) => {
|
|
19
|
+
layoutTitle: string | undefined;
|
|
20
|
+
type: string;
|
|
21
|
+
layout: string;
|
|
22
|
+
order: string[] | undefined;
|
|
23
|
+
disabled: boolean | undefined;
|
|
24
|
+
};
|
|
25
|
+
export declare const getArrayViewSpec: ({ layoutTitle }: BaseParams) => {
|
|
26
|
+
layoutTitle: string | undefined;
|
|
27
|
+
type: string;
|
|
28
|
+
layout: string;
|
|
29
|
+
layoutOpen: boolean;
|
|
30
|
+
itemLabel: string;
|
|
31
|
+
};
|
|
32
|
+
export declare const getPrimitiveViewSpec: ({ layoutTitle, ...data }: GetPrimitiveViewSpecParams) => {
|
|
33
|
+
layout: string;
|
|
34
|
+
type: any;
|
|
35
|
+
layoutTitle: string | undefined;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
export const getOneOfViewSpec = ({ layoutTitle }) => {
|
|
3
|
+
return {
|
|
4
|
+
type: 'oneof_custom',
|
|
5
|
+
layout: 'row',
|
|
6
|
+
layoutTitle,
|
|
7
|
+
oneOfParams: {
|
|
8
|
+
toggler: 'select',
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export const getObjectViewSpec = ({ properties, disabled, layoutTitle, layout = 'accordeon', }) => {
|
|
13
|
+
return {
|
|
14
|
+
layoutTitle,
|
|
15
|
+
type: 'base',
|
|
16
|
+
layout,
|
|
17
|
+
order: properties && Object.keys(properties).sort(),
|
|
18
|
+
disabled,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export const getArrayViewSpec = ({ layoutTitle }) => ({
|
|
22
|
+
layoutTitle,
|
|
23
|
+
type: 'base',
|
|
24
|
+
layout: 'accordeon',
|
|
25
|
+
layoutOpen: true,
|
|
26
|
+
itemLabel: 'Add Item',
|
|
27
|
+
});
|
|
28
|
+
export const getPrimitiveViewSpec = (_a) => {
|
|
29
|
+
var { layoutTitle } = _a, data = __rest(_a, ["layoutTitle"]);
|
|
30
|
+
let type = (data === null || data === void 0 ? void 0 : data.inputType) || 'base';
|
|
31
|
+
if (data && 'enum' in data && data.enum) {
|
|
32
|
+
type = 'select';
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
layout: 'row',
|
|
36
|
+
type,
|
|
37
|
+
layoutTitle,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { generateDefaultSchema } from '../../schema';
|
|
3
|
+
import formSpecParser from '../dynamic-forms-custom/parser';
|
|
4
|
+
export default function useFormSpec(customSchema) {
|
|
5
|
+
return useMemo(() => {
|
|
6
|
+
const schema = generateDefaultSchema(customSchema);
|
|
7
|
+
return formSpecParser.parse(schema);
|
|
8
|
+
}, [customSchema]);
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function usePreviousValue<T>(value: T): T | undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Editor } from './
|
|
1
|
+
export { Editor } from './containers/Editor/Editor';
|
|
2
2
|
export * from './types';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Editor } from './
|
|
1
|
+
export { Editor } from './containers/Editor/Editor';
|
|
2
2
|
export * from './types';
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { Block } from '../../models';
|
|
2
|
-
import { EditorProps } from '../types';
|
|
1
|
+
import { Block, BlockDecorationProps, PageContent } from '../../models';
|
|
2
|
+
import { EditBlockProps, EditorProps, ViewModeItem } from '../types';
|
|
3
3
|
export type EditorBlockId = number | string;
|
|
4
4
|
export declare function useEditorState({ content: intialContent, custom }: Omit<EditorProps, 'children'>): {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
onSelect: (id: EditorBlockId) => void;
|
|
11
|
-
onCopy: (index: number) => void;
|
|
12
|
-
onOrderChange: (oldIndex: number, newIndex: number) => void;
|
|
13
|
-
};
|
|
5
|
+
activeBlockIndex: number;
|
|
6
|
+
content: PageContent;
|
|
7
|
+
errorBoundaryState: number;
|
|
8
|
+
viewMode: ViewModeItem;
|
|
9
|
+
injectEditBlockProps: ({ type, index: relativeIndex, children, }: BlockDecorationProps) => EditBlockProps;
|
|
14
10
|
onAdd: (block: Block) => void;
|
|
11
|
+
onSelect: (index: number) => void;
|
|
12
|
+
onContentUpdate: (newContent: PageContent) => void;
|
|
13
|
+
onViewModeUpdate: (newViewMode: ViewModeItem) => void;
|
|
15
14
|
};
|
|
@@ -1,28 +1,79 @@
|
|
|
1
1
|
import { useMemo, useReducer } from 'react';
|
|
2
2
|
import { HeaderBlockTypes } from '../../models';
|
|
3
|
-
import { getCustomHeaderTypes,
|
|
4
|
-
import {
|
|
3
|
+
import { getCustomHeaderTypes, getHeaderBlock } from '../../utils';
|
|
4
|
+
import { EditBlockControls } from '../components/EditBlock/EditBlock';
|
|
5
|
+
import { ViewModeItem } from '../types';
|
|
6
|
+
import { ADD_BLOCK, COPY_BLOCK, DELETE_BLOCK, ORDER_BLOCK, SELECT_BLOCK, UPDATE_CONTENT, UPDATE_VIEW_MODE, reducer, } from './reducer';
|
|
5
7
|
import { addEditorProps } from './utils';
|
|
6
8
|
export function useEditorState({ content: intialContent, custom }) {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
activeBlockId: 0,
|
|
11
|
-
orderedBlocksCount: getOrderedBlocks(intialContent.blocks, headerBlockTypes).length,
|
|
9
|
+
const [{ activeBlockIndex, content, errorBoundaryState, viewMode }, dispatch] = useReducer(reducer, {
|
|
10
|
+
activeBlockIndex: 0,
|
|
11
|
+
errorBoundaryState: 0,
|
|
12
12
|
content: addEditorProps(intialContent),
|
|
13
|
+
viewMode: ViewModeItem.Edititng,
|
|
13
14
|
});
|
|
14
15
|
return useMemo(() => {
|
|
16
|
+
const headerBlockTypes = [...HeaderBlockTypes, ...getCustomHeaderTypes(custom)];
|
|
17
|
+
const contentHasHeader = Boolean(getHeaderBlock(content.blocks, headerBlockTypes));
|
|
18
|
+
const checkIsHeader = (type) => headerBlockTypes.includes(type);
|
|
19
|
+
const onAdd = (block) => {
|
|
20
|
+
const isHeader = checkIsHeader(block.type);
|
|
21
|
+
if (contentHasHeader && isHeader) {
|
|
22
|
+
//TODO: add warning that it should be only one header block
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// eslint-disable-next-line no-nested-ternary
|
|
26
|
+
const index = isHeader
|
|
27
|
+
? 0
|
|
28
|
+
: activeBlockIndex === -1
|
|
29
|
+
? content.blocks.length
|
|
30
|
+
: activeBlockIndex + 1;
|
|
31
|
+
dispatch({ type: ADD_BLOCK, payload: { block, index } });
|
|
32
|
+
};
|
|
33
|
+
const onSelect = (index) => dispatch({ type: SELECT_BLOCK, payload: index });
|
|
34
|
+
const onContentUpdate = (newContent) => dispatch({ type: UPDATE_CONTENT, payload: newContent });
|
|
35
|
+
const onViewModeUpdate = (newViewMode) => dispatch({ type: UPDATE_VIEW_MODE, payload: newViewMode });
|
|
36
|
+
const injectEditBlockProps = ({ type, index: relativeIndex = 0, children, }) => {
|
|
37
|
+
const orderedBlocksStartIndex = contentHasHeader ? 1 : 0;
|
|
38
|
+
const isHeader = checkIsHeader(type);
|
|
39
|
+
const index = isHeader ? 0 : relativeIndex + orderedBlocksStartIndex;
|
|
40
|
+
const isActive = activeBlockIndex === index;
|
|
41
|
+
const actions = {
|
|
42
|
+
[EditBlockControls.Delete]: () => dispatch({ type: DELETE_BLOCK, payload: index }),
|
|
43
|
+
};
|
|
44
|
+
if (!isHeader) {
|
|
45
|
+
actions[EditBlockControls.Copy] = () => dispatch({ type: COPY_BLOCK, payload: index });
|
|
46
|
+
if (index > orderedBlocksStartIndex) {
|
|
47
|
+
actions[EditBlockControls.Up] = () => dispatch({
|
|
48
|
+
type: ORDER_BLOCK,
|
|
49
|
+
payload: { oldIndex: index, newIndex: index - 1 },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (index < content.blocks.length - 1) {
|
|
53
|
+
actions[EditBlockControls.Down] = () => dispatch({
|
|
54
|
+
type: ORDER_BLOCK,
|
|
55
|
+
payload: { oldIndex: index, newIndex: index + 1 },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
children,
|
|
61
|
+
isHeader,
|
|
62
|
+
isActive,
|
|
63
|
+
actions,
|
|
64
|
+
onSelect: () => onSelect(index),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
15
67
|
return {
|
|
68
|
+
activeBlockIndex,
|
|
16
69
|
content,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
onAdd: (block) => dispatch({ type: ADD_BLOCK, payload: block }),
|
|
70
|
+
errorBoundaryState,
|
|
71
|
+
viewMode,
|
|
72
|
+
injectEditBlockProps,
|
|
73
|
+
onAdd,
|
|
74
|
+
onSelect,
|
|
75
|
+
onContentUpdate,
|
|
76
|
+
onViewModeUpdate,
|
|
26
77
|
};
|
|
27
|
-
}, [content,
|
|
78
|
+
}, [content, activeBlockIndex, errorBoundaryState, custom, viewMode]);
|
|
28
79
|
}
|
|
@@ -1,28 +1,35 @@
|
|
|
1
|
-
import { Block,
|
|
1
|
+
import { Block, PageContent } from '../../models';
|
|
2
|
+
import { ViewModeItem } from '../types';
|
|
2
3
|
export type EditorBlockId = number | string;
|
|
3
4
|
interface EditorState {
|
|
4
5
|
content: PageContent;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
activeBlockIndex: number;
|
|
7
|
+
errorBoundaryState: number;
|
|
8
|
+
viewMode: ViewModeItem;
|
|
8
9
|
}
|
|
9
10
|
interface OrderBlockParams {
|
|
10
11
|
oldIndex: number;
|
|
11
12
|
newIndex: number;
|
|
12
13
|
}
|
|
14
|
+
interface AddBlockParams {
|
|
15
|
+
block: Block;
|
|
16
|
+
index: number;
|
|
17
|
+
}
|
|
13
18
|
export declare const SELECT_BLOCK = "SELECT_BLOCK";
|
|
14
19
|
export declare const DELETE_BLOCK = "DELETE_BLOCK";
|
|
15
20
|
export declare const COPY_BLOCK = "COPY_BLOCK";
|
|
16
21
|
export declare const ADD_BLOCK = "ADD_BLOCK";
|
|
17
22
|
export declare const SET_REGION = "SET_REGION";
|
|
18
23
|
export declare const ORDER_BLOCK = "ORDER_BLOCK";
|
|
24
|
+
export declare const UPDATE_CONTENT = "UPDATE_CONTENT";
|
|
25
|
+
export declare const UPDATE_VIEW_MODE = "UPDATE_VIEW_MODE";
|
|
19
26
|
interface SelectBlock {
|
|
20
27
|
type: typeof SELECT_BLOCK;
|
|
21
|
-
payload:
|
|
28
|
+
payload: number;
|
|
22
29
|
}
|
|
23
30
|
interface DeleteBlock {
|
|
24
31
|
type: typeof DELETE_BLOCK;
|
|
25
|
-
payload:
|
|
32
|
+
payload: number;
|
|
26
33
|
}
|
|
27
34
|
interface CopyBlock {
|
|
28
35
|
type: typeof COPY_BLOCK;
|
|
@@ -30,12 +37,20 @@ interface CopyBlock {
|
|
|
30
37
|
}
|
|
31
38
|
interface AddBlock {
|
|
32
39
|
type: typeof ADD_BLOCK;
|
|
33
|
-
payload:
|
|
40
|
+
payload: AddBlockParams;
|
|
34
41
|
}
|
|
35
42
|
interface OrderBlock {
|
|
36
43
|
type: typeof ORDER_BLOCK;
|
|
37
44
|
payload: OrderBlockParams;
|
|
38
45
|
}
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
interface UpdateContent {
|
|
47
|
+
type: typeof UPDATE_CONTENT;
|
|
48
|
+
payload: PageContent;
|
|
49
|
+
}
|
|
50
|
+
interface UpdateViewMode {
|
|
51
|
+
type: typeof UPDATE_VIEW_MODE;
|
|
52
|
+
payload: ViewModeItem;
|
|
53
|
+
}
|
|
54
|
+
export type EditorAction = SelectBlock | DeleteBlock | CopyBlock | AddBlock | OrderBlock | UpdateContent | UpdateViewMode;
|
|
55
|
+
export declare const reducer: (state: EditorState, action: EditorAction) => EditorState;
|
|
41
56
|
export {};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { addBlock, changeBlocksOrder, duplicateBlock, getNewBlockIndex } from './utils';
|
|
1
|
+
import { addBlock, changeBlocksOrder, duplicateBlock, getErrorBoundaryState } from './utils';
|
|
3
2
|
// actions
|
|
4
3
|
export const SELECT_BLOCK = 'SELECT_BLOCK';
|
|
5
4
|
export const DELETE_BLOCK = 'DELETE_BLOCK';
|
|
@@ -7,48 +6,35 @@ export const COPY_BLOCK = 'COPY_BLOCK';
|
|
|
7
6
|
export const ADD_BLOCK = 'ADD_BLOCK';
|
|
8
7
|
export const SET_REGION = 'SET_REGION';
|
|
9
8
|
export const ORDER_BLOCK = 'ORDER_BLOCK';
|
|
9
|
+
export const UPDATE_CONTENT = 'UPDATE_CONTENT';
|
|
10
|
+
export const UPDATE_VIEW_MODE = 'UPDATE_VIEW_MODE';
|
|
10
11
|
// reducer
|
|
11
|
-
export const
|
|
12
|
+
export const reducer = (state, action) => {
|
|
12
13
|
const { content } = state;
|
|
13
|
-
const
|
|
14
|
-
const orderedBlocks = getOrderedBlocks(content.blocks, headerBlockTypes);
|
|
15
|
-
const withHeader = (blocks) => [header, ...blocks].filter(Boolean);
|
|
16
|
-
const getNewState = (blocks, activeBlockId) => (Object.assign(Object.assign({}, state), { content: Object.assign(Object.assign({}, content), { blocks }), activeBlockId, orderedBlocksCount: orderedBlocks.length }));
|
|
14
|
+
const getNewState = (blocks, activeBlockIndex) => (Object.assign(Object.assign({}, state), { content: Object.assign(Object.assign({}, content), { blocks }), activeBlockIndex }));
|
|
17
15
|
switch (action.type) {
|
|
16
|
+
case UPDATE_CONTENT:
|
|
17
|
+
return Object.assign(Object.assign({}, state), { content: action.payload, errorBoundaryState: getErrorBoundaryState(state.errorBoundaryState) });
|
|
18
18
|
case SELECT_BLOCK:
|
|
19
|
-
return
|
|
19
|
+
return Object.assign(Object.assign({}, state), { activeBlockIndex: action.payload });
|
|
20
20
|
case DELETE_BLOCK: {
|
|
21
21
|
const blockId = action.payload;
|
|
22
|
-
return getNewState(
|
|
23
|
-
? content.blocks.filter(({ type }) => type !== blockId)
|
|
24
|
-
: withHeader(orderedBlocks.filter((_block, index) => index !== blockId)), -1);
|
|
22
|
+
return getNewState(content.blocks.filter((_block, index) => index !== blockId), -1);
|
|
25
23
|
}
|
|
26
24
|
case COPY_BLOCK: {
|
|
27
25
|
const index = action.payload;
|
|
28
|
-
return getNewState(
|
|
26
|
+
return getNewState(duplicateBlock(content.blocks, index), index + 1);
|
|
29
27
|
}
|
|
30
28
|
case ADD_BLOCK: {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const block = action.payload;
|
|
34
|
-
if (headerBlockTypes.includes(block.type)) {
|
|
35
|
-
blocks = header ? blocks : [block, ...orderedBlocks];
|
|
36
|
-
activeBlockId = block.type;
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
const newBlockIndex = getNewBlockIndex(state.activeBlockId, orderedBlocks.length);
|
|
40
|
-
blocks = withHeader(addBlock(orderedBlocks, block, newBlockIndex));
|
|
41
|
-
activeBlockId = newBlockIndex;
|
|
42
|
-
}
|
|
43
|
-
if (blocks) {
|
|
44
|
-
return getNewState(blocks, activeBlockId);
|
|
45
|
-
}
|
|
46
|
-
return state;
|
|
29
|
+
const { block, index } = action.payload;
|
|
30
|
+
return getNewState(addBlock(content.blocks, block, index), index);
|
|
47
31
|
}
|
|
48
32
|
case ORDER_BLOCK: {
|
|
49
33
|
const { oldIndex, newIndex } = action.payload;
|
|
50
|
-
return getNewState(
|
|
34
|
+
return getNewState(changeBlocksOrder(content.blocks, oldIndex, newIndex), newIndex);
|
|
51
35
|
}
|
|
36
|
+
case UPDATE_VIEW_MODE:
|
|
37
|
+
return Object.assign(Object.assign({}, state), { viewMode: action.payload });
|
|
52
38
|
default:
|
|
53
39
|
return state;
|
|
54
40
|
}
|
|
@@ -24,3 +24,4 @@ export const addBlock = (array, block, index) => {
|
|
|
24
24
|
export const addEditorProps = (content) => {
|
|
25
25
|
return Object.assign(Object.assign({}, content), { animated: false });
|
|
26
26
|
};
|
|
27
|
+
export const getErrorBoundaryState = (prevState) => prevState === Number.MAX_SAFE_INTEGER ? 0 : prevState + 1;
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { PageConstructorProps } from '../../containers/PageConstructor';
|
|
3
|
-
import {
|
|
3
|
+
import { BlockDecorationProps, PageContent } from '../../models';
|
|
4
|
+
import { SchemaCustomConfig } from '../../schema';
|
|
5
|
+
import { EditBlockActions } from '../components/EditBlock/EditBlock';
|
|
4
6
|
export type EditorBlockId = number | string;
|
|
5
7
|
export interface EditorProps extends Required<Pick<PageConstructorProps, 'content'>>, Partial<Omit<PageConstructorProps, 'content'>> {
|
|
6
8
|
children: (props: Partial<PageConstructorProps>) => React.ReactNode;
|
|
7
|
-
onChange?: (data:
|
|
9
|
+
onChange?: (data: PageContent) => void;
|
|
10
|
+
customSchema?: SchemaCustomConfig;
|
|
8
11
|
}
|
|
9
12
|
export interface EditBlockEditorProps {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
isActive?: boolean;
|
|
14
|
+
onSelect: () => void;
|
|
15
|
+
actions: EditBlockActions;
|
|
16
|
+
}
|
|
17
|
+
export interface EditBlockProps extends EditBlockEditorProps, BlockDecorationProps {
|
|
18
|
+
isHeader?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare enum ViewModeItem {
|
|
21
|
+
Edititng = "editing",
|
|
22
|
+
View = "view"
|
|
16
23
|
}
|
|
17
|
-
export type EditBlockProps = EditBlockEditorProps & BlockDecoratorProps;
|