@gravity-ui/dynamic-forms 4.14.1 → 4.14.3

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 (26) hide show
  1. package/build/cjs/lib/kit/components/Inputs/MultiOneOf/MultiOneOf.js +3 -2
  2. package/build/cjs/lib/kit/components/Inputs/ObjectBase/ObjectBase.js +4 -1
  3. package/build/cjs/lib/kit/components/Layouts/Accordeon/Accordeon.js +2 -1
  4. package/build/cjs/lib/kit/components/Layouts/AccordeonCard/AccordeonCardForm.js +2 -1
  5. package/build/cjs/lib/kit/components/Layouts/CardAccordeon.js +2 -1
  6. package/build/cjs/lib/kit/components/Layouts/CardSection.js +2 -1
  7. package/build/cjs/lib/kit/components/Layouts/Section/Section.css +15 -11
  8. package/build/cjs/lib/kit/components/Layouts/Section/Section.js +13 -3
  9. package/build/cjs/lib/kit/components/RemoveButton/RemoveButton.js +3 -3
  10. package/build/cjs/lib/kit/components/SimpleVerticalAccordeon/SimpleVerticalAccordeon.css +3 -6
  11. package/build/cjs/lib/kit/components/Views/ObjectBaseView/ObjectBaseView.js +4 -1
  12. package/build/cjs/lib/kit/hooks/useOneOf/useOneOf.js +9 -3
  13. package/build/esm/lib/kit/components/Inputs/MultiOneOf/MultiOneOf.js +3 -2
  14. package/build/esm/lib/kit/components/Inputs/ObjectBase/ObjectBase.js +4 -1
  15. package/build/esm/lib/kit/components/Layouts/Accordeon/Accordeon.js +2 -1
  16. package/build/esm/lib/kit/components/Layouts/AccordeonCard/AccordeonCardForm.js +2 -1
  17. package/build/esm/lib/kit/components/Layouts/CardAccordeon.js +2 -1
  18. package/build/esm/lib/kit/components/Layouts/CardSection.js +2 -1
  19. package/build/esm/lib/kit/components/Layouts/Section/Section.css +15 -11
  20. package/build/esm/lib/kit/components/Layouts/Section/Section.js +14 -4
  21. package/build/esm/lib/kit/components/RemoveButton/RemoveButton.d.ts +1 -0
  22. package/build/esm/lib/kit/components/RemoveButton/RemoveButton.js +3 -3
  23. package/build/esm/lib/kit/components/SimpleVerticalAccordeon/SimpleVerticalAccordeon.css +3 -6
  24. package/build/esm/lib/kit/components/Views/ObjectBaseView/ObjectBaseView.js +4 -1
  25. package/build/esm/lib/kit/hooks/useOneOf/useOneOf.js +9 -3
  26. package/package.json +1 -1
@@ -26,7 +26,8 @@ const MultiOneOf = (props) => {
26
26
  onChange((currentValue) => (0, set_1.default)(Object.assign({}, currentValue), childName.split(`${name}.`).join(''), childValue), childErrors);
27
27
  }, [name, onChange]);
28
28
  const specProperties = react_1.default.useMemo(() => ((0, isObjectLike_1.default)(spec.properties) ? spec.properties : {}), [spec.properties]);
