@gravity-ui/dynamic-forms 5.29.1 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/build/cjs/lib/unstable/kit/components/EntityContainer/EntityContainer.d.ts +1 -0
  2. package/build/cjs/lib/unstable/kit/entities/FewOfNested/FewOfNested.d.ts +1 -0
  3. package/build/cjs/lib/unstable/kit/entities/FewOfNested/FewOfNested.js +8 -3
  4. package/build/cjs/lib/unstable/kit/entities/OneOfNested/OneOfNested.d.ts +1 -0
  5. package/build/cjs/lib/unstable/kit/entities/OneOfNested/OneOfNested.js +8 -3
  6. package/build/cjs/lib/unstable/kit/form-entities/SegmentedRadioGroupInput/SegmentedRadioGroupInput.css +9 -4
  7. package/build/cjs/lib/unstable/kit/form-entities/SegmentedRadioGroupInput/SegmentedRadioGroupInput.js +14 -15
  8. package/build/cjs/lib/unstable/kit/form-layouts/FormColumn/FormColumn.js +1 -1
  9. package/build/cjs/lib/unstable/kit/form-layouts/FormRow/FormRow.js +1 -1
  10. package/build/cjs/lib/unstable/kit/layouts/Accordeon/Accordeon.js +1 -1
  11. package/build/cjs/lib/unstable/kit/layouts/Card/Card.js +1 -1
  12. package/build/cjs/lib/unstable/kit/layouts/Section/Section.js +1 -1
  13. package/build/cjs/lib/unstable/kit/utils/transformer.d.ts +6 -2
  14. package/build/cjs/lib/unstable/kit/utils/transformer.js +103 -72
  15. package/build/esm/lib/unstable/kit/components/EntityContainer/EntityContainer.d.ts +1 -0
  16. package/build/esm/lib/unstable/kit/entities/FewOfNested/FewOfNested.d.ts +1 -0
  17. package/build/esm/lib/unstable/kit/entities/FewOfNested/FewOfNested.js +8 -3
  18. package/build/esm/lib/unstable/kit/entities/OneOfNested/OneOfNested.d.ts +1 -0
  19. package/build/esm/lib/unstable/kit/entities/OneOfNested/OneOfNested.js +8 -3
  20. package/build/esm/lib/unstable/kit/form-entities/SegmentedRadioGroupInput/SegmentedRadioGroupInput.css +9 -4
  21. package/build/esm/lib/unstable/kit/form-entities/SegmentedRadioGroupInput/SegmentedRadioGroupInput.js +14 -15
  22. package/build/esm/lib/unstable/kit/form-layouts/FormColumn/FormColumn.js +1 -1
  23. package/build/esm/lib/unstable/kit/form-layouts/FormRow/FormRow.js +1 -1
  24. package/build/esm/lib/unstable/kit/layouts/Accordeon/Accordeon.js +1 -1
  25. package/build/esm/lib/unstable/kit/layouts/Card/Card.js +1 -1
  26. package/build/esm/lib/unstable/kit/layouts/Section/Section.js +1 -1
  27. package/build/esm/lib/unstable/kit/utils/transformer.d.ts +6 -2
  28. package/build/esm/lib/unstable/kit/utils/transformer.js +103 -72
  29. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { type FlexProps } from '@gravity-ui/uikit';
3
3
  export interface EntityContainerProps extends FlexProps {
4
4
  children: React.ReactNode;
5
5
  fill?: 'populated' | 'empty' | 'by-child';
6
+ ref?: React.ComponentPropsWithRef<'div'>['ref'];
6
7
  stretch: 'max' | 'fit' | 'by-child';
7
8
  }
8
9
  export declare const EntityContainer: React.FC<EntityContainerProps>;
@@ -3,5 +3,6 @@ export interface FewOfNestedProps {
3
3
  toggler: JsonSchema;
4
4
  withIndent?: boolean;
5
5
  togglerArrayRemoveButton?: boolean;
6
+ order?: string[];
6
7
  }
7
8
  export declare const FewOfNested: NodeEntity<JsonSchemaObject, FewOfNestedProps>;
@@ -10,7 +10,7 @@ const utils_1 = require("../../utils");
10
10
  const b = (0, utils_1.block)('few-of-nested');
