@redneckz/wildless-cms-uni-blocks 0.6.19 → 0.6.21

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 (218) hide show
  1. package/bin/migration-scripts/0.6.19.js +21 -0
  2. package/bin/migration-scripts/0.6.21.js +15 -0
  3. package/bundle/bundle.umd.js +49 -22
  4. package/bundle/bundle.umd.min.js +1 -1
  5. package/bundle/components/Blocks.d.ts +2 -41
  6. package/bundle/components/Blocks.mobile.d.ts +2 -18
  7. package/bundle/components/ContentPage/ContentPage.d.ts +2 -2
  8. package/bundle/components/ContentPage/mapSlot.d.ts +2 -0
  9. package/bundle/components/ContentPage/normalizeBlock.d.ts +3 -11
  10. package/bundle/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
  11. package/bundle/components/ContentPage/renderBlock.d.ts +7 -3
  12. package/bundle/components/ContentPage/renderBlockList.d.ts +14 -0
  13. package/bundle/components/ContentPage/renderSlots.d.ts +12 -0
  14. package/bundle/model/BlockDecorator.d.ts +4 -3
  15. package/bundle/model/BlocksRegistry.d.ts +1 -1
  16. package/bundle/model/ContentPageDef.d.ts +1 -4
  17. package/bundle/model/JSXBlock.d.ts +3 -1
  18. package/dist/components/Blocks.d.ts +2 -41
  19. package/dist/components/Blocks.js.map +1 -1
  20. package/dist/components/Blocks.mobile.d.ts +2 -18
  21. package/dist/components/Blocks.mobile.js.map +1 -1
  22. package/dist/components/ContentPage/ContentPage.d.ts +2 -2
  23. package/dist/components/ContentPage/ContentPage.js +12 -11
  24. package/dist/components/ContentPage/ContentPage.js.map +1 -1
  25. package/dist/components/ContentPage/mapSlot.d.ts +2 -0
  26. package/dist/components/ContentPage/mapSlot.js +14 -0
  27. package/dist/components/ContentPage/mapSlot.js.map +1 -0
  28. package/dist/components/ContentPage/normalizeBlock.d.ts +3 -11
  29. package/dist/components/ContentPage/normalizeBlock.js +13 -3
  30. package/dist/components/ContentPage/normalizeBlock.js.map +1 -1
  31. package/dist/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
  32. package/dist/components/ContentPage/normalizeBlock.mobile.js +18 -3
  33. package/dist/components/ContentPage/normalizeBlock.mobile.js.map +1 -1
  34. package/dist/components/ContentPage/normalizePage.js +2 -14
  35. package/dist/components/ContentPage/normalizePage.js.map +1 -1
  36. package/dist/components/ContentPage/renderBlock.d.ts +7 -3
  37. package/dist/components/ContentPage/renderBlock.js +9 -9
  38. package/dist/components/ContentPage/renderBlock.js.map +1 -1
  39. package/dist/components/ContentPage/renderBlockList.d.ts +14 -0
  40. package/dist/components/ContentPage/renderBlockList.js +18 -0
  41. package/dist/components/ContentPage/renderBlockList.js.map +1 -0
  42. package/dist/components/ContentPage/renderSlots.d.ts +12 -0
  43. package/dist/components/ContentPage/renderSlots.js +17 -0
  44. package/dist/components/ContentPage/renderSlots.js.map +1 -0
  45. package/dist/model/BlockDecorator.d.ts +4 -3
  46. package/dist/model/BlockDecorator.js +1 -2
  47. package/dist/model/BlockDecorator.js.map +1 -1
  48. package/dist/model/BlocksRegistry.d.ts +1 -1
  49. package/dist/model/ContentPageDef.d.ts +1 -4
  50. package/dist/model/JSXBlock.d.ts +3 -1
  51. package/dist/model/getParentBlockDef.js +5 -2
  52. package/dist/model/getParentBlockDef.js.map +1 -1
  53. package/lib/components/Blocks.d.ts +2 -41
  54. package/lib/components/Blocks.js.map +1 -1
  55. package/lib/components/Blocks.mobile.d.ts +2 -18
  56. package/lib/components/Blocks.mobile.js.map +1 -1
  57. package/lib/components/ContentPage/ContentPage.d.ts +2 -2
  58. package/lib/components/ContentPage/ContentPage.js +12 -11
  59. package/lib/components/ContentPage/ContentPage.js.map +1 -1
  60. package/lib/components/ContentPage/mapSlot.d.ts +2 -0
  61. package/lib/components/ContentPage/mapSlot.js +11 -0
  62. package/lib/components/ContentPage/mapSlot.js.map +1 -0
  63. package/lib/components/ContentPage/normalizeBlock.d.ts +3 -11
  64. package/lib/components/ContentPage/normalizeBlock.js +13 -3
  65. package/lib/components/ContentPage/normalizeBlock.js.map +1 -1
  66. package/lib/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
  67. package/lib/components/ContentPage/normalizeBlock.mobile.js +18 -3
  68. package/lib/components/ContentPage/normalizeBlock.mobile.js.map +1 -1
  69. package/lib/components/ContentPage/normalizePage.js +2 -14
  70. package/lib/components/ContentPage/normalizePage.js.map +1 -1
  71. package/lib/components/ContentPage/renderBlock.d.ts +7 -3
  72. package/lib/components/ContentPage/renderBlock.js +9 -9
  73. package/lib/components/ContentPage/renderBlock.js.map +1 -1
  74. package/lib/components/ContentPage/renderBlockList.d.ts +14 -0
  75. package/lib/components/ContentPage/renderBlockList.js +15 -0
  76. package/lib/components/ContentPage/renderBlockList.js.map +1 -0
  77. package/lib/components/ContentPage/renderSlots.d.ts +12 -0
  78. package/lib/components/ContentPage/renderSlots.js +14 -0
  79. package/lib/components/ContentPage/renderSlots.js.map +1 -0
  80. package/lib/model/BlockDecorator.d.ts +4 -3
  81. package/lib/model/BlockDecorator.js +0 -1
  82. package/lib/model/BlockDecorator.js.map +1 -1
  83. package/lib/model/BlocksRegistry.d.ts +1 -1
  84. package/lib/model/ContentPageDef.d.ts +1 -4
  85. package/lib/model/JSXBlock.d.ts +3 -1
  86. package/lib/model/getParentBlockDef.js +5 -2
  87. package/lib/model/getParentBlockDef.js.map +1 -1
  88. package/mobile/bundle/bundle.umd.js +49 -22
  89. package/mobile/bundle/bundle.umd.min.js +1 -1
  90. package/mobile/bundle/components/Blocks.d.ts +2 -18
  91. package/mobile/bundle/components/ContentPage/ContentPage.d.ts +2 -2
  92. package/mobile/bundle/components/ContentPage/mapSlot.d.ts +2 -0
  93. package/mobile/bundle/components/ContentPage/normalizeBlock.d.ts +3 -2
  94. package/mobile/bundle/components/ContentPage/renderBlock.d.ts +7 -3
  95. package/mobile/bundle/components/ContentPage/renderBlockList.d.ts +14 -0
  96. package/mobile/bundle/components/ContentPage/renderSlots.d.ts +12 -0
  97. package/mobile/bundle/model/BlockDecorator.d.ts +4 -3
  98. package/mobile/bundle/model/BlocksRegistry.d.ts +1 -1
  99. package/mobile/bundle/model/ContentPageDef.d.ts +1 -4
  100. package/mobile/bundle/model/JSXBlock.d.ts +3 -1
  101. package/mobile/dist/components/Blocks.d.ts +2 -18
  102. package/mobile/dist/components/Blocks.js.map +1 -1
  103. package/mobile/dist/components/ContentPage/ContentPage.d.ts +2 -2
  104. package/mobile/dist/components/ContentPage/ContentPage.js +12 -11
  105. package/mobile/dist/components/ContentPage/ContentPage.js.map +1 -1
  106. package/mobile/dist/components/ContentPage/mapSlot.d.ts +2 -0
  107. package/mobile/dist/components/ContentPage/mapSlot.js +14 -0
  108. package/mobile/dist/components/ContentPage/mapSlot.js.map +1 -0
  109. package/mobile/dist/components/ContentPage/normalizeBlock.d.ts +3 -2
  110. package/mobile/dist/components/ContentPage/normalizeBlock.js +18 -3
  111. package/mobile/dist/components/ContentPage/normalizeBlock.js.map +1 -1
  112. package/mobile/dist/components/ContentPage/normalizePage.js +2 -14
  113. package/mobile/dist/components/ContentPage/normalizePage.js.map +1 -1
  114. package/mobile/dist/components/ContentPage/renderBlock.d.ts +7 -3
  115. package/mobile/dist/components/ContentPage/renderBlock.js +9 -9
  116. package/mobile/dist/components/ContentPage/renderBlock.js.map +1 -1
  117. package/mobile/dist/components/ContentPage/renderBlockList.d.ts +14 -0
  118. package/mobile/dist/components/ContentPage/renderBlockList.js +18 -0
  119. package/mobile/dist/components/ContentPage/renderBlockList.js.map +1 -0
  120. package/mobile/dist/components/ContentPage/renderSlots.d.ts +12 -0
  121. package/mobile/dist/components/ContentPage/renderSlots.js +17 -0
  122. package/mobile/dist/components/ContentPage/renderSlots.js.map +1 -0
  123. package/mobile/dist/model/BlockDecorator.d.ts +4 -3
  124. package/mobile/dist/model/BlockDecorator.js +1 -2
  125. package/mobile/dist/model/BlockDecorator.js.map +1 -1
  126. package/mobile/dist/model/BlocksRegistry.d.ts +1 -1
  127. package/mobile/dist/model/ContentPageDef.d.ts +1 -4
  128. package/mobile/dist/model/JSXBlock.d.ts +3 -1
  129. package/mobile/dist/model/getParentBlockDef.js +5 -2
  130. package/mobile/dist/model/getParentBlockDef.js.map +1 -1
  131. package/mobile/lib/components/Blocks.d.ts +2 -18
  132. package/mobile/lib/components/Blocks.js.map +1 -1
  133. package/mobile/lib/components/ContentPage/ContentPage.d.ts +2 -2
  134. package/mobile/lib/components/ContentPage/ContentPage.js +12 -11
  135. package/mobile/lib/components/ContentPage/ContentPage.js.map +1 -1
  136. package/mobile/lib/components/ContentPage/mapSlot.d.ts +2 -0
  137. package/mobile/lib/components/ContentPage/mapSlot.js +11 -0
  138. package/mobile/lib/components/ContentPage/mapSlot.js.map +1 -0
  139. package/mobile/lib/components/ContentPage/normalizeBlock.d.ts +3 -2
  140. package/mobile/lib/components/ContentPage/normalizeBlock.js +18 -3
  141. package/mobile/lib/components/ContentPage/normalizeBlock.js.map +1 -1
  142. package/mobile/lib/components/ContentPage/normalizePage.js +2 -14
  143. package/mobile/lib/components/ContentPage/normalizePage.js.map +1 -1
  144. package/mobile/lib/components/ContentPage/renderBlock.d.ts +7 -3
  145. package/mobile/lib/components/ContentPage/renderBlock.js +9 -9
  146. package/mobile/lib/components/ContentPage/renderBlock.js.map +1 -1
  147. package/mobile/lib/components/ContentPage/renderBlockList.d.ts +14 -0
  148. package/mobile/lib/components/ContentPage/renderBlockList.js +15 -0
  149. package/mobile/lib/components/ContentPage/renderBlockList.js.map +1 -0
  150. package/mobile/lib/components/ContentPage/renderSlots.d.ts +12 -0
  151. package/mobile/lib/components/ContentPage/renderSlots.js +14 -0
  152. package/mobile/lib/components/ContentPage/renderSlots.js.map +1 -0
  153. package/mobile/lib/model/BlockDecorator.d.ts +4 -3
  154. package/mobile/lib/model/BlockDecorator.js +0 -1
  155. package/mobile/lib/model/BlockDecorator.js.map +1 -1
  156. package/mobile/lib/model/BlocksRegistry.d.ts +1 -1
  157. package/mobile/lib/model/ContentPageDef.d.ts +1 -4
  158. package/mobile/lib/model/JSXBlock.d.ts +3 -1
  159. package/mobile/lib/model/getParentBlockDef.js +5 -2
  160. package/mobile/lib/model/getParentBlockDef.js.map +1 -1
  161. package/mobile/src/components/Blocks.ts +2 -1
  162. package/mobile/src/components/ContentPage/ContentPage.page.json +131 -133
  163. package/mobile/src/components/ContentPage/ContentPage.tsx +25 -28
  164. package/mobile/src/components/ContentPage/mapSlot.ts +17 -0
  165. package/mobile/src/components/ContentPage/normalizeBlock.ts +26 -4
  166. package/mobile/src/components/ContentPage/normalizePage.ts +3 -20
  167. package/mobile/src/components/ContentPage/renderBlock.tsx +16 -18
  168. package/mobile/src/components/ContentPage/renderBlockList.tsx +39 -0
  169. package/mobile/src/components/ContentPage/renderSlots.tsx +33 -0
  170. package/mobile/src/model/BlockDecorator.ts +4 -4
  171. package/mobile/src/model/BlocksRegistry.ts +1 -1
  172. package/mobile/src/model/ContentPageDef.ts +1 -5
  173. package/mobile/src/model/JSXBlock.ts +3 -1
  174. package/mobile/src/model/getParentBlockDef.ts +6 -2
  175. package/package.json +1 -1
  176. package/src/components/Accordion/Accordion.fixture.mobile.tsx +16 -4
  177. package/src/components/Blocks.mobile.ts +2 -1
  178. package/src/components/Blocks.ts +2 -1
  179. package/src/components/ContentPage/ContentPage.page.json +131 -133
  180. package/src/components/ContentPage/ContentPage.tsx +25 -28
  181. package/src/components/ContentPage/mapSlot.ts +17 -0
  182. package/src/components/ContentPage/normalizeBlock.mobile.ts +26 -4
  183. package/src/components/ContentPage/normalizeBlock.ts +17 -4
  184. package/src/components/ContentPage/normalizePage.ts +3 -20
  185. package/src/components/ContentPage/renderBlock.tsx +16 -18
  186. package/src/components/ContentPage/renderBlockList.tsx +39 -0
  187. package/src/components/ContentPage/renderSlots.tsx +33 -0
  188. package/src/model/BlockDecorator.ts +4 -4
  189. package/src/model/BlocksRegistry.ts +1 -1
  190. package/src/model/ContentPageDef.ts +1 -5
  191. package/src/model/JSXBlock.ts +3 -1
  192. package/src/model/getParentBlockDef.ts +6 -2
  193. package/bin/migration-scripts/0.4.0.js +0 -3
  194. package/bin/migration-scripts/0.4.1.js +0 -3
  195. package/bundle/components/ContentPage/filterBlocks.d.ts +0 -12
  196. package/bundle/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
  197. package/dist/components/ContentPage/filterBlocks.d.ts +0 -12
  198. package/dist/components/ContentPage/filterBlocks.js +0 -6
  199. package/dist/components/ContentPage/filterBlocks.js.map +0 -1
  200. package/dist/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
  201. package/dist/components/ContentPage/filterBlocks.mobile.js +0 -8
  202. package/dist/components/ContentPage/filterBlocks.mobile.js.map +0 -1
  203. package/lib/components/ContentPage/filterBlocks.d.ts +0 -12
  204. package/lib/components/ContentPage/filterBlocks.js +0 -3
  205. package/lib/components/ContentPage/filterBlocks.js.map +0 -1
  206. package/lib/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
  207. package/lib/components/ContentPage/filterBlocks.mobile.js +0 -5
  208. package/lib/components/ContentPage/filterBlocks.mobile.js.map +0 -1
  209. package/mobile/bundle/components/ContentPage/filterBlocks.d.ts +0 -3
  210. package/mobile/dist/components/ContentPage/filterBlocks.d.ts +0 -3
  211. package/mobile/dist/components/ContentPage/filterBlocks.js +0 -8
  212. package/mobile/dist/components/ContentPage/filterBlocks.js.map +0 -1
  213. package/mobile/lib/components/ContentPage/filterBlocks.d.ts +0 -3
  214. package/mobile/lib/components/ContentPage/filterBlocks.js +0 -5
  215. package/mobile/lib/components/ContentPage/filterBlocks.js.map +0 -1
  216. package/mobile/src/components/ContentPage/filterBlocks.ts +0 -11
  217. package/src/components/ContentPage/filterBlocks.mobile.ts +0 -11
  218. package/src/components/ContentPage/filterBlocks.ts +0 -6