29
- const options = react_1.default.useMemo(() => (spec.viewSpec.order || Object.keys(specProperties)).map((value) => {
29
+ const propertiesOrder = react_1.default.useMemo(() => { var _a; return (((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length) ? spec.viewSpec.order : Object.keys(specProperties)); }, [spec.viewSpec.order, specProperties]);
30
+ const options = react_1.default.useMemo(() => propertiesOrder.map((value) => {
30
31
  var _a, _b;
31
32
  const title = ((_a = spec.description) === null || _a === void 0 ? void 0 : _a[value]) ||
32
33
  ((_b = specProperties[value]) === null || _b === void 0 ? void 0 : _b.viewSpec.layoutTitle) ||
@@ -37,7 +38,7 @@ const MultiOneOf = (props) => {
37
38
  title,
38
39
  content: title,
39
40
  };
40
- }), [spec.description, spec.viewSpec.order, specProperties]);
41
+ }), [propertiesOrder, spec.description, specProperties]);
41
42
  const filterable = react_1.default.useMemo(() => (options.length || 0) > 9, [options.length]);
42
43
  const selectInput = react_1.default.useMemo(() => {
43
44
  const select = (react_1.default.createElement(uikit_1.Select, { width: "max", value: valueSelect, options: options, onUpdate: setValueSelect, onOpenChange: handleOpenChange, disabled: spec.viewSpec.disabled, placeholder: spec.viewSpec.placeholder, filterable: filterable, multiple: true, className: b('select'), qa: name }));
@@ -20,6 +20,7 @@ const ObjectBase = (_a) => {
20
20
  }, [spec.defaultValue, spec.viewSpec.layoutTitle, restProps.input.onChange]);
21
21
  const parentOnChange = react_1.default.useCallback((childName, childValue, childErrors) => restProps.input.onChange((currentValue) => (0, set_1.default)(Object.assign({}, currentValue), childName.split(`${restProps.input.name}.`).join(''), childValue), childErrors), [restProps.input.onChange, restProps.input.name]);
22
22
  const content = react_1.default.useMemo(() => {
23
+ var _a;
23
24
  if (!spec.properties ||
24
25
  !(0, isObjectLike_1.default)(spec.properties) ||
25
26
  !Object.keys(spec.properties || {}).length) {
@@ -32,7 +33,9 @@ const ObjectBase = (_a) => {
32
33
  ? (0, utils_1.filterPropertiesForObjectInline)(spec.properties)
33
34
  : spec.properties;
34
35
  const delimiter = spec.viewSpec.delimiter;
35
- const orderProperties = spec.viewSpec.order || Object.keys(specProperties);
36
+ const orderProperties = ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
37
+ ? spec.viewSpec.order
38
+ : Object.keys(specProperties);
36
39
  return (react_1.default.createElement("div", { className: b('content', { inline }) }, orderProperties.map((property) => {
37
40
  var _a;
38
41
  return specProperties[property] ? (react_1.default.createElement(react_1.default.Fragment, { key: `${name ? name + '.' : ''}${property}` },
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Accordeon = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const core_1 = require("../../../../core");
6
7
  const components_1 = require("../../../components");
7
8
  const hooks_1 = require("../../../hooks");
8
9
  const RemoveButton_1 = require("../../RemoveButton");
@@ -15,7 +16,7 @@ const Accordeon = ({ name, spec, input, meta, children, }) => {
15
16
  input.onDrop();
16
17
  }, [input.onDrop, setOpen]);
17
18
  const removeButton = react_1.default.useMemo(() => {
18
- if (spec.required || !input.value) {
19
+ if (!(0, core_1.isArrayItem)(name) && (spec.required || !input.value)) {
19
20
  return null;
20
21
  }
21
22
  return react_1.default.createElement(RemoveButton_1.RemoveButton, { name: name, onDrop: onDrop });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AccordeonCardForm = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const core_1 = require("../../../../core");
6
7
  const hooks_1 = require("../../../hooks");
7
8
  const utils_1 = require("../../../utils");
8
9
  const AccordeonCard_1 = require("../../AccordeonCard");
@@ -17,7 +18,7 @@ const AccordeonCardForm = ({ name, spec, input, children, meta, }) => {
17
18
  input.onDrop();
18
19
  }, [input.onDrop, setOpen]);
19
20
  const removeButton = react_1.default.useMemo(() => {
20
- if (spec.required || !input.value) {
21
+ if (!(0, core_1.isArrayItem)(name) && (spec.required || !input.value)) {
21
22
  return null;
22
23
  }
23
24
  return react_1.default.createElement(RemoveButton_1.RemoveButton, { name: name, onDrop: onDrop });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CardAccordeon = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const core_1 = require("../../../core");
6
7
  const components_1 = require("../../components");
7
8
  const hooks_1 = require("../../hooks");
8
9
  const RemoveButton_1 = require("../RemoveButton");
@@ -15,7 +16,7 @@ const CardAccordeon = ({ name, spec, input, meta, children, }) => {
15
16
  input.onDrop();
16
17
  }, [input.onDrop, setOpen]);
17
18
  const removeButton = react_1.default.useMemo(() => {
18
- if (spec.required || !input.value) {
19
+ if (!(0, core_1.isArrayItem)(name) && (spec.required || !input.value)) {
19
20
  return null;
20
21
  }
21
22
  return react_1.default.createElement(RemoveButton_1.RemoveButton, { onDrop: onDrop, name: name });
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CardSection = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const core_1 = require("../../../core");
6
7
  const components_1 = require("../../components");
7
8
  const RemoveButton_1 = require("../RemoveButton");
8
9
  const CardSection = ({ name, spec, input, meta, children, }) => {
9
10
  const removeButton = react_1.default.useMemo(() => {
10
- if (spec.required || !input.value) {
11
+ if (!(0, core_1.isArrayItem)(name) && (spec.required || !input.value)) {
11
12
  return null;
12
13
  }
13
14
  return react_1.default.createElement(RemoveButton_1.RemoveButton, { onDrop: input.onDrop, name: name });
@@ -5,24 +5,25 @@
5
5
  margin-bottom: 0;
6
6
  }
7
7
  .df-section__header {
8
+ display: flex;
9
+ align-items: center;
8
10
  margin-bottom: 20px;
9
11
  }
10
- .df-section__header_with-popover {
11
- display: flex;
12
+ .df-section__header_size_s {
13
+ height: 18px;
14
+ }
15
+ .df-section__header_size_m {
16
+ height: 20px;
12
17
  }
13
18
  .df-section__title {
14
19
  max-width: 533px;
15
- font-weight: 500;
16
- margin: 0;
17
- white-space: nowrap;
18
- overflow: hidden;
19
- text-overflow: ellipsis;
20
20
  }
21
- .df-section__title_size_s {
22
- font-size: 13px;
21
+ .df-section__title-popover {
22
+ display: flex;
23
+ align-items: center;
23
24
  }
24
- .df-section__title_size_m {
25
- font-size: 15px;
25
+ .df-section__title-popover .g-popover__handler {
26
+ display: flex;
26
27
  }
27
28
  .df-section__note {
28
29
  margin-left: 5px;
@@ -35,4 +36,7 @@
35
36
  }
36
37
  .df-section__description {
37
38
  margin-top: 4px;
39
+ }
40
+ .df-section__remove-button {
41
+ margin-left: 5px;
38
42
  }
@@ -6,6 +6,7 @@ const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const components_1 = require("@gravity-ui/components");
7
7
  const uikit_1 = require("@gravity-ui/uikit");
8
8
  const __1 = require("../../");
9
+ const RemoveButton_1 = require("../../RemoveButton");
9
10
  const __2 = require("../../../");
10
11
  const core_1 = require("../../../../core");
11
12
  const utils_1 = require("../../../utils");
@@ -13,10 +14,17 @@ const b = (0, utils_1.block)('section');
13
14
  const SectionBase = (_a) => {
14
15
  var _b;
15
16
  var { name, spec, titleSize, withIndent, ignoreDescription, descriptionAsSubtitle, children } = _a, restProps = tslib_1.__rest(_a, ["name", "spec", "titleSize", "withIndent", "ignoreDescription", "descriptionAsSubtitle", "children"]);
17
+ const input = restProps.input;
16
18
  const meta = restProps.meta;
17
19
  const arrOrObjFlag = (0, core_1.isArraySpec)(spec) || (0, core_1.isObjectSpec)(spec);
18
20
  const titleRef = react_1.default.useRef(null);
19
21
  let content = children;
22
+ const removeButton = react_1.default.useMemo(() => {
23
+ if ((input === null || input === void 0 ? void 0 : input.value) && (input === null || input === void 0 ? void 0 : input.onDrop) && (0, core_1.isArrayItem)(name)) {
24
+ return (react_1.default.createElement(RemoveButton_1.RemoveButton, { name: name, onDrop: input.onDrop, switcherClassName: b('remove-button') }));
25
+ }
26
+ return null;
27
+ }, [input === null || input === void 0 ? void 0 : input.value, input === null || input === void 0 ? void 0 : input.onDrop, name]);
20
28
  if (meta) {
21
29
  content = (react_1.default.createElement(__2.ErrorWrapper, { name: name, meta: meta, withoutChildErrorStyles: arrOrObjFlag }, content));
22
30
  }
@@ -40,10 +48,12 @@ const SectionBase = (_a) => {
40
48
  return (react_1.default.createElement("section", { className: b() },
41
49
  layoutTitle ? (react_1.default.createElement("div", { className: b('header', {
42
50
  'with-popover': !descriptionAsSubtitle,
51
+ size: titleSize,
43
52
  }) },
44
- react_1.default.createElement(uikit_1.Popover, { content: layoutTitle, placement: __2.COMMON_POPOVER_PLACEMENT, disabled: layoutTitlePopoverDisabled },
45
- react_1.default.createElement("h2", { className: b('title', { size: titleSize }), ref: titleRef }, layoutTitle)),
46
- description)) : null,
53
+ react_1.default.createElement(uikit_1.Popover, { className: b('title-popover'), content: layoutTitle, placement: __2.COMMON_POPOVER_PLACEMENT, disabled: layoutTitlePopoverDisabled },
54
+ react_1.default.createElement(uikit_1.Text, { className: b('title'), variant: titleSize === 'm' ? 'body-2' : 'body-1', ref: titleRef, ellipsis: true }, layoutTitle)),
55
+ description,
56
+ removeButton)) : null,
47
57
  react_1.default.createElement("div", { className: b('content') }, content)));
48
58
  };
49
59
  const Section = (props) => react_1.default.createElement(SectionBase, Object.assign({ titleSize: "m" }, props));
@@ -6,10 +6,10 @@ const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const icons_1 = require("@gravity-ui/icons");
7
7
  const uikit_1 = require("@gravity-ui/uikit");
8
8
  const i18n_1 = tslib_1.__importDefault(require("../../i18n"));
9
- const RemoveButton = ({ name, onDrop }) => {
9
+ const RemoveButton = ({ name, onDrop, switcherClassName }) => {
10
10
  const items = react_1.default.useMemo(() => [{ text: (0, i18n_1.default)('label_delete'), action: onDrop, theme: 'danger' }], [onDrop]);
11
- const switcher = react_1.default.useMemo(() => (react_1.default.createElement(uikit_1.Button, { view: "flat", qa: `${name}-drop-item` },
12
- react_1.default.createElement(uikit_1.Icon, { data: icons_1.Ellipsis, size: 16 }))), []);
11
+ const switcher = react_1.default.useMemo(() => (react_1.default.createElement(uikit_1.Button, { className: switcherClassName, view: "flat", qa: `${name}-drop-item` },
12
+ react_1.default.createElement(uikit_1.Icon, { data: icons_1.Ellipsis, size: 16 }))), [switcherClassName]);
13
13
  return react_1.default.createElement(uikit_1.DropdownMenu, { switcher: switcher, items: items });
14
14
  };
15
15
  exports.RemoveButton = RemoveButton;
@@ -17,14 +17,11 @@
17
17
  margin-left: -13px;
18
18
  max-width: 533px;
19
19
  }
20
- .df-simple-vertical-accordeon__tooltip {
21
- margin: 0px 5px;
22
- }
23
- .df-simple-vertical-accordeon__tooltip .g-help-popover {
20
+ .df-simple-vertical-accordeon__header .g-popover__handler {
24
21
  display: flex;
25
22
  }
26
- .df-simple-vertical-accordeon__tooltip .g-help-popover > span {
27
- display: flex;
23
+ .df-simple-vertical-accordeon__tooltip {
24
+ margin: 0px 5px;
28
25
  }
29
26
  .df-simple-vertical-accordeon__chevron {
30
27
  transform: rotate(-90deg);
@@ -11,6 +11,7 @@ const b = (0, utils_1.block)('object-base-view');
11
11
  const ObjectBaseView = (_a) => {
12
12
  var { inline, spec, name, Layout } = _a, restProps = tslib_1.__rest(_a, ["inline", "spec", "name", "Layout"]);
13
13
  const content = react_1.default.useMemo(() => {
14
+ var _a;
14
15
  if (!spec.properties || !(0, isObjectLike_1.default)(spec.properties)) {
15
16
  return null;
16
17
  }
@@ -18,7 +19,9 @@ const ObjectBaseView = (_a) => {
18
19
  ? (0, utils_1.filterPropertiesForObjectInline)(spec.properties)
19
20
  : spec.properties;
20
21
  const delimiter = spec.viewSpec.delimiter;
21
- const orderProperties = spec.viewSpec.order || Object.keys(specProperties);
22
+ const orderProperties = ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
23
+ ? spec.viewSpec.order
24
+ : Object.keys(specProperties);
22
25
  return (react_1.default.createElement("div", { className: b('content', { inline }) }, orderProperties.map((property) => specProperties[property] ? (react_1.default.createElement(react_1.default.Fragment, { key: `${name ? name + '.' : ''}${property}` },
23
26
  react_1.default.createElement(core_1.ViewController, { spec: specProperties[property], name: `${name ? name + '.' : ''}${property}` }),
24
27
  delimiter && delimiter[property] ? (react_1.default.createElement(uikit_1.Text, { className: b('delimiter') }, delimiter[property])) : null)) : null)));
@@ -16,6 +16,7 @@ const useOneOf = ({ props, onTogglerChange }) => {
16
16
  const specProperties = react_1.default.useMemo(() => ((0, isObjectLike_1.default)(spec.properties) ? spec.properties : {}), [spec.properties]);
17
17
  const specBooleanMap = react_1.default.useMemo(() => { var _a; return (_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.booleanMap; }, [(_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.booleanMap]);
18
18
  const [oneOfValue, setOneOfValue] = react_1.default.useState(() => {
19
+ var _a;
19
20
  let valueKeys;
20
21
  if ((0, isObjectLike_1.default)(input.value)) {
21
22
  const keys = Object.keys(input.value);
@@ -23,7 +24,11 @@ const useOneOf = ({ props, onTogglerChange }) => {
23
24
  valueKeys = keys;
24
25
  }
25
26
  }
26
- return (valueKeys || spec.viewSpec.order || Object.keys(specProperties))[0];
27
+ if (valueKeys)
28
+ return valueKeys[0];
29
+ if ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
30
+ return spec.viewSpec.order[0];
31
+ return Object.keys(specProperties)[0];
27
32
  });
28
33
  const onOneOfChange = react_1.default.useCallback(([newValue]) => {
29
34
  if (newValue !== oneOfValue) {
@@ -46,7 +51,8 @@ const useOneOf = ({ props, onTogglerChange }) => {
46
51
  }
47
52
  return undefined;
48
53
  }, [oneOfValue, specBooleanMap]);
49
- const options = react_1.default.useMemo(() => (spec.viewSpec.order || Object.keys(specProperties)).map((value) => {
54
+ const propertiesOrder = react_1.default.useMemo(() => { var _a; return (((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length) ? spec.viewSpec.order : Object.keys(specProperties)); }, [spec.viewSpec.order, specProperties]);
55
+ const options = react_1.default.useMemo(() => propertiesOrder.map((value) => {
50
56
  var _a, _b;
51
57
  const title = ((_a = spec.description) === null || _a === void 0 ? void 0 : _a[value]) ||
52
58
  ((_b = specProperties[value]) === null || _b === void 0 ? void 0 : _b.viewSpec.layoutTitle) ||
@@ -57,7 +63,7 @@ const useOneOf = ({ props, onTogglerChange }) => {
57
63
  title,
58
64
  content: title,
59
65
  };
60
- }), [spec.description, spec.viewSpec.order, specProperties]);
66
+ }), [propertiesOrder, spec.description, specProperties]);
61
67
  const togglerType = react_1.default.useMemo(() => {
62
68
  var _a, _b, _c, _d;
63
69
  if (((_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.toggler) === 'card' && options.length < 4) {
@@ -23,7 +23,8 @@ export const MultiOneOf = (props) => {
23
23
  onChange((currentValue) => set(Object.assign({}, currentValue), childName.split(`${name}.`).join(''), childValue), childErrors);
24
24
  }, [name, onChange]);
25
25
  const specProperties = React.useMemo(() => (isObjectLike(spec.properties) ? spec.properties : {}), [spec.properties]);
26
- const options = React.useMemo(() => (spec.viewSpec.order || Object.keys(specProperties)).map((value) => {
26
+ const propertiesOrder = React.useMemo(() => { var _a; return (((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length) ? spec.viewSpec.order : Object.keys(specProperties)); }, [spec.viewSpec.order, specProperties]);
27
+ const options = React.useMemo(() => propertiesOrder.map((value) => {
27
28
  var _a, _b;
28
29
  const title = ((_a = spec.description) === null || _a === void 0 ? void 0 : _a[value]) ||
29
30
  ((_b = specProperties[value]) === null || _b === void 0 ? void 0 : _b.viewSpec.layoutTitle) ||
@@ -34,7 +35,7 @@ export const MultiOneOf = (props) => {
34
35
  title,
35
36
  content: title,
36
37
  };
37
- }), [spec.description, spec.viewSpec.order, specProperties]);
38
+ }), [propertiesOrder, spec.description, specProperties]);
38
39
  const filterable = React.useMemo(() => (options.length || 0) > 9, [options.length]);
39
40
  const selectInput = React.useMemo(() => {
40
41
  const select = (React.createElement(Select, { width: "max", value: valueSelect, options: options, onUpdate: setValueSelect, onOpenChange: handleOpenChange, disabled: spec.viewSpec.disabled, placeholder: spec.viewSpec.placeholder, filterable: filterable, multiple: true, className: b('select'), qa: name }));
@@ -18,6 +18,7 @@ export const ObjectBase = (_a) => {
18
18
  }, [spec.defaultValue, spec.viewSpec.layoutTitle, restProps.input.onChange]);
19
19
  const parentOnChange = React.useCallback((childName, childValue, childErrors) => restProps.input.onChange((currentValue) => set(Object.assign({}, currentValue), childName.split(`${restProps.input.name}.`).join(''), childValue), childErrors), [restProps.input.onChange, restProps.input.name]);
20
20
  const content = React.useMemo(() => {
21
+ var _a;
21
22
  if (!spec.properties ||
22
23
  !isObjectLike(spec.properties) ||
23
24
  !Object.keys(spec.properties || {}).length) {
@@ -30,7 +31,9 @@ export const ObjectBase = (_a) => {
30
31
  ? filterPropertiesForObjectInline(spec.properties)
31
32
  : spec.properties;
32
33
  const delimiter = spec.viewSpec.delimiter;
33
- const orderProperties = spec.viewSpec.order || Object.keys(specProperties);
34
+ const orderProperties = ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
35
+ ? spec.viewSpec.order
36
+ : Object.keys(specProperties);
34
37
  return (React.createElement("div", { className: b('content', { inline }) }, orderProperties.map((property) => {
35
38
  var _a;
36
39
  return specProperties[property] ? (React.createElement(React.Fragment, { key: `${name ? name + '.' : ''}${property}` },
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { isArrayItem } from '../../../../core';
2
3
  import { ErrorWrapper } from '../../../components';
3
4
  import { useErrorChecker } from '../../../hooks';
4
5
  import { RemoveButton } from '../../RemoveButton';
@@ -11,7 +12,7 @@ export const Accordeon = ({ name, spec, input, meta, children, }) => {
11
12
  input.onDrop();
12
13
  }, [input.onDrop, setOpen]);
13
14
  const removeButton = React.useMemo(() => {
14
- if (spec.required || !input.value) {
15
+ if (!isArrayItem(name) && (spec.required || !input.value)) {
15
16
  return null;
16
17
  }
17
18
  return React.createElement(RemoveButton, { name: name, onDrop: onDrop });
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { isArrayItem } from '../../../../core';
2
3
  import { useErrorChecker } from '../../../hooks';
3
4
  import { block } from '../../../utils';
4
5
  import { AccordeonCard } from '../../AccordeonCard';
@@ -14,7 +15,7 @@ export const AccordeonCardForm = ({ name, spec, input, children, meta, }) => {
14
15
  input.onDrop();
15
16
  }, [input.onDrop, setOpen]);
16
17
  const removeButton = React.useMemo(() => {
17
- if (spec.required || !input.value) {
18
+ if (!isArrayItem(name) && (spec.required || !input.value)) {
18
19
  return null;
19
20
  }
20
21
  return React.createElement(RemoveButton, { name: name, onDrop: onDrop });
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { isArrayItem } from '../../../core';
2
3
  import { Card, ErrorWrapper } from '../../components';
3
4
  import { useErrorChecker } from '../../hooks';
4
5
  import { RemoveButton } from '../RemoveButton';
@@ -11,7 +12,7 @@ export const CardAccordeon = ({ name, spec, input, meta, children, }) => {
11
12
  input.onDrop();
12
13
  }, [input.onDrop, setOpen]);
13
14
  const removeButton = React.useMemo(() => {
14
- if (spec.required || !input.value) {
15
+ if (!isArrayItem(name) && (spec.required || !input.value)) {
15
16
  return null;
16
17
  }
17
18
  return React.createElement(RemoveButton, { onDrop: onDrop, name: name });
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
+ import { isArrayItem } from '../../../core';
2
3
  import { Card, ErrorWrapper } from '../../components';
3
4
  import { RemoveButton } from '../RemoveButton';
4
5
  export const CardSection = ({ name, spec, input, meta, children, }) => {
5
6
  const removeButton = React.useMemo(() => {
6
- if (spec.required || !input.value) {
7
+ if (!isArrayItem(name) && (spec.required || !input.value)) {
7
8
  return null;
8
9
  }
9
10
  return React.createElement(RemoveButton, { onDrop: input.onDrop, name: name });
@@ -5,24 +5,25 @@
5
5
  margin-bottom: 0;
6
6
  }
7
7
  .df-section__header {
8
+ display: flex;
9
+ align-items: center;
8
10
  margin-bottom: 20px;
9
11
  }
10
- .df-section__header_with-popover {
11
- display: flex;
12
+ .df-section__header_size_s {
13
+ height: 18px;
14
+ }
15
+ .df-section__header_size_m {
16
+ height: 20px;
12
17
  }
13
18
  .df-section__title {
14
19
  max-width: 533px;
15
- font-weight: 500;
16
- margin: 0;
17
- white-space: nowrap;
18
- overflow: hidden;
19
- text-overflow: ellipsis;
20
20
  }
21
- .df-section__title_size_s {
22
- font-size: 13px;
21
+ .df-section__title-popover {
22
+ display: flex;
23
+ align-items: center;
23
24
  }
24
- .df-section__title_size_m {
25
- font-size: 15px;
25
+ .df-section__title-popover .g-popover__handler {
26
+ display: flex;
26
27
  }
27
28
  .df-section__note {
28
29
  margin-left: 5px;
@@ -35,4 +36,7 @@
35
36
  }
36
37
  .df-section__description {
37
38
  margin-top: 4px;
39
+ }
40
+ .df-section__remove-button {
41
+ margin-left: 5px;
38
42
  }
@@ -3,18 +3,26 @@ import React from 'react';
3
3
  import { HelpPopover } from '@gravity-ui/components';
4
4
  import { Popover, Text } from '@gravity-ui/uikit';
5
5
  import { GroupIndent } from '../../';
6
+ import { RemoveButton } from '../../RemoveButton';
6
7
  import { COMMON_POPOVER_PLACEMENT, COMMON_TITLE_MAX_WIDTH, ErrorWrapper } from '../../../';
7
- import { isArraySpec, isObjectSpec, } from '../../../../core';
8
+ import { isArrayItem, isArraySpec, isObjectSpec, } from '../../../../core';
8
9
  import { block } from '../../../utils';
9
10
  import './Section.css';
10
11
  const b = block('section');
11
12
  const SectionBase = (_a) => {
12
13
  var _b;
13
14
  var { name, spec, titleSize, withIndent, ignoreDescription, descriptionAsSubtitle, children } = _a, restProps = __rest(_a, ["name", "spec", "titleSize", "withIndent", "ignoreDescription", "descriptionAsSubtitle", "children"]);
15
+ const input = restProps.input;
14
16
  const meta = restProps.meta;
15
17
  const arrOrObjFlag = isArraySpec(spec) || isObjectSpec(spec);
16
18
  const titleRef = React.useRef(null);
17
19
  let content = children;
20
+ const removeButton = React.useMemo(() => {
21
+ if ((input === null || input === void 0 ? void 0 : input.value) && (input === null || input === void 0 ? void 0 : input.onDrop) && isArrayItem(name)) {
22
+ return (React.createElement(RemoveButton, { name: name, onDrop: input.onDrop, switcherClassName: b('remove-button') }));
23
+ }
24
+ return null;
25
+ }, [input === null || input === void 0 ? void 0 : input.value, input === null || input === void 0 ? void 0 : input.onDrop, name]);
18
26
  if (meta) {
19
27
  content = (React.createElement(ErrorWrapper, { name: name, meta: meta, withoutChildErrorStyles: arrOrObjFlag }, content));
20
28
  }
@@ -38,10 +46,12 @@ const SectionBase = (_a) => {
38
46
  return (React.createElement("section", { className: b() },
39
47
  layoutTitle ? (React.createElement("div", { className: b('header', {
40
48
  'with-popover': !descriptionAsSubtitle,
49
+ size: titleSize,
41
50
  }) },
42
- React.createElement(Popover, { content: layoutTitle, placement: COMMON_POPOVER_PLACEMENT, disabled: layoutTitlePopoverDisabled },
43
- React.createElement("h2", { className: b('title', { size: titleSize }), ref: titleRef }, layoutTitle)),
44
- description)) : null,
51
+ React.createElement(Popover, { className: b('title-popover'), content: layoutTitle, placement: COMMON_POPOVER_PLACEMENT, disabled: layoutTitlePopoverDisabled },
52
+ React.createElement(Text, { className: b('title'), variant: titleSize === 'm' ? 'body-2' : 'body-1', ref: titleRef, ellipsis: true }, layoutTitle)),
53
+ description,
54
+ removeButton)) : null,
45
55
  React.createElement("div", { className: b('content') }, content)));
46
56
  };
47
57
  export const Section = (props) => React.createElement(SectionBase, Object.assign({ titleSize: "m" }, props));
@@ -2,5 +2,6 @@ import React from 'react';
2
2
  export interface RemoveButtonProps {
3
3
  name: string;
4
4
  onDrop: () => void;
5
+ switcherClassName?: string;
5
6
  }
6
7
  export declare const RemoveButton: React.FC<RemoveButtonProps>;
@@ -2,9 +2,9 @@ import React from 'react';
2
2
  import { Ellipsis } from '@gravity-ui/icons';
3
3
  import { Button, DropdownMenu, Icon } from '@gravity-ui/uikit';
4
4
  import i18n from '../../i18n';
5
- export const RemoveButton = ({ name, onDrop }) => {
5
+ export const RemoveButton = ({ name, onDrop, switcherClassName }) => {
6
6
  const items = React.useMemo(() => [{ text: i18n('label_delete'), action: onDrop, theme: 'danger' }], [onDrop]);
7
- const switcher = React.useMemo(() => (React.createElement(Button, { view: "flat", qa: `${name}-drop-item` },
8
- React.createElement(Icon, { data: Ellipsis, size: 16 }))), []);
7
+ const switcher = React.useMemo(() => (React.createElement(Button, { className: switcherClassName, view: "flat", qa: `${name}-drop-item` },
8
+ React.createElement(Icon, { data: Ellipsis, size: 16 }))), [switcherClassName]);
9
9
  return React.createElement(DropdownMenu, { switcher: switcher, items: items });
10
10
  };
@@ -17,14 +17,11 @@
17
17
  margin-left: -13px;
18
18
  max-width: 533px;
19
19
  }
20
- .df-simple-vertical-accordeon__tooltip {
21
- margin: 0px 5px;
22
- }
23
- .df-simple-vertical-accordeon__tooltip .g-help-popover {
20
+ .df-simple-vertical-accordeon__header .g-popover__handler {
24
21
  display: flex;
25
22
  }
26
- .df-simple-vertical-accordeon__tooltip .g-help-popover > span {
27
- display: flex;
23
+ .df-simple-vertical-accordeon__tooltip {
24
+ margin: 0px 5px;
28
25
  }
29
26
  .df-simple-vertical-accordeon__chevron {
30
27
  transform: rotate(-90deg);
@@ -9,6 +9,7 @@ const b = block('object-base-view');
9
9
  export const ObjectBaseView = (_a) => {
10
10
  var { inline, spec, name, Layout } = _a, restProps = __rest(_a, ["inline", "spec", "name", "Layout"]);
11
11
  const content = React.useMemo(() => {
12
+ var _a;
12
13
  if (!spec.properties || !isObjectLike(spec.properties)) {
13
14
  return null;
14
15
  }
@@ -16,7 +17,9 @@ export const ObjectBaseView = (_a) => {
16
17
  ? filterPropertiesForObjectInline(spec.properties)
17
18
  : spec.properties;
18
19
  const delimiter = spec.viewSpec.delimiter;
19
- const orderProperties = spec.viewSpec.order || Object.keys(specProperties);
20
+ const orderProperties = ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
21
+ ? spec.viewSpec.order
22
+ : Object.keys(specProperties);
20
23
  return (React.createElement("div", { className: b('content', { inline }) }, orderProperties.map((property) => specProperties[property] ? (React.createElement(React.Fragment, { key: `${name ? name + '.' : ''}${property}` },
21
24
  React.createElement(ViewController, { spec: specProperties[property], name: `${name ? name + '.' : ''}${property}` }),
22
25
  delimiter && delimiter[property] ? (React.createElement(Text, { className: b('delimiter') }, delimiter[property])) : null)) : null)));
@@ -13,6 +13,7 @@ export const useOneOf = ({ props, onTogglerChange }) => {
13
13
  const specProperties = React.useMemo(() => (isObjectLike(spec.properties) ? spec.properties : {}), [spec.properties]);
14
14
  const specBooleanMap = React.useMemo(() => { var _a; return (_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.booleanMap; }, [(_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.booleanMap]);
15
15
  const [oneOfValue, setOneOfValue] = React.useState(() => {
16
+ var _a;
16
17
  let valueKeys;
17
18
  if (isObjectLike(input.value)) {
18
19
  const keys = Object.keys(input.value);
@@ -20,7 +21,11 @@ export const useOneOf = ({ props, onTogglerChange }) => {
20
21
  valueKeys = keys;
21
22
  }
22
23
  }
23
- return (valueKeys || spec.viewSpec.order || Object.keys(specProperties))[0];
24
+ if (valueKeys)
25
+ return valueKeys[0];
26
+ if ((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length)
27
+ return spec.viewSpec.order[0];
28
+ return Object.keys(specProperties)[0];
24
29
  });
25
30
  const onOneOfChange = React.useCallback(([newValue]) => {
26
31
  if (newValue !== oneOfValue) {
@@ -43,7 +48,8 @@ export const useOneOf = ({ props, onTogglerChange }) => {
43
48
  }
44
49
  return undefined;
45
50
  }, [oneOfValue, specBooleanMap]);
46
- const options = React.useMemo(() => (spec.viewSpec.order || Object.keys(specProperties)).map((value) => {
51
+ const propertiesOrder = React.useMemo(() => { var _a; return (((_a = spec.viewSpec.order) === null || _a === void 0 ? void 0 : _a.length) ? spec.viewSpec.order : Object.keys(specProperties)); }, [spec.viewSpec.order, specProperties]);
52
+ const options = React.useMemo(() => propertiesOrder.map((value) => {
47
53
  var _a, _b;
48
54
  const title = ((_a = spec.description) === null || _a === void 0 ? void 0 : _a[value]) ||
49
55
  ((_b = specProperties[value]) === null || _b === void 0 ? void 0 : _b.viewSpec.layoutTitle) ||
@@ -54,7 +60,7 @@ export const useOneOf = ({ props, onTogglerChange }) => {
54
60
  title,
55
61
  content: title,
56
62
  };
57
- }), [spec.description, spec.viewSpec.order, specProperties]);
63
+ }), [propertiesOrder, spec.description, specProperties]);
58
64
  const togglerType = React.useMemo(() => {
59
65
  var _a, _b, _c, _d;
60
66
  if (((_a = spec.viewSpec.oneOfParams) === null || _a === void 0 ? void 0 : _a.toggler) === 'card' && options.length < 4) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/dynamic-forms",
3
- "version": "4.14.1",
3
+ "version": "4.14.3",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "build/cjs/index.js",