@redneckz/wildless-cms-uni-blocks 0.14.335 → 0.14.337
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/bin/migration-scripts/0.14.213.js +1 -1
- package/bundle/blocks.schema.json +1 -1
- package/bundle/bundle.umd.js +57 -42
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/bundle/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/bundle/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/bundle/utils/getVersion.d.ts +1 -0
- package/dist/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +3 -2
- package/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/dist/components/TabsLayout/TabsLayout.js +16 -10
- package/dist/components/TabsLayout/TabsLayout.js.map +1 -1
- package/dist/components/TabsLayout/renderTabsLayout.js +14 -12
- package/dist/components/TabsLayout/renderTabsLayout.js.map +1 -1
- package/dist/ui-kit/Badge/Badge.js +1 -3
- package/dist/ui-kit/Badge/Badge.js.map +1 -1
- package/dist/ui-kit/BaseFiltration/useHotFilters.js +3 -3
- package/dist/ui-kit/BaseFiltration/useHotFilters.js.map +1 -1
- package/dist/ui-kit/TabsControl/ScrollableTabsControl.js +9 -4
- package/dist/ui-kit/TabsControl/ScrollableTabsControl.js.map +1 -1
- package/dist/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/dist/ui-kit/TabsControl/TabItem.js.map +1 -1
- package/dist/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/dist/ui-kit/TabsControl/TabItemInner.js +4 -2
- package/dist/ui-kit/TabsControl/TabItemInner.js.map +1 -1
- package/dist/utils/getVersion.d.ts +1 -0
- package/dist/utils/getVersion.js +5 -0
- package/dist/utils/getVersion.js.map +1 -0
- package/lib/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +3 -2
- package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/lib/components/TabsLayout/TabsLayout.fixture.d.ts +4 -3
- package/lib/components/TabsLayout/TabsLayout.fixture.mobile.d.ts +4 -2
- package/lib/components/TabsLayout/TabsLayout.js +16 -10
- package/lib/components/TabsLayout/TabsLayout.js.map +1 -1
- package/lib/components/TabsLayout/renderTabsLayout.js +14 -12
- package/lib/components/TabsLayout/renderTabsLayout.js.map +1 -1
- package/lib/ui-kit/Badge/Badge.js +1 -3
- package/lib/ui-kit/Badge/Badge.js.map +1 -1
- package/lib/ui-kit/BaseFiltration/useHotFilters.js +3 -3
- package/lib/ui-kit/BaseFiltration/useHotFilters.js.map +1 -1
- package/lib/ui-kit/TabsControl/ScrollableTabsControl.js +9 -4
- package/lib/ui-kit/TabsControl/ScrollableTabsControl.js.map +1 -1
- package/lib/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/lib/ui-kit/TabsControl/TabItem.js.map +1 -1
- package/lib/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/lib/ui-kit/TabsControl/TabItemInner.js +4 -2
- package/lib/ui-kit/TabsControl/TabItemInner.js.map +1 -1
- package/lib/utils/getVersion.d.ts +1 -0
- package/lib/utils/getVersion.js +2 -0
- package/lib/utils/getVersion.js.map +1 -0
- package/mobile/bundle/bundle.umd.js +57 -42
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/mobile/bundle/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/mobile/bundle/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/mobile/bundle/utils/getVersion.d.ts +1 -0
- package/mobile/dist/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/mobile/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +3 -2
- package/mobile/dist/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/mobile/dist/components/TabsLayout/TabsLayout.js +16 -10
- package/mobile/dist/components/TabsLayout/TabsLayout.js.map +1 -1
- package/mobile/dist/components/TabsLayout/renderTabsLayout.js +14 -12
- package/mobile/dist/components/TabsLayout/renderTabsLayout.js.map +1 -1
- package/mobile/dist/ui-kit/Badge/Badge.js +1 -3
- package/mobile/dist/ui-kit/Badge/Badge.js.map +1 -1
- package/mobile/dist/ui-kit/BaseFiltration/useHotFilters.js +3 -3
- package/mobile/dist/ui-kit/BaseFiltration/useHotFilters.js.map +1 -1
- package/mobile/dist/ui-kit/TabsControl/ScrollableTabsControl.js +9 -4
- package/mobile/dist/ui-kit/TabsControl/ScrollableTabsControl.js.map +1 -1
- package/mobile/dist/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/mobile/dist/ui-kit/TabsControl/TabItem.js.map +1 -1
- package/mobile/dist/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/mobile/dist/ui-kit/TabsControl/TabItemInner.js +4 -2
- package/mobile/dist/ui-kit/TabsControl/TabItemInner.js.map +1 -1
- package/mobile/dist/utils/getVersion.d.ts +1 -0
- package/mobile/dist/utils/getVersion.js +5 -0
- package/mobile/dist/utils/getVersion.js.map +1 -0
- package/mobile/lib/components/ApplicationForm/ApplicationFormContent.d.ts +4 -1
- package/mobile/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js +3 -2
- package/mobile/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.js.map +1 -1
- package/mobile/lib/components/TabsLayout/TabsLayout.js +16 -10
- package/mobile/lib/components/TabsLayout/TabsLayout.js.map +1 -1
- package/mobile/lib/components/TabsLayout/renderTabsLayout.js +14 -12
- package/mobile/lib/components/TabsLayout/renderTabsLayout.js.map +1 -1
- package/mobile/lib/ui-kit/Badge/Badge.js +1 -3
- package/mobile/lib/ui-kit/Badge/Badge.js.map +1 -1
- package/mobile/lib/ui-kit/BaseFiltration/useHotFilters.js +3 -3
- package/mobile/lib/ui-kit/BaseFiltration/useHotFilters.js.map +1 -1
- package/mobile/lib/ui-kit/TabsControl/ScrollableTabsControl.js +9 -4
- package/mobile/lib/ui-kit/TabsControl/ScrollableTabsControl.js.map +1 -1
- package/mobile/lib/ui-kit/TabsControl/TabItem.d.ts +1 -2
- package/mobile/lib/ui-kit/TabsControl/TabItem.js.map +1 -1
- package/mobile/lib/ui-kit/TabsControl/TabItemInner.d.ts +1 -0
- package/mobile/lib/ui-kit/TabsControl/TabItemInner.js +4 -2
- package/mobile/lib/ui-kit/TabsControl/TabItemInner.js.map +1 -1
- package/mobile/lib/utils/getVersion.d.ts +1 -0
- package/mobile/lib/utils/getVersion.js +2 -0
- package/mobile/lib/utils/getVersion.js.map +1 -0
- package/mobile/src/components/ApplicationForm/ApplicationFormContent.ts +4 -1
- package/mobile/src/components/OfficesAtmsMap/OfficesAtmsMapLayout.tsx +3 -2
- package/mobile/src/components/TabsLayout/TabsLayout.tsx +20 -10
- package/mobile/src/components/TabsLayout/renderTabsLayout.tsx +24 -20
- package/mobile/src/ui-kit/Badge/Badge.tsx +13 -15
- package/mobile/src/ui-kit/BaseFiltration/useHotFilters.tsx +3 -7
- package/mobile/src/ui-kit/TabsControl/ScrollableTabsControl.tsx +13 -16
- package/mobile/src/ui-kit/TabsControl/TabItem.tsx +1 -2
- package/mobile/src/ui-kit/TabsControl/TabItemInner.tsx +9 -2
- package/mobile/src/utils/getVersion.ts +1 -0
- package/package.json +1 -1
- package/src/components/ApplicationForm/ApplicationFormContent.ts +4 -1
- package/src/components/OfficesAtmsMap/OfficesAtmsMapLayout.tsx +3 -2
- package/src/components/TabsLayout/TabsLayout.fixture.mobile.tsx +70 -24
- package/src/components/TabsLayout/TabsLayout.fixture.tsx +33 -29
- package/src/components/TabsLayout/TabsLayout.tsx +20 -10
- package/src/components/TabsLayout/renderTabsLayout.tsx +24 -20
- package/src/ui-kit/Badge/Badge.tsx +13 -15
- package/src/ui-kit/BaseFiltration/useHotFilters.tsx +3 -7
- package/src/ui-kit/TabsControl/ScrollableTabsControl.tsx +13 -16
- package/src/ui-kit/TabsControl/TabItem.tsx +1 -2
- package/src/ui-kit/TabsControl/TabItemInner.tsx +9 -2
- package/src/utils/getVersion.ts +1 -0
|
@@ -9,8 +9,40 @@ const options: BlockRendererOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
const TABS: Tab[] = [
|
|
12
|
-
{
|
|
13
|
-
|
|
12
|
+
{
|
|
13
|
+
type: 'group',
|
|
14
|
+
description: 'Описание первого таб группа',
|
|
15
|
+
text: 'Первый таб',
|
|
16
|
+
selected: false,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
type: 'group',
|
|
20
|
+
description: 'Описание первого таб группа',
|
|
21
|
+
text: 'Второй таб',
|
|
22
|
+
selected: false,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
type: 'group',
|
|
26
|
+
description: 'Описание первого таб группа',
|
|
27
|
+
text: 'Третий таб и с очень длинным текстом',
|
|
28
|
+
selected: false,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
const TabsWithIcon: Tab[] = [
|
|
32
|
+
{
|
|
33
|
+
type: 'group',
|
|
34
|
+
description: 'Описание первого таба',
|
|
35
|
+
text: 'Первый таб',
|
|
36
|
+
selected: false,
|
|
37
|
+
icon: { icon: 'CalendarIcon' },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'group',
|
|
41
|
+
description: 'Описание второго таба',
|
|
42
|
+
text: 'Второй таб',
|
|
43
|
+
selected: false,
|
|
44
|
+
icon: { icon: 'BankIcon' },
|
|
45
|
+
},
|
|
14
46
|
];
|
|
15
47
|
|
|
16
48
|
const TEXT_BLOCK_DESCRIPTION = {
|
|
@@ -22,52 +54,66 @@ const TEXT_BLOCK_DESCRIPTION = {
|
|
|
22
54
|
style: ['col-span-12'],
|
|
23
55
|
};
|
|
24
56
|
|
|
57
|
+
const slots = {
|
|
58
|
+
'Первый таб': [TEXT_BLOCK_DESCRIPTION],
|
|
59
|
+
'Второй таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
60
|
+
'Третий таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
61
|
+
};
|
|
62
|
+
|
|
25
63
|
export default {
|
|
26
64
|
default: (
|
|
27
65
|
<div className="container grid grid-cols-12">
|
|
28
66
|
<TabsLayout
|
|
29
67
|
className="col-span-12"
|
|
30
68
|
tabs={TABS}
|
|
69
|
+
tabsType="default"
|
|
31
70
|
options={options}
|
|
71
|
+
block={{ slots }}
|
|
72
|
+
/>
|
|
73
|
+
</div>
|
|
74
|
+
),
|
|
75
|
+
animated: (
|
|
76
|
+
<div className="container grid grid-cols-12">
|
|
77
|
+
<TabsLayout
|
|
78
|
+
className="col-span-12"
|
|
79
|
+
tabs={TABS}
|
|
32
80
|
tabsType="animated"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
'Первый таб': [TEXT_BLOCK_DESCRIPTION],
|
|
36
|
-
'Второй таб': [TEXT_BLOCK_DESCRIPTION],
|
|
37
|
-
},
|
|
38
|
-
}}
|
|
81
|
+
options={options}
|
|
82
|
+
block={{ slots }}
|
|
39
83
|
/>
|
|
40
84
|
</div>
|
|
41
85
|
),
|
|
42
|
-
|
|
86
|
+
underlined: (
|
|
43
87
|
<div className="container grid grid-cols-12">
|
|
44
88
|
<TabsLayout
|
|
45
89
|
className="col-span-12"
|
|
46
90
|
tabs={TABS}
|
|
91
|
+
tabsType="underlined"
|
|
47
92
|
options={options}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
93
|
+
block={{ slots }}
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
),
|
|
97
|
+
animatedIcons: (
|
|
98
|
+
<div className="container grid grid-cols-12">
|
|
99
|
+
<TabsLayout
|
|
100
|
+
className="col-span-12"
|
|
101
|
+
tabs={TabsWithIcon}
|
|
102
|
+
tabsType="animated"
|
|
103
|
+
options={options}
|
|
104
|
+
block={{ slots }}
|
|
55
105
|
/>
|
|
56
106
|
</div>
|
|
57
107
|
),
|
|
58
|
-
|
|
108
|
+
defaultCounter: (
|
|
59
109
|
<div className="container grid grid-cols-12">
|
|
60
110
|
<TabsLayout
|
|
61
111
|
className="col-span-12"
|
|
62
112
|
tabs={TABS}
|
|
113
|
+
tabsType="default"
|
|
63
114
|
options={options}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
slots: {
|
|
67
|
-
'Первый таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
68
|
-
'Второй таб': [TEXT_BLOCK_DESCRIPTION],
|
|
69
|
-
},
|
|
70
|
-
}}
|
|
115
|
+
block={{ slots }}
|
|
116
|
+
showCounter={true}
|
|
71
117
|
/>
|
|
72
118
|
</div>
|
|
73
119
|
),
|
|
@@ -21,6 +21,12 @@ const TABS: Tab[] = [
|
|
|
21
21
|
text: 'Второй таб',
|
|
22
22
|
selected: false,
|
|
23
23
|
},
|
|
24
|
+
{
|
|
25
|
+
type: 'group',
|
|
26
|
+
description: 'Описание первого таб группа',
|
|
27
|
+
text: 'Третий таб и с очень длинным текстом и так далее и тому подобное',
|
|
28
|
+
selected: false,
|
|
29
|
+
},
|
|
24
30
|
];
|
|
25
31
|
const TabsWithIcon: Tab[] = [
|
|
26
32
|
{
|
|
@@ -48,68 +54,66 @@ const TEXT_BLOCK_DESCRIPTION = {
|
|
|
48
54
|
style: ['col-span-12'],
|
|
49
55
|
};
|
|
50
56
|
|
|
57
|
+
const slots = {
|
|
58
|
+
'Первый таб': [TEXT_BLOCK_DESCRIPTION],
|
|
59
|
+
'Второй таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
60
|
+
'Третий таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
61
|
+
};
|
|
62
|
+
|
|
51
63
|
export default {
|
|
52
64
|
default: (
|
|
53
65
|
<div className="container grid grid-cols-12">
|
|
54
66
|
<TabsLayout
|
|
55
67
|
className="col-span-12"
|
|
56
68
|
tabs={TABS}
|
|
57
|
-
tabsType="
|
|
69
|
+
tabsType="default"
|
|
58
70
|
options={options}
|
|
59
|
-
block={{
|
|
60
|
-
slots: {
|
|
61
|
-
'Первый таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
62
|
-
'Второй таб': [TEXT_BLOCK_DESCRIPTION],
|
|
63
|
-
},
|
|
64
|
-
}}
|
|
71
|
+
block={{ slots }}
|
|
65
72
|
/>
|
|
66
73
|
</div>
|
|
67
74
|
),
|
|
68
|
-
|
|
75
|
+
animated: (
|
|
69
76
|
<div className="container grid grid-cols-12">
|
|
70
77
|
<TabsLayout
|
|
71
78
|
className="col-span-12"
|
|
72
79
|
tabs={TABS}
|
|
73
|
-
tabsType="
|
|
80
|
+
tabsType="animated"
|
|
74
81
|
options={options}
|
|
75
|
-
block={{
|
|
76
|
-
slots: {
|
|
77
|
-
'Первый таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
78
|
-
'Второй таб': [TEXT_BLOCK_DESCRIPTION],
|
|
79
|
-
},
|
|
80
|
-
}}
|
|
82
|
+
block={{ slots }}
|
|
81
83
|
/>
|
|
82
84
|
</div>
|
|
83
85
|
),
|
|
84
|
-
|
|
86
|
+
underlined: (
|
|
85
87
|
<div className="container grid grid-cols-12">
|
|
86
88
|
<TabsLayout
|
|
87
89
|
className="col-span-12"
|
|
88
90
|
tabs={TABS}
|
|
89
91
|
tabsType="underlined"
|
|
90
92
|
options={options}
|
|
91
|
-
block={{
|
|
92
|
-
slots: {
|
|
93
|
-
'Первый таб': [TEXT_BLOCK_DESCRIPTION, TEXT_BLOCK_DESCRIPTION],
|
|
94
|
-
'Второй таб': [TEXT_BLOCK_DESCRIPTION],
|
|
95
|
-
},
|
|
96
|
-
}}
|
|
93
|
+
block={{ slots }}
|
|
97
94
|
/>
|
|
98
95
|
</div>
|
|
99
96
|
),
|
|
100
|
-
|
|
97
|
+
animatedIcons: (
|
|
101
98
|
<div className="container grid grid-cols-12">
|
|
102
99
|
<TabsLayout
|
|
103
100
|
className="col-span-12"
|
|
104
101
|
tabs={TabsWithIcon}
|
|
105
102
|
tabsType="animated"
|
|
106
103
|
options={options}
|
|
107
|
-
block={{
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
104
|
+
block={{ slots }}
|
|
105
|
+
/>
|
|
106
|
+
</div>
|
|
107
|
+
),
|
|
108
|
+
defaultCounter: (
|
|
109
|
+
<div className="container grid grid-cols-12">
|
|
110
|
+
<TabsLayout
|
|
111
|
+
className="col-span-12"
|
|
112
|
+
tabs={TABS}
|
|
113
|
+
tabsType="default"
|
|
114
|
+
options={options}
|
|
115
|
+
block={{ slots }}
|
|
116
|
+
showCounter={true}
|
|
113
117
|
/>
|
|
114
118
|
</div>
|
|
115
119
|
),
|
|
@@ -11,21 +11,31 @@ import { type Tab, type TabsLayoutContent } from './TabsLayoutContent';
|
|
|
11
11
|
|
|
12
12
|
const TAB_QUERY_PARAM_KEY = 'tab';
|
|
13
13
|
|
|
14
|
+
type TabCountedProps = Tab & {
|
|
15
|
+
count?: number;
|
|
16
|
+
};
|
|
14
17
|
export interface TabsLayoutProps extends TabsLayoutContent, UniBlockProps {}
|
|
15
18
|
|
|
16
19
|
export const TabsLayout = UniBlock<TabsLayoutProps>(
|
|
17
|
-
({ className = '', tabs = [], block, tabsType, ...rest }) => {
|
|
20
|
+
({ className = '', tabs = [], block, tabsType, showCounter = false, ...rest }) => {
|
|
18
21
|
const router = useRouter();
|
|
19
22
|
|
|
23
|
+
const tabsCounted: TabCountedProps[] = showCounter
|
|
24
|
+
? tabs.map((_) => ({
|
|
25
|
+
..._,
|
|
26
|
+
count: block?.slots?.[_?.text ?? '']?.length ?? 0,
|
|
27
|
+
}))
|
|
28
|
+
: tabs;
|
|
29
|
+
|
|
20
30
|
const { isReady } = router;
|
|
21
31
|
|
|
22
|
-
const [activeTabIndex, setActiveTabIndex] = useState(getInitSelectedIndex(
|
|
32
|
+
const [activeTabIndex, setActiveTabIndex] = useState(getInitSelectedIndex(tabsCounted));
|
|
23
33
|
|
|
24
|
-
const defaultSelectedTab =
|
|
34
|
+
const defaultSelectedTab = tabsCounted.findIndex((_) => Boolean(_.selected));
|
|
25
35
|
|
|
26
36
|
useEffect(() => {
|
|
27
37
|
const defaultTabIndex = router.query[TAB_QUERY_PARAM_KEY]
|
|
28
|
-
?
|
|
38
|
+
? tabsCounted.findIndex(
|
|
29
39
|
(_, index) => _.type === 'group' && String(index) === router.query[TAB_QUERY_PARAM_KEY],
|
|
30
40
|
)
|
|
31
41
|
: defaultSelectedTab;
|
|
@@ -33,7 +43,7 @@ export const TabsLayout = UniBlock<TabsLayoutProps>(
|
|
|
33
43
|
setActiveTabIndex(defaultTabIndex === -1 ? 0 : defaultTabIndex);
|
|
34
44
|
}, [isReady, defaultSelectedTab]);
|
|
35
45
|
|
|
36
|
-
const slotName = getSlotName(
|
|
46
|
+
const slotName = getSlotName(tabsCounted[activeTabIndex], activeTabIndex);
|
|
37
47
|
|
|
38
48
|
const updateUrlSearchTabParam = (_: TabItemBase, index: number) => {
|
|
39
49
|
const searchParams = new URLSearchParams(router.query as Record<string, string>);
|
|
@@ -47,8 +57,8 @@ export const TabsLayout = UniBlock<TabsLayoutProps>(
|
|
|
47
57
|
|
|
48
58
|
const handleChange = useCallback(
|
|
49
59
|
(_: TabItemBase) => {
|
|
50
|
-
const index =
|
|
51
|
-
const tab =
|
|
60
|
+
const index = tabsCounted.indexOf(_ as Tab);
|
|
61
|
+
const tab = tabsCounted[index];
|
|
52
62
|
|
|
53
63
|
setActiveTabIndex(index);
|
|
54
64
|
|
|
@@ -56,14 +66,14 @@ export const TabsLayout = UniBlock<TabsLayoutProps>(
|
|
|
56
66
|
updateUrlSearchTabParam(_, index);
|
|
57
67
|
}
|
|
58
68
|
},
|
|
59
|
-
[
|
|
69
|
+
[tabsCounted],
|
|
60
70
|
);
|
|
61
71
|
|
|
62
72
|
return (
|
|
63
73
|
<BlockWrapper className={style(className)} defaultPadding="p-0" {...rest}>
|
|
64
74
|
{renderTabsLayout({
|
|
65
|
-
items:
|
|
66
|
-
value:
|
|
75
|
+
items: tabsCounted,
|
|
76
|
+
value: tabsCounted[activeTabIndex],
|
|
67
77
|
tabsType,
|
|
68
78
|
onChange: handleChange,
|
|
69
79
|
})}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ScrollableTabsControl } from '../../ui-kit/TabsControl/ScrollableTabsControl';
|
|
2
2
|
import { type TabItemBase } from '../../ui-kit/TabsControl/TabItem';
|
|
3
|
-
import { TabsControl } from '../../ui-kit/TabsControl/TabsControl';
|
|
4
3
|
import { type TabsControlProps, type TabsType } from '../../ui-kit/TabsControl/TabsControlProps';
|
|
5
4
|
|
|
6
5
|
interface RenderTabsProps {
|
|
@@ -10,23 +9,28 @@ interface RenderTabsProps {
|
|
|
10
9
|
tabsType?: TabsType;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<ScrollableTabsControl className="m-auto" {...props} tabsType="animated" />
|
|
27
|
-
</div>
|
|
28
|
-
);
|
|
29
|
-
default:
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
12
|
+
const tabsStyle: Record<TabsType, { wrapper: string; component: string }> = {
|
|
13
|
+
default: {
|
|
14
|
+
wrapper: '',
|
|
15
|
+
component: '',
|
|
16
|
+
},
|
|
17
|
+
animated: {
|
|
18
|
+
wrapper: 'border-b-8 border-primary-main bg-white',
|
|
19
|
+
component: 'm-auto',
|
|
20
|
+
},
|
|
21
|
+
underlined: {
|
|
22
|
+
wrapper: 'flex',
|
|
23
|
+
component: 'm-auto',
|
|
24
|
+
},
|
|
32
25
|
};
|
|
26
|
+
|
|
27
|
+
export const renderTabsLayout = ({ tabsType = 'animated', ...props }: RenderTabsProps) =>
|
|
28
|
+
tabsType ? (
|
|
29
|
+
<div className={tabsStyle[tabsType].wrapper}>
|
|
30
|
+
<ScrollableTabsControl
|
|
31
|
+
className={tabsStyle[tabsType].component}
|
|
32
|
+
tabsType={tabsType}
|
|
33
|
+
{...props}
|
|
34
|
+
/>
|
|
35
|
+
</div>
|
|
36
|
+
) : null;
|
|
@@ -18,18 +18,16 @@ const badgeTextColorStyleMap: Record<string, TextColor> = {
|
|
|
18
18
|
secondary: 'text-secondary-text',
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
export const Badge = JSX<BadgeProps>(({ count, version = 'secondary' }) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
);
|
|
35
|
-
});
|
|
21
|
+
export const Badge = JSX<BadgeProps>(({ count, version = 'secondary' }) => (
|
|
22
|
+
<div
|
|
23
|
+
className={style(
|
|
24
|
+
'w-6 h-6 rounded-full flex items-center justify-center',
|
|
25
|
+
badgeBgStyleMap[version],
|
|
26
|
+
)}
|
|
27
|
+
role="status"
|
|
28
|
+
>
|
|
29
|
+
<Text size="text-xs" color={badgeTextColorStyleMap[version]}>
|
|
30
|
+
{count}
|
|
31
|
+
</Text>
|
|
32
|
+
</div>
|
|
33
|
+
));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useMemo } from '@redneckz/uni-jsx/lib/hooks';
|
|
2
2
|
import { type BlockDef } from '../../model/ContentPageDef';
|
|
3
|
-
import {
|
|
3
|
+
import { getVersion } from '../../utils/getVersion';
|
|
4
4
|
import { type TabItemBase } from '../TabsControl/TabItem';
|
|
5
5
|
import { type TabsControlProps } from '../TabsControl/TabsControlProps';
|
|
6
6
|
import { getBadgeCount } from './getBadgeCount';
|
|
@@ -40,12 +40,8 @@ export const useHotFilters = ({
|
|
|
40
40
|
() =>
|
|
41
41
|
hotFilters.map((_) => ({
|
|
42
42
|
text: _.text,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
version={_ === hotFilters[activeItemIndex] ? 'primary' : 'secondary'}
|
|
46
|
-
count={getBadgeCount(blocks, _.filter)}
|
|
47
|
-
/>
|
|
48
|
-
),
|
|
43
|
+
count: getBadgeCount(blocks, _.filter),
|
|
44
|
+
version: getVersion(_ === hotFilters[activeItemIndex]),
|
|
49
45
|
})),
|
|
50
46
|
[hotFilters, blocks, activeItemIndex],
|
|
51
47
|
);
|
|
@@ -4,18 +4,23 @@ import { ScrollLeftButton, ScrollRightButton } from '../LinkButton/ArrowButton';
|
|
|
4
4
|
import { SwipeListContainer } from '../SwipeListControl/SwipeListContainer';
|
|
5
5
|
import { useSwipeListScroll } from '../SwipeListControl/useSwipeListScroll';
|
|
6
6
|
import { renderTab } from './renderTab';
|
|
7
|
-
import { type TabsControlProps } from './TabsControlProps';
|
|
7
|
+
import { type TabsControlProps, type TabsType } from './TabsControlProps';
|
|
8
8
|
|
|
9
9
|
const scrollButtonStyle = 'hidden sm:flex absolute z-40';
|
|
10
10
|
|
|
11
|
-
const
|
|
11
|
+
const scrollStyle: Record<TabsType, { item: string; gap: number; buttonTop: string }> = {
|
|
12
|
+
default: {
|
|
13
|
+
item: 'flex-1',
|
|
14
|
+
gap: 0,
|
|
15
|
+
buttonTop: 'top-0',
|
|
16
|
+
},
|
|
12
17
|
animated: {
|
|
13
|
-
|
|
18
|
+
item: 'flex',
|
|
14
19
|
gap: 8,
|
|
15
20
|
buttonTop: 'top-5',
|
|
16
21
|
},
|
|
17
22
|
underlined: {
|
|
18
|
-
|
|
23
|
+
item: '',
|
|
19
24
|
gap: 0,
|
|
20
25
|
buttonTop: 'top-0',
|
|
21
26
|
},
|
|
@@ -33,28 +38,20 @@ export const ScrollableTabsControl = JSX<TabsControlProps>(
|
|
|
33
38
|
containerRef={containerRef}
|
|
34
39
|
snapAlign="snap-start"
|
|
35
40
|
onVisibleIndicesChange={scroll.handleVisibleIndicesChange}
|
|
36
|
-
itemClassName={
|
|
37
|
-
gap={
|
|
41
|
+
itemClassName={scrollStyle[tabsType].item}
|
|
42
|
+
gap={scrollStyle[tabsType].gap}
|
|
38
43
|
>
|
|
39
44
|
{items.map(renderTab(value, onChange, tabsType))}
|
|
40
45
|
</SwipeListContainer>
|
|
41
46
|
{scroll.canScrollLeft ? (
|
|
42
47
|
<ScrollLeftButton
|
|
43
|
-
className={style(
|
|
44
|
-
'left-6',
|
|
45
|
-
scrollButtonStyle,
|
|
46
|
-
scrollStyleType[tabsType].buttonTop as string,
|
|
47
|
-
)}
|
|
48
|
+
className={style('left-6', scrollButtonStyle, scrollStyle[tabsType].buttonTop)}
|
|
48
49
|
onClick={scroll.scrollLeft}
|
|
49
50
|
/>
|
|
50
51
|
) : null}
|
|
51
52
|
{scroll.canScrollRight ? (
|
|
52
53
|
<ScrollRightButton
|
|
53
|
-
className={style(
|
|
54
|
-
'right-6',
|
|
55
|
-
scrollButtonStyle,
|
|
56
|
-
scrollStyleType[tabsType].buttonTop as string,
|
|
57
|
-
)}
|
|
54
|
+
className={style('right-6', scrollButtonStyle, scrollStyle[tabsType].buttonTop)}
|
|
58
55
|
onClick={scroll.scrollRight}
|
|
59
56
|
/>
|
|
60
57
|
) : null}
|
|
@@ -4,12 +4,11 @@ import { useLink } from '../../hooks/useLink';
|
|
|
4
4
|
import { type DescriptionProps, type TitleProps } from '../../model/HeadlineType';
|
|
5
5
|
import { type LinkProps } from '../../model/LinkProps';
|
|
6
6
|
import { type IconProps } from '../../model/Picture';
|
|
7
|
-
import { type VNode } from '../../model/VNode';
|
|
8
7
|
import { TabItemInner } from './TabItemInner';
|
|
9
8
|
import { type TabsControlProps, type TabsType } from './TabsControlProps';
|
|
10
9
|
export interface TabItemBase extends LinkProps, TitleProps, DescriptionProps, IconProps {
|
|
11
10
|
name?: string;
|
|
12
|
-
|
|
11
|
+
count?: number;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
export interface TabItemProps {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { getVersion } from '../../utils/getVersion';
|
|
2
3
|
import { style } from '../../utils/style';
|
|
4
|
+
import { Badge } from '../Badge/Badge';
|
|
3
5
|
import { renderTabItemInner } from './renderTabItemInner';
|
|
4
6
|
import { type TabItemProps } from './TabItem';
|
|
5
7
|
import { type TabsType } from './TabsControlProps';
|
|
@@ -32,13 +34,14 @@ const activeTabBgStyleMap: Record<TabsType, string> = {
|
|
|
32
34
|
|
|
33
35
|
interface TabItemInnerProps extends TabItemProps {
|
|
34
36
|
tag?: string;
|
|
37
|
+
count?: number;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
40
|
export const TabItemInner = JSX<TabItemInnerProps>(
|
|
38
41
|
({ tag = 'div', item = {}, isActive = false, type = 'default', onClick }) => {
|
|
39
42
|
const Tag: any = tag;
|
|
40
43
|
|
|
41
|
-
const { text, description, icon,
|
|
44
|
+
const { text, description, icon, count, ...link } = item;
|
|
42
45
|
|
|
43
46
|
return (
|
|
44
47
|
<Tag
|
|
@@ -68,7 +71,11 @@ export const TabItemInner = JSX<TabItemInnerProps>(
|
|
|
68
71
|
isActive,
|
|
69
72
|
type,
|
|
70
73
|
})}
|
|
71
|
-
{
|
|
74
|
+
{Number.isInteger(count) ? (
|
|
75
|
+
<div className="ml-xs">
|
|
76
|
+
<Badge count={count} version={getVersion(isActive)} />
|
|
77
|
+
</div>
|
|
78
|
+
) : null}
|
|
72
79
|
</div>
|
|
73
80
|
</Tag>
|
|
74
81
|
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const getVersion = (isPrimary: boolean) => (isPrimary ? 'primary' : 'secondary');
|