11
11
  const FewOfNested = ({ Layout, headName, input, layoutProps, meta, mode, props, schema, schemaPath, }) => {
12
12
  const { name, value } = input;
13
- const { togglerArrayRemoveButton = false, toggler: togglerSchema = {}, withIndent = false, } = props;
13
+ const { togglerArrayRemoveButton = false, toggler: togglerSchema = {}, withIndent = false, order, } = props;
14
14
  const overviewFlag = mode === core_1.SchemaRendererMode.Overview;
15
15
  const srState = (0, core_1.useSchemaRendererState)({
16
16
  headName,
@@ -20,8 +20,13 @@ const FewOfNested = ({ Layout, headName, input, layoutProps, meta, mode, props,
20
20
  if (value && Object.keys(value).length) {
21
21
  return Object.keys(value);
22
22
  }
23
- if (!overviewFlag && schema.properties && Object.keys(schema.properties).length) {
24
- return [Object.keys(schema.properties)[0]];
23
+ if (!overviewFlag) {
24
+ if ((order === null || order === void 0 ? void 0 : order[0]) !== undefined) {
25
+ return [order[0]];
26
+ }
27
+ if (schema.properties && Object.keys(schema.properties).length) {
28
+ return [Object.keys(schema.properties)[0]];
29
+ }
25
30
  }
26
31
  return [];
27
32
  });
@@ -7,5 +7,6 @@ export interface OneOfNestedProps {
7
7
  };
8
8
  withIndent?: boolean;
9
9
  togglerArrayRemoveButton?: boolean;
10
+ order?: string[];
10
11
  }
11
12
  export declare const OneOfNested: NodeEntity<JsonSchemaObject, OneOfNestedProps>;
@@ -9,7 +9,7 @@ const utils_1 = require("../../utils");
9
9
  const b = (0, utils_1.block)('one-of-nested');
10
10
  const OneOfNested = ({ Layout, headName, input, layoutProps, meta, mode, props, schema, schemaPath, }) => {
11
11
  const { name, value } = input;
12
- const { booleanToKey, togglerArrayRemoveButton = false, toggler: togglerSchema = {}, withIndent = false, } = props;
12
+ const { booleanToKey, togglerArrayRemoveButton = false, toggler: togglerSchema = {}, withIndent = false, order, } = props;
13
13
  const overviewFlag = mode === core_1.SchemaRendererMode.Overview;
14
14
  const srState = (0, core_1.useSchemaRendererState)({
15
15
  headName,
@@ -19,8 +19,13 @@ const OneOfNested = ({ Layout, headName, input, layoutProps, meta, mode, props,
19
19
  if (value && Object.keys(value).length) {
20
20
  return Object.keys(value)[0];
21
21
  }
22
- if (!overviewFlag && schema.properties) {
23
- return Object.keys(schema.properties)[0];
22
+ if (!overviewFlag) {
23
+ if ((order === null || order === void 0 ? void 0 : order[0]) !== undefined) {
24
+ return order[0];
25
+ }
26
+ if (schema.properties) {
27
+ return Object.keys(schema.properties)[0];
28
+ }
24
29
  }
25
30
  return undefined;
26
31
  });
@@ -1,11 +1,16 @@
1
+ .sr-segmented-radio-group-input {
2
+ position: relative;
3
+ }
1
4
  .sr-segmented-radio-group-input_error .g-segmented-radio-group .g-segmented-radio-group__option_checked:hover::after {
2
5
  border: 1px solid var(--g-color-text-danger);
3
6
  }
4
7
  .sr-segmented-radio-group-input_error .g-segmented-radio-group .g-segmented-radio-group__option_checked::after {
5
8
  border: 1px solid var(--g-color-text-danger);
6
9
  }
7
- .sr-segmented-radio-group-input_overflowed {
8
- height: 0;
9
- opacity: 0;
10
- overflow: hidden;
10
+ .sr-segmented-radio-group-input__checker {
11
+ position: absolute;
12
+ left: 0;
13
+ top: 0;
14
+ width: max-content;
15
+ visibility: hidden;
11
16
  }
@@ -14,7 +14,8 @@ const SegmentedRadioGroupInput = (_a) => {
14
14
  const { name, onBlur, onChange, onFocus, value } = input;
15
15
  const { enumDescriptions, optionsDisabled } = props, restEntityProps = tslib_1.__rest(props, ["enumDescriptions", "optionsDisabled"]);
16
16
  const { disabled } = ((_b = schema.nodeParameters) === null || _b === void 0 ? void 0 : _b.flags) || {};
17
- const ref = react_1.default.useRef(null);
17
+ const containerRef = react_1.default.useRef(null);
18
+ const controlRef = react_1.default.useRef(null);
18
19
  const [overflowed, setOverflowed] = react_1.default.useState(false);
19
20
  const options = react_1.default.useMemo(() => {
20
21
  var _a;
@@ -30,27 +31,25 @@ const SegmentedRadioGroupInput = (_a) => {
30
31
  onBlur();
31
32
  }, [onBlur, onChange, onFocus]);
32
33
  react_1.default.useLayoutEffect(() => {
33
- const root = ref.current;
34
- if (!root) {
34
+ const container = containerRef.current;
35
+ const control = controlRef.current;
36
+ if (!container || !control) {
35
37
  return;
36
38
  }
37
39
  const measure = () => {
38
- const texts = root.querySelectorAll('.g-segmented-radio-group__option-text');
39
- setOverflowed(Array.from(texts).some((node) => {
40
- if (node.offsetWidth === 0 && node.scrollWidth === 0) {
41
- return false;
42
- }
43
- return node.scrollWidth > node.clientWidth;
44
- }));
40
+ const GAP = 48; // little bit more than potential remove button width + spacing
41
+ const containerWidth = container.offsetWidth - GAP;
42
+ const controlWidth = control.offsetWidth;
43
+ setOverflowed(controlWidth > containerWidth);
45
44
  };
46
45
  measure();
47
46
  const observer = new ResizeObserver(measure);
48
- observer.observe(root);
47
+ observer.observe(container);
49
48
  return () => observer.disconnect();
50
49
  }, [options]);
51
- return (react_1.default.createElement(components_1.EntityContainer, { stretch: "max" },
52
- overflowed ? (react_1.default.createElement(SelectInput_1.SelectInput, Object.assign({ input: input, meta: meta, props: props, schema: schema }, restProps))) : null,
53
- react_1.default.createElement(components_1.EntityContainer, { stretch: "max", className: b({ error: (0, utils_1.getBooleanValidationState)(meta), overflowed }) },
54
- react_1.default.createElement(uikit_1.SegmentedRadioGroup, Object.assign({ ref: ref, width: "max", disabled: disabled || schema.readOnly, options: options }, restEntityProps, { value: value, onFocus: onFocus, onBlur: onBlur, onUpdate: onUpdate, qa: name })))));
50
+ return (react_1.default.createElement(components_1.EntityContainer, { ref: containerRef, className: b({ error: (0, utils_1.getBooleanValidationState)(meta) }), stretch: "max" },
51
+ overflowed ? (react_1.default.createElement(SelectInput_1.SelectInput, Object.assign({ input: input, meta: meta, props: props, schema: schema }, restProps))) : (react_1.default.createElement(uikit_1.SegmentedRadioGroup, Object.assign({ width: "max", disabled: disabled || schema.readOnly, options: options }, restEntityProps, { value: value, onFocus: onFocus, onBlur: onBlur, onUpdate: onUpdate, qa: name }))),
52
+ react_1.default.createElement("div", { className: b('checker') },
53
+ react_1.default.createElement(uikit_1.SegmentedRadioGroup, Object.assign({ ref: controlRef, width: "max", disabled: disabled || schema.readOnly, options: options }, restEntityProps)))));
55
54
  };
56
55
  exports.SegmentedRadioGroupInput = SegmentedRadioGroupInput;
@@ -26,7 +26,7 @@ const FormColumn = ({ children, headName, input, meta, schema, props, }) => {
26
26
  return (react_1.default.createElement(components_1.LayoutContainer, { className: b(), gap: 2, hidden: hidden },
27
27
  react_1.default.createElement(uikit_1.Flex, { direction: "column", gap: 0.5 },
28
28
  react_1.default.createElement("div", { className: b('top') },
29
- react_1.default.createElement(uikit_1.Text, { className: b('title', { required }), wordBreak: "break-word" }, schema.title),
29
+ react_1.default.createElement(uikit_1.Text, { className: b('title', { required }), variant: "subheader-1", color: "complementary", wordBreak: "break-word" }, schema.title),
30
30
  tooltip,
31
31
  react_1.default.createElement(components_1.ArrayRemoveButton, { name: input.name, headName: headName })),
32
32
  bottomDescription),
@@ -25,7 +25,7 @@ const FormRow = ({ children, headName, input, meta, schema, props, }) => {
25
25
  }, [headName, schema.description, props.descriptionType]);
26
26
  return (react_1.default.createElement(components_1.LayoutContainer, { className: b(), direction: "row", alignItems: "flex-start", gap: 2, hidden: hidden },
27
27
  react_1.default.createElement("div", { className: b('left') },
28
- react_1.default.createElement(uikit_1.Text, { className: b('title', { required }), wordBreak: "break-word" }, schema.title),
28
+ react_1.default.createElement(uikit_1.Text, { className: b('title', { required }), variant: "subheader-1", color: "complementary", wordBreak: "break-word" }, schema.title),
29
29
  tooltip),
30
30
  react_1.default.createElement(uikit_1.Flex, { className: b('right'), direction: "column", gap: 0.5, grow: 1 },
31
31
  react_1.default.createElement(uikit_1.Flex, { grow: 1, gap: 2 },
@@ -14,7 +14,7 @@ const Accordeon = ({ children, headName, input, meta, mode, schema, props, }) =>
14
14
  const { titleProps, togglerProps, withIndent = false, withDefaultSummary = false } = props, restLayoutProps = tslib_1.__rest(props, ["titleProps", "togglerProps", "withIndent", "withDefaultSummary"]);
15
15
  const { copy, required, hidden, open } = ((_a = schema.nodeParameters) === null || _a === void 0 ? void 0 : _a.flags) || {};
16
16
  const overviewFlag = mode === core_1.SchemaRendererMode.Overview;
17
- const summary = react_1.default.useMemo(() => (react_1.default.createElement(uikit_1.Text, Object.assign({}, titleProps, { className: b('title', { required: required && !overviewFlag }, titleProps === null || titleProps === void 0 ? void 0 : titleProps.className) }), schema.title)), [overviewFlag, required, schema.title, titleProps]);
17
+ const summary = react_1.default.useMemo(() => (react_1.default.createElement(uikit_1.Text, Object.assign({ variant: "subheader-1", color: "complementary" }, titleProps, { className: b('title', { required: required && !overviewFlag }, titleProps === null || titleProps === void 0 ? void 0 : titleProps.className) }), schema.title)), [overviewFlag, required, schema.title, titleProps]);
18
18
  const helpMark = react_1.default.useMemo(() => {
19
19
  if (schema.description) {
20
20
  return (react_1.default.createElement(uikit_1.HelpMark, null,
@@ -37,7 +37,7 @@ const Card = ({ children, headName, input, meta, mode, schema, props, }) => {
37
37
  react_1.default.createElement(uikit_1.Flex, { className: b('header'), direction: "column", justifyContent: "center" },
38
38
  react_1.default.createElement(uikit_1.Flex, { justifyContent: "space-between", alignItems: "center" },
39
39
  react_1.default.createElement(uikit_1.Flex, { alignItems: "center", gap: 2 },
40
- react_1.default.createElement(uikit_1.Text, { variant: "subheader-1", className: b('title', { required: required && !overviewFlag }) }, schema.title),
40
+ react_1.default.createElement(uikit_1.Text, { variant: "subheader-1", color: "complementary", className: b('title', { required: required && !overviewFlag }) }, schema.title),
41
41
  tooltip),
42
42
  react_1.default.createElement(uikit_1.Flex, { className: b('header-actions'), alignItems: "center", gap: 2 },
43
43
  overviewFlag ? (react_1.default.createElement(components_1.CopyButton, { className: b('copy-button'), copy: copy, value: input.value })) : null,
@@ -30,7 +30,7 @@ const Section = ({ children, headName, input, meta, mode, schema, props, }) => {
30
30
  react_1.default.createElement(uikit_1.Flex, { direction: "column", gap: 4 },
31
31
  react_1.default.createElement(uikit_1.Flex, { direction: "column" },
32
32
  react_1.default.createElement(uikit_1.Flex, { className: b('header'), gap: 2, alignItems: "center" },
33
- react_1.default.createElement(uikit_1.Text, Object.assign({ variant: "subheader-1" }, restLayoutProps, { className: b('title', { required: required && !overviewFlag }, restLayoutProps === null || restLayoutProps === void 0 ? void 0 : restLayoutProps.className) }), schema.title),
33
+ react_1.default.createElement(uikit_1.Text, Object.assign({ variant: "subheader-1", color: "complementary" }, restLayoutProps, { className: b('title', { required: required && !overviewFlag }, restLayoutProps === null || restLayoutProps === void 0 ? void 0 : restLayoutProps.className) }), schema.title),
34
34
  tooltip,
35
35
  overviewFlag ? (react_1.default.createElement(components_1.CopyButton, { className: b('copy-button'), copy: copy, value: input.value })) : null,
36
36
  overviewFlag ? null : (react_1.default.createElement(components_1.ArrayRemoveButton, { name: input.name, headName: headName }))),
@@ -1,10 +1,14 @@
1
1
  import { type Spec } from '../../../core';
2
2
  import { type ErrorMessages, type JsonSchema } from '../../core';
3
- type Rules = Record<string, (spec: Spec, mutableSchema: JsonSchema, rules: {
3
+ type Rules = Record<string, (spec: Partial<Spec & {
4
+ viewSpec: Partial<Spec['viewSpec']>;
5
+ }> | null | undefined, mutableSchema: JsonSchema, rules: {
4
6
  specRules: Rules;
5
7
  viewSpecRules: Rules;
6
8
  }, errorMessages: ErrorMessages) => void>;
7
- export declare function specToJsonSchema(spec: Spec, mutableSchema?: JsonSchema, rules?: {
9
+ export declare function specToJsonSchema(spec: Partial<Spec & {
10
+ viewSpec: Partial<Spec['viewSpec']>;
11
+ }> | null | undefined, mutableSchema?: JsonSchema, rules?: {
8
12
  specRules: Rules;
9
13
  viewSpecRules: Rules;
10
14
  }, errorMessages?: ErrorMessages): JsonSchema;