@@ -1,12 +1,14 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
- import type { BlockAncestors, BlockDecorator } from '../../model/BlockDecorator';
2
+ import type { BlockDecorator } from '../../model/BlockDecorator';
3
3
  import type { BlocksRegistry } from '../../model/BlocksRegistry';
4
- import type { BlockDef, ContentPageDef } from '../../model/ContentPageDef';
5
- import type { UniBlockProps } from '../../model/JSXBlock';
4
+ import type { ContentPageDef } from '../../model/ContentPageDef';
5
+ import type { JSXBlock, UniBlockProps } from '../../model/JSXBlock';
6
6
  import { style2className } from '../../utils/style2className';
7
7
  import { LikeControl } from '../LikeControl/LikeControl';
8
8
  import type { ContentPageContext } from './ContentPageContext';
9
- import { renderBlock } from './renderBlock';
9
+ import { RenderBlockOptions } from './renderBlock';
10
+ import { renderBlocksList } from './renderBlockList';
11
+ import { renderSlots } from './renderSlots';
10
12
 
11
13
  interface ContentPageProps extends UniBlockProps {
12
14
  blocksRegistry: BlocksRegistry;
@@ -17,26 +19,35 @@ interface ContentPageProps extends UniBlockProps {
17
19
  const defaultBlockDecorator: BlockDecorator = ({ blockClassName, block, render }) =>
18
20
  render({ blockClassName, block });
19
21
 
20
- export const ContentPage = JSX<ContentPageProps>((props) => {
21
- const { className = '', context, data = {} } = props;
22
+ export const ContentPage: JSXBlock<ContentPageProps> = JSX<ContentPageProps>((props) => {
23
+ const { className = '', blocksRegistry, blockDecorator, context, data = {} } = props;
22
24
 
23
25
  const { style: pageStyle, blocks, slots, likeControl, colorPalette = 'pc' } = data;
24
26
 
25
- const blocksListRenderer = renderBlocksList(props);
27
+ const options: RenderBlockOptions = {
28
+ key: '',
29
+ blocksRegistry,
30
+ page: data,
31
+ blockDecorator: blockDecorator || defaultBlockDecorator,
32
+ context,
33
+ };
34
+
35
+ const pageSlots = renderSlots({ slots, parent: data, options });
26
36
 
27
37
  return (
28
38
  <section
29
39
  className={`relative ${style2className(pageStyle)} ${className}`}
30
40
  data-theme={colorPalette}
31
41
  >
32
- {slots?.header?.blocks?.length ? (
33
- <div className={`${style2className(slots.header.style)}`}>
34
- {blocksListRenderer(slots.header.blocks, ['header'])}
35
- </div>
42
+ {pageSlots?.header ? (
43
+ <div className="mb-5 shadow-[0_8px_32px_0px_#00000014]">{pageSlots.header}</div>
36
44
  ) : null}
37
45
 
38
46
  {blocks?.length ? (
39
- <div className="container grid grid-cols-12 gap-1">{blocksListRenderer(blocks)}</div>
47
+ <div className="container grid grid-cols-12 gap-1">
48
+ {renderBlocksList({ blocks, parent: data, options })}
49
+ {pageSlots?.footer ? pageSlots.footer : null}
50
+ </div>
40
51
  ) : null}
41
52
 
42
53
  {likeControl ? renderLikeControl(context) : null}
@@ -44,22 +55,8 @@ export const ContentPage = JSX<ContentPageProps>((props) => {
44
55
  );
45
56
  });
46
57
 
47
- function renderBlocksList({ blocksRegistry, data, blockDecorator, context }: ContentPageProps) {
48
- return (blocks: BlockDef[], ancestors?: BlockAncestors) =>
49
- blocks.map((block, i) =>
50
- renderBlock(
51
- block,
52
- {
53
- key: `${block.type || '#'}-${i}`,
54
- blocksRegistry,
55
- page: data || {},
56
- blockDecorator: blockDecorator || defaultBlockDecorator,
57
- context,
58
- },
59
- ancestors,
60
- ),
61
- );
62
- }
58
+ ContentPage.childrenTypes = [];
59
+ ContentPage.slots = () => ['header', 'footer'];
63
60
 
64
61
  function renderLikeControl(context: ContentPageContext) {
65
62
  return (
@@ -0,0 +1,17 @@
1
+ import type { BlockDef, Slot } from '../../model/ContentPageDef';
2
+
3
+ export const mapSlot =
4
+ (mapper: (blocks?: BlockDef[]) => BlockDef[]) =>
5
+ <S extends Slot>(slot: S): S => ({
6
+ ...slot,
7
+ blocks: mapper(slot.blocks),
8
+ slots: slot.slots
9
+ ? Object.entries(slot.slots).reduce(
10
+ (res, [slotKey, slotBlocks]) => ({
11
+ ...res,
12
+ [slotKey]: mapper(slotBlocks),
13
+ }),
14
+ {},
15
+ )
16
+ : {},
17
+ });
@@ -1,7 +1,29 @@
1
- import { BlockDef } from '../../model/ContentPageDef';
1
+ import type { BlocksRegistry } from '../../model/BlocksRegistry';
2
+ import type { BlockDef, Slot } from '../../model/ContentPageDef';
3
+ import { mapSlot } from './mapSlot';
2
4
 
3
- export function normalizeBlock(block: BlockDef) {
4
- const { mobile, ...rest } = block;
5
+ export function normalizeBlock<S extends Slot>(block?: S, blocksRegistry?: BlocksRegistry): S {
6
+ const { mobile, ...rest } = (block || {}) as BlockDef;
5
7
 
6
- return mobile ? { ...rest, ...mobile, content: { ...rest.content, ...mobile.content } } : block;
8
+ const normalizedBlock = mobile
9
+ ? { ...rest, ...mobile, content: { ...rest.content, ...mobile.content } }
10
+ : block;
11
+
12
+ return {
13
+ ...mapSlot((blocks) => filterBlocks(blocks, blocksRegistry))(normalizedBlock || {}),
14
+ } as S;
7
15
  }
16
+
17
+ const filterBlocks = (blocks?: BlockDef[], blocksRegistry?: BlocksRegistry) =>
18
+ blocks
19
+ ? blocks
20
+ ?.filter(
21
+ (block) =>
22
+ blocksRegistry &&
23
+ (block?.type || block?.mobile?.type || '') in blocksRegistry &&
24
+ !block.mobile?.hidden,
25
+ )
26
+ .map((block) => ({
27
+ ...normalizeBlock(block, blocksRegistry),
28
+ }))
29
+ : [];
@@ -1,6 +1,6 @@
1
1
  import type { BlocksRegistry } from '../../model/BlocksRegistry';
2
- import type { ContentPageDef, Slot } from '../../model/ContentPageDef';
3
- import { filterBlocks } from './filterBlocks';
2
+ import type { ContentPageDef } from '../../model/ContentPageDef';
3
+ import { normalizeBlock } from './normalizeBlock';
4
4
 
5
5
  export const normalizePage =
6
6
  (blocksRegistry: BlocksRegistry) =>
@@ -9,22 +9,5 @@ export const normalizePage =
9
9
  return undefined;
10
10
  }
11
11
 
12
- const { blocks = [], slots } = contentPage;
13
-
14
- return {
15
- ...contentPage,
16
- blocks: filterBlocks(blocks, blocksRegistry),
17
- slots:
18
- slots &&
19
- Object.keys(slots).reduce(
20
- (res, key) => ({
21
- ...res,
22
- [key]: {
23
- ...slots[key],
24
- blocks: filterBlocks((slots[key] as Slot).blocks || [], blocksRegistry),
25
- },
26
- }),
27
- {},
28
- ),
29
- };
12
+ return normalizeBlock(contentPage, blocksRegistry);
30
13
  };
@@ -1,11 +1,12 @@
1
- import { BlockAncestors, BlockDecorator, DEFAULT_ANCESTORS } from '../../model/BlockDecorator';
1
+ import { BlockAncestors, BlockDecorator } from '../../model/BlockDecorator';
2
2
  import type { BlocksRegistry } from '../../model/BlocksRegistry';
3
3
  import type { BlockDef, ContentPageDef } from '../../model/ContentPageDef';
4
- import type { VNode } from '../../model/VNode';
5
4
  import { style2className } from '../../utils/style2className';
6
5
  import type { ContentPageContext } from './ContentPageContext';
6
+ import { renderBlocksList } from './renderBlockList';
7
+ import { renderSlots } from './renderSlots';
7
8
 
8
- interface RenderBlockOptions {
9
+ export interface RenderBlockOptions {
9
10
  key: string;
10
11
  page: ContentPageDef;
11
12
  blockDecorator: BlockDecorator;
@@ -13,15 +14,15 @@ interface RenderBlockOptions {
13
14
  context: ContentPageContext;
14
15
  }
15
16
 
16
- const defaultChildRenderer = (_: VNode) => _;
17
+ export interface RenderBlockProps {
18
+ block?: BlockDef;
19
+ options: RenderBlockOptions;
20
+ ancestors?: BlockAncestors; // Recursion context
21
+ }
17
22
 
18
- export function renderBlock(
19
- block: BlockDef,
20
- options: RenderBlockOptions,
21
- ancestors: BlockAncestors = DEFAULT_ANCESTORS, // Recursion context
22
- ) {
23
- const { key, page, blockDecorator, blocksRegistry, context } = options;
24
- const { type, blocks: childBlocks } = block;
23
+ export function renderBlock({ block = {}, options, ancestors = [] }: RenderBlockProps) {
24
+ const { key, page, blockDecorator, blocksRegistry = {}, context } = options;
25
+ const { type, slots, blocks: childBlocks } = block;
25
26
 
26
27
  if (!(type && type in blocksRegistry)) {
27
28
  console.warn(`No block with "${type}" is registered`);
@@ -29,13 +30,9 @@ export function renderBlock(
29
30
 
30
31
  const BlockComponent = type && blocksRegistry[type];
31
32
 
32
- const { renderChild = defaultChildRenderer } = BlockComponent || {};
33
- const renderChildBlock = (_: BlockDef, j: number) =>
34
- renderChild(
35
- renderBlock(_, { ...options, key: `${options.key}-${j}` }, [...ancestors, block]),
36
- j,
37
- );
38
- const children = childBlocks?.length ? childBlocks.map(renderChildBlock) : null;
33
+ const subBlockRenderProps = { parent: block, options, ancestors };
34
+ const children = renderBlocksList({ ...subBlockRenderProps, blocks: childBlocks });
35
+ const blockSlots = slots ? renderSlots({ ...subBlockRenderProps, slots }) : {};
39
36
 
40
37
  return blockDecorator(
41
38
  {
@@ -56,6 +53,7 @@ export function renderBlock(
56
53
  version={version}
57
54
  anchor={anchor}
58
55
  labels={labels}
56
+ slots={blockSlots}
59
57
  {...content}
60
58
  >
61
59
  {children}
@@ -0,0 +1,39 @@
1
+ import type { SlotName } from '../../model/BlockDecorator';
2
+ import { BlockAncestors, DEFAULT_SLOT_NAME } from '../../model/BlockDecorator';
3
+ import type { BlockDef, Slot } from '../../model/ContentPageDef';
4
+ import type { VNode } from '../../model/VNode';
5
+ import { renderBlock, RenderBlockOptions } from './renderBlock';
6
+
7
+ interface RenderBlockListProps {
8
+ blocks?: BlockDef[];
9
+ parent: Slot;
10
+ slotName?: SlotName;
11
+ options: RenderBlockOptions;
12
+ ancestors?: BlockAncestors; // Recursion context
13
+ }
14
+
15
+ const defaultChildRenderer = (_: VNode) => _;
16
+
17
+ export function renderBlocksList({
18
+ blocks = [],
19
+ parent,
20
+ slotName = DEFAULT_SLOT_NAME,
21
+ options,
22
+ ancestors = [],
23
+ }: RenderBlockListProps): Record<string, VNode> {
24
+ const { blocksRegistry = {} } = options;
25
+ const { type } = parent as BlockDef;
26
+ const BlockComponent = type && blocksRegistry[type];
27
+ const { renderChild = defaultChildRenderer } = BlockComponent || {};
28
+
29
+ return blocks.map((_: BlockDef, j: number) =>
30
+ renderChild(
31
+ renderBlock({
32
+ block: _,
33
+ options: { ...options, key: `${options.key ? options.key : _.type}-${j}` },
34
+ ancestors: [...ancestors, [parent, slotName]],
35
+ }),
36
+ j,
37
+ ),
38
+ );
39
+ }
@@ -0,0 +1,33 @@
1
+ import { BlockAncestors } from '../../model/BlockDecorator';
2
+ import type { BlockDef, Slot } from '../../model/ContentPageDef';
3
+ import type { VNode } from '../../model/VNode';
4
+ import type { RenderBlockOptions } from './renderBlock';
5
+ import { renderBlocksList } from './renderBlockList';
6
+
7
+ interface RenderSlotsProps {
8
+ slots?: Record<string, BlockDef[]>;
9
+ parent: Slot;
10
+ options: RenderBlockOptions;
11
+ ancestors?: BlockAncestors;
12
+ }
13
+
14
+ export function renderSlots({
15
+ slots = {},
16
+ parent,
17
+ options,
18
+ ancestors = [],
19
+ }: RenderSlotsProps): Record<string, VNode> {
20
+ return Object.entries(slots).reduce(
21
+ (res, [slotName, slotBlocks]) => ({
22
+ ...res,
23
+ [slotName]: renderBlocksList({
24
+ blocks: slotBlocks,
25
+ parent,
26
+ slotName,
27
+ options,
28
+ ancestors,
29
+ }),
30
+ }),
31
+ {},
32
+ );
33
+ }
@@ -1,10 +1,10 @@
1
- import type { BlockDef, Slot, SlotsMap } from './ContentPageDef';
1
+ import type { BlockDef, Slot } from './ContentPageDef';
2
2
 
3
3
  export const DEFAULT_SLOT_NAME = null;
4
4
 
5
- export type BlockAncestors = [keyof SlotsMap | typeof DEFAULT_SLOT_NAME, ...Slot[]];
6
-
7
- export const DEFAULT_ANCESTORS: BlockAncestors = [DEFAULT_SLOT_NAME];
5
+ export type SlotName = string | typeof DEFAULT_SLOT_NAME;
6
+ export type BlockAncestorItem = [Slot, SlotName];
7
+ export type BlockAncestors = BlockAncestorItem[];
8
8
 
9
9
  interface BlockDecoratorProps<VNode> {
10
10
  blockClassName: string;
@@ -1,3 +1,3 @@
1
1
  import type { JSXBlock } from './JSXBlock';
2
2
 
3
- export type BlocksRegistry<BlockProps = Record<string, any>> = Record<string, JSXBlock<BlockProps>>;
3
+ export type BlocksRegistry = Record<string, JSXBlock<any>>;
@@ -22,10 +22,7 @@ export interface BlockDef extends BaseBlockDef {
22
22
  export interface Slot {
23
23
  style?: string[];
24
24
  blocks?: BlockDef[];
25
- }
26
-
27
- export interface SlotsMap {
28
- header?: Slot;
25
+ slots?: Record<string, BlockDef[]>;
29
26
  }
30
27
 
31
28
  export interface ContentPageMeta {
@@ -44,7 +41,6 @@ export interface ContentPageMeta {
44
41
 
45
42
  export interface ContentPageDef extends ContentPageMeta, Slot {
46
43
  _customPageType?: string;
47
- slots?: SlotsMap;
48
44
  fallback?: Record<string, unknown>;
49
45
  likeControl?: boolean;
50
46
  colorPalette?: ColorPalette;
@@ -1,6 +1,6 @@
1
1
  import type { UNIComponent } from '@redneckz/uni-jsx';
2
2
  import type { ContentPageContext } from '../components/ContentPage/ContentPageContext';
3
- import type { BlockAncestors } from './BlockDecorator';
3
+ import type { BlockAncestors, SlotName } from './BlockDecorator';
4
4
  import type { ContentPageDef } from './ContentPageDef';
5
5
  import type { VNode } from './VNode';
6
6
 
@@ -11,6 +11,7 @@ export interface UniBlockProps {
11
11
  ancestors?: BlockAncestors;
12
12
  labels?: string[];
13
13
  anchor?: string;
14
+ slots?: Record<string, VNode>;
14
15
  }
15
16
 
16
17
  export type JSXBlock<BlockProps = Record<string, any>> = UNIComponent<
@@ -19,5 +20,6 @@ export type JSXBlock<BlockProps = Record<string, any>> = UNIComponent<
19
20
  VNode | VNode[]
20
21
  > & {
21
22
  childrenTypes?: string[];
23
+ slots?: (props: BlockProps) => SlotName[];
22
24
  renderChild?: (child: VNode, i: number) => VNode;
23
25
  };
@@ -2,7 +2,11 @@ import type { BlockAncestors } from './BlockDecorator';
2
2
  import type { BlockDef } from './ContentPageDef';
3
3
 
4
4
  export function getParentBlockDef(ancestors: BlockAncestors | undefined, type?: string): BlockDef {
5
- const [, ...blocks] = ancestors || [];
5
+ const [block] =
6
+ (ancestors || [])
7
+ .map((item) => item)
8
+ .reverse()
9
+ .find(([_]) => _ && 'type' in _ && (!type || type === (_ as BlockDef).type)) || [];
6
10
 
7
- return blocks.reverse().find((_) => !type || type === (_ as BlockDef)?.type) || {};
11
+ return block || {};
8
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redneckz/wildless-cms-uni-blocks",
3
- "version": "0.6.19",
3
+ "version": "0.6.21",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "ЦК",
@@ -1,4 +1,5 @@
1
- import type { BlockDef } from '../../model/ContentPageDef';
1
+ import { DEFAULT_SLOT_NAME } from '../../model/BlockDecorator';
2
+ import type { BlockDef, ContentPageDef } from '../../model/ContentPageDef';
2
3
  import { context } from '../../react/setup-fixture';
3
4
  import { AccordionItem } from '../AccordionItem/AccordionItem';
4
5
  import { Headline } from '../Headline/Headline';
@@ -10,6 +11,8 @@ import { TEXT_BLOCK } from '../TextBlock/TextBlock.fixture';
10
11
  import type { AccordionProps } from './Accordion';
11
12
  import { Accordion } from './Accordion';
12
13
 
14
+ const page = {} as ContentPageDef;
15
+
13
16
  const TEXT_BLOCK_ACCORDION_BLOCK = <TextBlock context={context} {...TEXT_BLOCK} />;
14
17
 
15
18
  const HEADLINE_ACCORDION_BLOCK = <Headline context={context} {...HEADLINE} />;
@@ -30,7 +33,10 @@ const ACCORDION_BLOCK_DEF: BlockDef = {
30
33
  export const ACCORDION_ITEM = (
31
34
  <AccordionItem
32
35
  context={context}
33
- ancestors={[null, ACCORDION_BLOCK_DEF]}
36
+ ancestors={[
37
+ [page, DEFAULT_SLOT_NAME],
38
+ [ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
39
+ ]}
34
40
  label="Accordion label 1"
35
41
  labelIcon={{ icon: 'CardIcon' }}
36
42
  >
@@ -45,14 +51,20 @@ export default {
45
51
  {ACCORDION_ITEM}
46
52
  <AccordionItem
47
53
  context={context}
48
- ancestors={[null, ACCORDION_BLOCK_DEF]}
54
+ ancestors={[
55
+ [page, DEFAULT_SLOT_NAME],
56
+ [ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
57
+ ]}
49
58
  label="Accordion label 2"
50
59
  >
51
60
  {[HEADLINE_ACCORDION_BLOCK]}
52
61
  </AccordionItem>
53
62
  <AccordionItem
54
63
  context={context}
55
- ancestors={[null, ACCORDION_BLOCK_DEF]}
64
+ ancestors={[
65
+ [page, DEFAULT_SLOT_NAME],
66
+ [ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
67
+ ]}
56
68
  label="Accordion label 3"
57
69
  >
58
70
  {[LINK_DOCS_ACCORDION_BLOCK]}
@@ -1,3 +1,4 @@
1
+ import type { BlocksRegistry } from '../model/BlocksRegistry';
1
2
  import { Accordion } from './Accordion/Accordion';
2
3
  import { AccordionItem } from './AccordionItem/AccordionItem';
3
4
  import { ComparisonTable } from './ComparisonTable/ComparisonTable';
@@ -15,7 +16,7 @@ import { StepsBlock } from './StepsBlock/StepsBlock';
15
16
  import { TariffsTable } from './TariffsTable/TariffsTable';
16
17
  import { TextBlock } from './TextBlock/TextBlock';
17
18
 
18
- export const Blocks = {
19
+ export const Blocks: BlocksRegistry = {
19
20
  Accordion,
20
21
  AccordionItem,
21
22
  ComparisonTable,
@@ -1,3 +1,4 @@
1
+ import type { BlocksRegistry } from '../model/BlocksRegistry';
1
2
  import { Accordion } from './Accordion/Accordion';
2
3
  import { AccordionItem } from './AccordionItem/AccordionItem';
3
4
  import { BenefitsBlock } from './BenefitsBlock/BenefitsBlock';
@@ -38,7 +39,7 @@ import { TariffsTable } from './TariffsTable/TariffsTable';
38
39
  import { TextBlock } from './TextBlock/TextBlock';
39
40
  import { Tile } from './Tile/Tile';
40
41
 
41
- export const Blocks = {
42
+ export const Blocks: BlocksRegistry = {
42
43
  Accordion,
43
44
  AccordionItem,
44
45
  BenefitsBlock,