@redneckz/wildless-cms-uni-blocks 0.8.31 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/blocks.schema.json +1 -1
- package/bundle/bundle.umd.js +93 -24
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/Filtration/Filtration.d.ts +6 -0
- package/bundle/components/Filtration/FiltrationContent.d.ts +78 -0
- package/bundle/components/Filtration/FiltrationInner.d.ts +7 -0
- package/bundle/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/bundle/components/Filtration/renderFormItem.d.ts +4 -0
- package/bundle/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/bundle/hooks/useForm.d.ts +12 -0
- package/bundle/model/JSXBlock.d.ts +2 -0
- package/bundle/ui-kit/ControlProps.d.ts +4 -0
- package/bundle/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/bundle/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/bundle/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/dist/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
- package/dist/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
- package/dist/components/Blocks.js +2 -0
- package/dist/components/Blocks.js.map +1 -1
- package/dist/components/Filtration/Filtration.d.ts +6 -0
- package/dist/components/Filtration/Filtration.js +17 -0
- package/dist/components/Filtration/Filtration.js.map +1 -0
- package/dist/components/Filtration/FiltrationContent.d.ts +78 -0
- package/dist/components/Filtration/FiltrationContent.js +2 -0
- package/dist/components/Filtration/FiltrationContent.js.map +1 -0
- package/dist/components/Filtration/FiltrationInner.d.ts +7 -0
- package/dist/components/Filtration/FiltrationInner.js +23 -0
- package/dist/components/Filtration/FiltrationInner.js.map +1 -0
- package/dist/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/dist/components/Filtration/checkShouldRenderBlock.js +11 -0
- package/dist/components/Filtration/checkShouldRenderBlock.js.map +1 -0
- package/dist/components/Filtration/renderFormItem.d.ts +4 -0
- package/dist/components/Filtration/renderFormItem.js +21 -0
- package/dist/components/Filtration/renderFormItem.js.map +1 -0
- package/dist/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/dist/components/ProductBlock/ProductBlockInner.js +2 -2
- package/dist/components/ProductBlock/ProductBlockInner.js.map +1 -1
- package/dist/hooks/useForm.d.ts +12 -0
- package/dist/hooks/useForm.js +21 -0
- package/dist/hooks/useForm.js.map +1 -0
- package/dist/model/JSXBlock.d.ts +2 -0
- package/dist/ui-kit/ControlProps.d.ts +4 -0
- package/dist/ui-kit/ControlProps.js +2 -0
- package/dist/ui-kit/ControlProps.js.map +1 -0
- package/dist/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/dist/ui-kit/Foldable/DefaultFoldButton.js +5 -9
- package/dist/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
- package/dist/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/dist/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
- package/dist/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
- package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +19 -0
- package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
- package/lib/common.css +1 -1
- package/lib/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
- package/lib/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
- package/lib/components/Blocks.js +2 -0
- package/lib/components/Blocks.js.map +1 -1
- package/lib/components/Filtration/Filtration.d.ts +6 -0
- package/lib/components/Filtration/Filtration.fixture.d.ts +5 -0
- package/lib/components/Filtration/Filtration.js +15 -0
- package/lib/components/Filtration/Filtration.js.map +1 -0
- package/lib/components/Filtration/FiltrationContent.d.ts +78 -0
- package/lib/components/Filtration/FiltrationContent.js +2 -0
- package/lib/components/Filtration/FiltrationContent.js.map +1 -0
- package/lib/components/Filtration/FiltrationInner.d.ts +7 -0
- package/lib/components/Filtration/FiltrationInner.js +21 -0
- package/lib/components/Filtration/FiltrationInner.js.map +1 -0
- package/lib/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/lib/components/Filtration/checkShouldRenderBlock.js +8 -0
- package/lib/components/Filtration/checkShouldRenderBlock.js.map +1 -0
- package/lib/components/Filtration/renderFormItem.d.ts +4 -0
- package/lib/components/Filtration/renderFormItem.js +18 -0
- package/lib/components/Filtration/renderFormItem.js.map +1 -0
- package/lib/components/ProductBlock/ProductBlock.fixture.d.ts +1 -0
- package/lib/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/lib/components/ProductBlock/ProductBlockInner.js +2 -2
- package/lib/components/ProductBlock/ProductBlockInner.js.map +1 -1
- package/lib/hooks/useForm.d.ts +12 -0
- package/lib/hooks/useForm.js +18 -0
- package/lib/hooks/useForm.js.map +1 -0
- package/lib/model/JSXBlock.d.ts +2 -0
- package/lib/ui-kit/ControlProps.d.ts +4 -0
- package/lib/ui-kit/ControlProps.js +2 -0
- package/lib/ui-kit/ControlProps.js.map +1 -0
- package/lib/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/lib/ui-kit/Foldable/DefaultFoldButton.js +5 -9
- package/lib/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
- package/lib/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/lib/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
- package/lib/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
- package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +17 -0
- package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
- package/mobile/bundle/bundle.umd.js +5 -10
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/Filtration/Filtration.d.ts +6 -0
- package/mobile/bundle/components/Filtration/FiltrationContent.d.ts +78 -0
- package/mobile/bundle/components/Filtration/FiltrationInner.d.ts +7 -0
- package/mobile/bundle/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/mobile/bundle/components/Filtration/renderFormItem.d.ts +4 -0
- package/mobile/bundle/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/mobile/bundle/hooks/useForm.d.ts +12 -0
- package/mobile/bundle/model/JSXBlock.d.ts +2 -0
- package/mobile/bundle/ui-kit/ControlProps.d.ts +4 -0
- package/mobile/bundle/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/mobile/bundle/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/mobile/bundle/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/mobile/dist/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
- package/mobile/dist/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
- package/mobile/dist/components/Filtration/Filtration.d.ts +6 -0
- package/mobile/dist/components/Filtration/Filtration.js +17 -0
- package/mobile/dist/components/Filtration/Filtration.js.map +1 -0
- package/mobile/dist/components/Filtration/FiltrationContent.d.ts +78 -0
- package/mobile/dist/components/Filtration/FiltrationContent.js +2 -0
- package/mobile/dist/components/Filtration/FiltrationContent.js.map +1 -0
- package/mobile/dist/components/Filtration/FiltrationInner.d.ts +7 -0
- package/mobile/dist/components/Filtration/FiltrationInner.js +23 -0
- package/mobile/dist/components/Filtration/FiltrationInner.js.map +1 -0
- package/mobile/dist/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/mobile/dist/components/Filtration/checkShouldRenderBlock.js +11 -0
- package/mobile/dist/components/Filtration/checkShouldRenderBlock.js.map +1 -0
- package/mobile/dist/components/Filtration/renderFormItem.d.ts +4 -0
- package/mobile/dist/components/Filtration/renderFormItem.js +21 -0
- package/mobile/dist/components/Filtration/renderFormItem.js.map +1 -0
- package/mobile/dist/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/mobile/dist/hooks/useForm.d.ts +12 -0
- package/mobile/dist/hooks/useForm.js +21 -0
- package/mobile/dist/hooks/useForm.js.map +1 -0
- package/mobile/dist/model/JSXBlock.d.ts +2 -0
- package/mobile/dist/ui-kit/ControlProps.d.ts +4 -0
- package/mobile/dist/ui-kit/ControlProps.js +2 -0
- package/mobile/dist/ui-kit/ControlProps.js.map +1 -0
- package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.js +5 -9
- package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
- package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
- package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
- package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +19 -0
- package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
- package/mobile/lib/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
- package/mobile/lib/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
- package/mobile/lib/components/Filtration/Filtration.d.ts +6 -0
- package/mobile/lib/components/Filtration/Filtration.js +15 -0
- package/mobile/lib/components/Filtration/Filtration.js.map +1 -0
- package/mobile/lib/components/Filtration/FiltrationContent.d.ts +78 -0
- package/mobile/lib/components/Filtration/FiltrationContent.js +2 -0
- package/mobile/lib/components/Filtration/FiltrationContent.js.map +1 -0
- package/mobile/lib/components/Filtration/FiltrationInner.d.ts +7 -0
- package/mobile/lib/components/Filtration/FiltrationInner.js +21 -0
- package/mobile/lib/components/Filtration/FiltrationInner.js.map +1 -0
- package/mobile/lib/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
- package/mobile/lib/components/Filtration/checkShouldRenderBlock.js +8 -0
- package/mobile/lib/components/Filtration/checkShouldRenderBlock.js.map +1 -0
- package/mobile/lib/components/Filtration/renderFormItem.d.ts +4 -0
- package/mobile/lib/components/Filtration/renderFormItem.js +18 -0
- package/mobile/lib/components/Filtration/renderFormItem.js.map +1 -0
- package/mobile/lib/components/ProductBlock/ProductBlockContent.d.ts +2 -0
- package/mobile/lib/hooks/useForm.d.ts +12 -0
- package/mobile/lib/hooks/useForm.js +18 -0
- package/mobile/lib/hooks/useForm.js.map +1 -0
- package/mobile/lib/model/JSXBlock.d.ts +2 -0
- package/mobile/lib/ui-kit/ControlProps.d.ts +4 -0
- package/mobile/lib/ui-kit/ControlProps.js +2 -0
- package/mobile/lib/ui-kit/ControlProps.js.map +1 -0
- package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
- package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.js +5 -9
- package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
- package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
- package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
- package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
- package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
- package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +17 -0
- package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
- package/mobile/src/components/ApplicationForm/renderSlideCheckboxes.tsx +4 -4
- package/mobile/src/components/Filtration/Filtration.example.json +37 -0
- package/mobile/src/components/Filtration/Filtration.tsx +41 -0
- package/mobile/src/components/Filtration/Filtration.ui.json +1 -0
- package/mobile/src/components/Filtration/FiltrationContent.ts +87 -0
- package/mobile/src/components/Filtration/FiltrationInner.tsx +67 -0
- package/mobile/src/components/Filtration/checkShouldRenderBlock.ts +18 -0
- package/mobile/src/components/Filtration/renderFormItem.tsx +36 -0
- package/mobile/src/components/ProductBlock/ProductBlock.example.json +2 -1
- package/mobile/src/components/ProductBlock/ProductBlockContent.ts +2 -0
- package/mobile/src/hooks/useForm.ts +29 -0
- package/mobile/src/model/JSXBlock.ts +2 -0
- package/mobile/src/ui-kit/ControlProps.ts +4 -0
- package/mobile/src/ui-kit/Foldable/DefaultFoldButton.tsx +11 -11
- package/mobile/src/ui-kit/SlideCheckbox/SlideCheckbox.tsx +26 -23
- package/mobile/src/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.tsx +44 -0
- package/package.json +2 -1
- package/src/components/ApplicationForm/renderSlideCheckboxes.tsx +4 -4
- package/src/components/Blocks.ts +2 -0
- package/src/components/Filtration/Filtration.example.json +37 -0
- package/src/components/Filtration/Filtration.fixture.tsx +147 -0
- package/src/components/Filtration/Filtration.tsx +41 -0
- package/src/components/Filtration/Filtration.ui.json +1 -0
- package/src/components/Filtration/FiltrationContent.ts +87 -0
- package/src/components/Filtration/FiltrationInner.tsx +67 -0
- package/src/components/Filtration/checkShouldRenderBlock.ts +18 -0
- package/src/components/Filtration/renderFormItem.tsx +36 -0
- package/src/components/ProductBlock/ProductBlock.example.json +2 -1
- package/src/components/ProductBlock/ProductBlock.fixture.tsx +17 -0
- package/src/components/ProductBlock/ProductBlockContent.ts +2 -0
- package/src/components/ProductBlock/ProductBlockInner.tsx +4 -1
- package/src/hooks/useForm.ts +29 -0
- package/src/model/JSXBlock.ts +2 -0
- package/src/ui-kit/ControlProps.ts +4 -0
- package/src/ui-kit/Foldable/DefaultFoldButton.tsx +11 -11
- package/src/ui-kit/SlideCheckbox/SlideCheckbox.fixture.tsx +1 -1
- package/src/ui-kit/SlideCheckbox/SlideCheckbox.tsx +26 -23
- package/src/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.tsx +44 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { renderBlocksList } from '../../BlockRenderer/renderBlockList';
|
|
3
|
+
import type { IconName } from '../../icons/IconName';
|
|
4
|
+
import type { UniBlockProps } from '../../model/JSXBlock';
|
|
5
|
+
import { DefaultFoldButton } from '../../ui-kit/Foldable/DefaultFoldButton';
|
|
6
|
+
import { Foldable } from '../../ui-kit/Foldable/Foldable';
|
|
7
|
+
import { FoldableSection } from '../../ui-kit/Foldable/FoldableSection';
|
|
8
|
+
import { style } from '../../utils/style';
|
|
9
|
+
import { ErrorBlock } from '../ErrorBlock/ErrorBlock';
|
|
10
|
+
import { checkShouldRenderBlock } from './checkShouldRenderBlock';
|
|
11
|
+
import type { FiltrationInnerContent } from './FiltrationContent';
|
|
12
|
+
|
|
13
|
+
const ICONS: IconName[] = ['ArrowDownIcon', 'ArrowUpIcon'];
|
|
14
|
+
|
|
15
|
+
const resultsGridStyle = 'grid grid-cols-12 gap-1 border-box';
|
|
16
|
+
|
|
17
|
+
interface FiltrationInnerProps extends FiltrationInnerContent, UniBlockProps {
|
|
18
|
+
filtrationState?: Record<string, any>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const FiltrationInner = JSX<FiltrationInnerProps>(
|
|
22
|
+
({ label = '', filtrationState = {}, topItemsCount = 0, block, ...rest }) => {
|
|
23
|
+
const blocksToRender =
|
|
24
|
+
block?.blocks?.filter((b) => checkShouldRenderBlock(filtrationState, b.content || {})) || [];
|
|
25
|
+
|
|
26
|
+
const [visibleBlocks, hiddenBlocks] =
|
|
27
|
+
topItemsCount > 0
|
|
28
|
+
? [blocksToRender.slice(0, topItemsCount), blocksToRender.slice(topItemsCount)]
|
|
29
|
+
: [blocksToRender, []];
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div>
|
|
33
|
+
<div className={style(blocksToRender.length ? 'hidden' : '')}>
|
|
34
|
+
<ErrorBlock
|
|
35
|
+
error={{ errorContentType: 'Image' }}
|
|
36
|
+
title="Нет подходящей ипотечной программы"
|
|
37
|
+
subtitle="Попробуйте очистить фильтры"
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
40
|
+
<div className={style(blocksToRender.length ? '' : 'hidden')}>
|
|
41
|
+
<div className={resultsGridStyle}>
|
|
42
|
+
{renderBlocksList(visibleBlocks, { ...rest.options, parent: block })}
|
|
43
|
+
</div>
|
|
44
|
+
<Foldable
|
|
45
|
+
renderFoldableSection={({ isUnfolded }) => {
|
|
46
|
+
return (
|
|
47
|
+
<FoldableSection className={resultsGridStyle} isUnfolded={isUnfolded}>
|
|
48
|
+
{renderBlocksList(hiddenBlocks, { ...rest.options, parent: block })}
|
|
49
|
+
</FoldableSection>
|
|
50
|
+
);
|
|
51
|
+
}}
|
|
52
|
+
renderFoldButton={({ isUnfolded, onToggle }) => (
|
|
53
|
+
<DefaultFoldButton
|
|
54
|
+
className={style('mt-11', topItemsCount < 1 ? 'hidden' : '')}
|
|
55
|
+
disabled={!hiddenBlocks?.length}
|
|
56
|
+
label={label}
|
|
57
|
+
icon={ICONS[Number(isUnfolded)]}
|
|
58
|
+
dataTheme={rest.options?.page?.colorPalette}
|
|
59
|
+
onClick={onToggle}
|
|
60
|
+
/>
|
|
61
|
+
)}
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const isSingularFieldMatch =
|
|
2
|
+
<P extends Partial<Record<string, any>>, T extends P>(key: string, pattern: P) =>
|
|
3
|
+
(target: T) =>
|
|
4
|
+
pattern[key] === undefined || pattern[key] === target[key];
|
|
5
|
+
|
|
6
|
+
const isMultipleFieldMatch =
|
|
7
|
+
<P extends Partial<Record<string, any[]>>, T extends P>(key: string, pattern: P) =>
|
|
8
|
+
(target: T) =>
|
|
9
|
+
pattern[key] === undefined || pattern[key]?.every((_) => target[key]?.includes(_));
|
|
10
|
+
|
|
11
|
+
export const checkShouldRenderBlock = (pattern: Record<string, any>, target: Record<string, any>) =>
|
|
12
|
+
Object.entries(pattern)
|
|
13
|
+
.map(([key, subPattern]) =>
|
|
14
|
+
Array.isArray(subPattern)
|
|
15
|
+
? isMultipleFieldMatch(key, pattern)
|
|
16
|
+
: isSingularFieldMatch(key, pattern),
|
|
17
|
+
)
|
|
18
|
+
.every((predicate) => predicate(target));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FormElementRegisterer } from '../../hooks/useForm';
|
|
2
|
+
import { SlideCheckboxGroup } from '../../ui-kit/SlideCheckboxGroup/SlideCheckboxGroup';
|
|
3
|
+
import { Text } from '../../ui-kit/Text/Text';
|
|
4
|
+
import type { FiltrationSchema, StringEnum } from './FiltrationContent';
|
|
5
|
+
|
|
6
|
+
export const renderFormItem =
|
|
7
|
+
(filtrationSchema: FiltrationSchema, register: FormElementRegisterer) => (key: string) => {
|
|
8
|
+
const item = filtrationSchema[key as keyof typeof filtrationSchema];
|
|
9
|
+
const type = item?.type;
|
|
10
|
+
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'string':
|
|
13
|
+
return renderRadioButtons(key, register)(item);
|
|
14
|
+
default:
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const renderRadioButtons =
|
|
20
|
+
(key: string, register: FormElementRegisterer) => (item?: StringEnum) => {
|
|
21
|
+
const options =
|
|
22
|
+
item?.enum?.map((e, i) => ({ value: e, title: item?.enumNames?.[i] || '' })) || [];
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div role="radiogroup" key={key}>
|
|
26
|
+
{item?.title ? (
|
|
27
|
+
<div className="mb-4">
|
|
28
|
+
<Text size="text-m" font="font-light" color="text-secondary-text">
|
|
29
|
+
{item.title}
|
|
30
|
+
</Text>
|
|
31
|
+
</div>
|
|
32
|
+
) : null}
|
|
33
|
+
<SlideCheckboxGroup items={options} multiple={false} {...register(key)} />
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
@@ -93,6 +93,23 @@ export default {
|
|
|
93
93
|
/>
|
|
94
94
|
</div>
|
|
95
95
|
),
|
|
96
|
+
'primary with back button direction left': (
|
|
97
|
+
<div className="container grid grid-cols-12">
|
|
98
|
+
<ProductBlock
|
|
99
|
+
className="col-span-12"
|
|
100
|
+
backwardButton={backwardButton}
|
|
101
|
+
headlineVersion="L"
|
|
102
|
+
title="Потребительский кредит наличными"
|
|
103
|
+
description="Кредит наличными без залога и поручительства. Потребительский кредит на любые цели. Нужен только паспорт."
|
|
104
|
+
benefitsCountOfRow={2}
|
|
105
|
+
benefits={benefits}
|
|
106
|
+
benefitsVersion="normal"
|
|
107
|
+
buttons={buttons}
|
|
108
|
+
image={image}
|
|
109
|
+
directionRight={false}
|
|
110
|
+
/>
|
|
111
|
+
</div>
|
|
112
|
+
),
|
|
96
113
|
'primary with color benefits': (
|
|
97
114
|
<div className="container grid grid-cols-12">
|
|
98
115
|
<ProductBlock
|
|
@@ -29,12 +29,16 @@ export const ProductBlockInner = JSX<ProductBlockInnerProps>(
|
|
|
29
29
|
version = 'primary',
|
|
30
30
|
isDotted = true,
|
|
31
31
|
textBlockClassName = '',
|
|
32
|
+
directionRight = true,
|
|
32
33
|
}) => {
|
|
33
34
|
const benefitsCount = benefits?.filter((_) => _.label)?.length;
|
|
34
35
|
const benefitsContainerStyles = getBenefitsContainerStyles(benefitsCountOfRow);
|
|
35
36
|
|
|
36
37
|
return (
|
|
37
38
|
<div className={style('flex grow justify-between items-stretch h-full', className)}>
|
|
39
|
+
{image?.src ? (
|
|
40
|
+
<Img className={`mt-[-50px] ${directionRight ? 'order-2' : ''}`} image={image} />
|
|
41
|
+
) : null}
|
|
38
42
|
<div className={style('flex flex-col', textBlockClassName)}>
|
|
39
43
|
<Headline
|
|
40
44
|
className="!p-0 max-w-[600px]"
|
|
@@ -67,7 +71,6 @@ export const ProductBlockInner = JSX<ProductBlockInnerProps>(
|
|
|
67
71
|
{footnote ? <p className="text-m-light pt-12">{footnote}</p> : null}
|
|
68
72
|
</div>
|
|
69
73
|
</div>
|
|
70
|
-
{image?.src && <Img className="mt-[-50px]" image={image} />}
|
|
71
74
|
</div>
|
|
72
75
|
);
|
|
73
76
|
},
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from '@redneckz/uni-jsx/lib/hooks';
|
|
2
|
+
|
|
3
|
+
export type FormElementRegisterer = ReturnType<typeof useForm>['register'];
|
|
4
|
+
|
|
5
|
+
export const useForm = <FormState extends Record<string, any>>(
|
|
6
|
+
initialState: Partial<FormState> = {},
|
|
7
|
+
) => {
|
|
8
|
+
const [formState, setFormState] = useState<Partial<FormState>>(initialState);
|
|
9
|
+
|
|
10
|
+
const handlersMap = useRef<Partial<Record<keyof FormState, () => void>>>({});
|
|
11
|
+
|
|
12
|
+
const register = <FieldName extends keyof FormState>(fieldName: FieldName) => {
|
|
13
|
+
if (!handlersMap.current) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const handler = (value?: FormState[FieldName]) => {
|
|
18
|
+
setFormState((prev) => ({ ...prev, [fieldName]: value }));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
handlersMap.current[fieldName] ||= handler;
|
|
22
|
+
|
|
23
|
+
return { value: formState?.[fieldName], onChange: handlersMap.current[fieldName] };
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const resetForm = useCallback(() => setFormState({}), []);
|
|
27
|
+
|
|
28
|
+
return { formState, register, resetForm };
|
|
29
|
+
};
|
package/src/model/JSXBlock.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { UNIComponent } from '@redneckz/uni-jsx';
|
|
2
|
+
import type { JSONSchema7Definition } from 'json-schema';
|
|
2
3
|
import type { BlockRendererOptions } from '../BlockRenderer/BlockRendererOptions';
|
|
3
4
|
import type { SlotName } from './BlockDecorator';
|
|
4
5
|
import type { BlockVersion } from './BlockVersion';
|
|
@@ -26,5 +27,6 @@ export type JSXBlock<BlockProps extends UniBlockProps = UniBlockProps> = UNIComp
|
|
|
26
27
|
VNode | VNode[]
|
|
27
28
|
> & {
|
|
28
29
|
childrenTypes?: string[] | { include?: string[]; exclude?: string[] };
|
|
30
|
+
childSchema?: (content: BlockDef['content']) => Record<string, JSONSchema7Definition>;
|
|
29
31
|
slots?: (props: BlockProps) => SlotName[];
|
|
30
32
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
2
|
import type { ColorPalette } from '../../model/ContentPageDef';
|
|
3
|
+
import { style } from '../../utils/style';
|
|
3
4
|
import type { IconName } from '../Icon/IconProps';
|
|
4
5
|
import { Img } from '../Img/Img';
|
|
5
6
|
import type { FoldablePartProps } from './FoldablePartProps';
|
|
@@ -9,25 +10,24 @@ interface DefaultFoldButtonProps {
|
|
|
9
10
|
label: string;
|
|
10
11
|
icon: IconName;
|
|
11
12
|
dataTheme?: ColorPalette;
|
|
13
|
+
disabled?: boolean;
|
|
12
14
|
onClick?: () => void;
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
export const DefaultFoldButton = JSX<DefaultFoldButtonProps>(
|
|
16
|
-
({ className = '', label, icon, dataTheme = '', onClick }) => {
|
|
17
|
-
const STATE_STYLE =
|
|
18
|
-
'hover:bg-primary-hover focus:border-primary-text active:bg-primary-active outline-none';
|
|
19
|
-
const DIMENSIONS_STYLE = 'flex justify-center w-full px-0 py-5';
|
|
20
|
-
|
|
18
|
+
({ className = '', label, icon, dataTheme = '', disabled = false, onClick }) => {
|
|
21
19
|
return (
|
|
22
20
|
<button
|
|
23
|
-
className={
|
|
24
|
-
'
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
className={style(
|
|
22
|
+
'flex justify-center w-full px-0 py-5 border border-transparent outline-none focus:border-primary-text',
|
|
23
|
+
disabled
|
|
24
|
+
? 'bg-main-divider text-main-disabled hover:bg-main-divider'
|
|
25
|
+
: 'bg-primary-main text-white hover:bg-primary-hove',
|
|
27
26
|
className,
|
|
28
|
-
|
|
29
|
-
data-theme={dataTheme}
|
|
27
|
+
)}
|
|
30
28
|
onClick={onClick}
|
|
29
|
+
disabled={disabled}
|
|
30
|
+
data-theme={dataTheme}
|
|
31
31
|
>
|
|
32
32
|
<span className="text-h4 pr-3">{label}</span>
|
|
33
33
|
{icon ? (
|
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
-
import { Text } from '
|
|
2
|
+
import { Text } from '../Text/Text';
|
|
3
3
|
|
|
4
4
|
interface SlideCheckboxProps {
|
|
5
|
-
|
|
5
|
+
value?: boolean;
|
|
6
6
|
text?: string;
|
|
7
|
-
|
|
7
|
+
type?: 'checkbox' | 'radio';
|
|
8
|
+
onChange?: (value: boolean) => void;
|
|
8
9
|
}
|
|
9
|
-
export const SlideCheckbox = JSX<SlideCheckboxProps>(
|
|
10
|
-
|
|
11
|
-
role="checkbox"
|
|
12
|
-
aria-checked={checked}
|
|
13
|
-
className="flex justify-start items-center w-full cursor-pointer mb-4"
|
|
14
|
-
onClick={() => onClick && onClick()}
|
|
15
|
-
>
|
|
10
|
+
export const SlideCheckbox = JSX<SlideCheckboxProps>(
|
|
11
|
+
({ value = false, text, type = 'checkbox', onChange }) => (
|
|
16
12
|
<div
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
role={type}
|
|
14
|
+
aria-checked={value}
|
|
15
|
+
className="flex justify-start items-center w-full cursor-pointer mb-4"
|
|
16
|
+
onClick={() => onChange && onChange(!value)}
|
|
20
17
|
>
|
|
21
18
|
<div
|
|
22
|
-
className={`
|
|
23
|
-
|
|
19
|
+
className={`relative flex-shrink-0 duration-300 w-9 h-5 mr-3 rounded-2xl ${
|
|
20
|
+
value ? 'bg-primary-main' : 'bg-main-divider'
|
|
24
21
|
}`}
|
|
25
|
-
|
|
22
|
+
>
|
|
23
|
+
<div
|
|
24
|
+
className={`absolute opacity-80 duration-500 top-0.5 w-4 h-4 bg-white rounded-full ${
|
|
25
|
+
value ? 'left-[50%]' : 'left-[5%]'
|
|
26
|
+
}`}
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
<div>
|
|
30
|
+
<Text size="text-m" font="font-light" color="text-primary-text">
|
|
31
|
+
{text}
|
|
32
|
+
</Text>
|
|
33
|
+
</div>
|
|
26
34
|
</div>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
{text}
|
|
30
|
-
</Text>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
));
|
|
35
|
+
),
|
|
36
|
+
);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import type { ControlProps } from '../ControlProps';
|
|
3
|
+
import { SlideCheckbox } from '../SlideCheckbox/SlideCheckbox';
|
|
4
|
+
|
|
5
|
+
type SlideCheckboxGroupItem = {
|
|
6
|
+
value: string;
|
|
7
|
+
title: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
interface SlideCheckboxGroupProps extends ControlProps<string> {
|
|
11
|
+
multiple: false;
|
|
12
|
+
items: SlideCheckboxGroupItem[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface MultipleSlideCheckboxGroupProps extends ControlProps<string[]> {
|
|
16
|
+
multiple: true;
|
|
17
|
+
items: SlideCheckboxGroupItem[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const SlideCheckboxGroup = JSX<SlideCheckboxGroupProps | MultipleSlideCheckboxGroupProps>(
|
|
21
|
+
({ value, onChange, items = [], multiple }) => {
|
|
22
|
+
const handleChange = (newValue: string) => {
|
|
23
|
+
if (multiple) {
|
|
24
|
+
const hasAlready = value?.includes(newValue);
|
|
25
|
+
onChange &&
|
|
26
|
+
onChange(
|
|
27
|
+
hasAlready ? value?.filter((v) => v !== newValue) : [...(value || []), newValue],
|
|
28
|
+
);
|
|
29
|
+
} else {
|
|
30
|
+
onChange && onChange(value === newValue ? undefined : newValue);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return items.map((item) => (
|
|
35
|
+
<SlideCheckbox
|
|
36
|
+
key={item.value}
|
|
37
|
+
text={item.title}
|
|
38
|
+
value={[value].flatMap((_) => _).includes(item.value)}
|
|
39
|
+
onChange={() => handleChange(item.value)}
|
|
40
|
+
type={multiple ? 'checkbox' : 'radio'}
|
|
41
|
+
/>
|
|
42
|
+
));
|
|
43
|
+
},
|
|
44
|
+
);
|