@contember/react-board 1.3.0-alpha.9 → 2.0.0-alpha.2

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 (202) hide show
  1. package/dist/development/components/Board.cjs +270 -0
  2. package/dist/development/components/Board.cjs.map +1 -0
  3. package/dist/development/components/Board.js +270 -0
  4. package/dist/development/components/Board.js.map +1 -0
  5. package/dist/development/components/BoardColumn.cjs +7 -0
  6. package/dist/development/components/BoardColumn.cjs.map +1 -0
  7. package/dist/development/components/BoardColumn.js +7 -0
  8. package/dist/development/components/BoardColumn.js.map +1 -0
  9. package/dist/development/components/BoardColumnLabel.cjs +14 -0
  10. package/dist/development/components/BoardColumnLabel.cjs.map +1 -0
  11. package/dist/development/components/BoardColumnLabel.js +14 -0
  12. package/dist/development/components/BoardColumnLabel.js.map +1 -0
  13. package/dist/development/components/BoardEachColumn.cjs +38 -0
  14. package/dist/development/components/BoardEachColumn.cjs.map +1 -0
  15. package/dist/development/components/BoardEachColumn.js +38 -0
  16. package/dist/development/components/BoardEachColumn.js.map +1 -0
  17. package/dist/development/components/BoardEachItem.cjs +56 -0
  18. package/dist/development/components/BoardEachItem.cjs.map +1 -0
  19. package/dist/development/components/BoardEachItem.js +56 -0
  20. package/dist/development/components/BoardEachItem.js.map +1 -0
  21. package/dist/development/components/BoardItem.cjs +8 -0
  22. package/dist/development/components/BoardItem.cjs.map +1 -0
  23. package/dist/development/components/BoardItem.js +8 -0
  24. package/dist/development/components/BoardItem.js.map +1 -0
  25. package/dist/development/components/BoardNullColumn.cjs +18 -0
  26. package/dist/development/components/BoardNullColumn.cjs.map +1 -0
  27. package/dist/development/components/BoardNullColumn.js +18 -0
  28. package/dist/development/components/BoardNullColumn.js.map +1 -0
  29. package/dist/development/contexts.cjs +24 -0
  30. package/dist/development/contexts.cjs.map +1 -0
  31. package/dist/development/contexts.js +24 -0
  32. package/dist/development/contexts.js.map +1 -0
  33. package/dist/development/index.cjs +23 -6
  34. package/dist/development/index.cjs.map +1 -1
  35. package/dist/development/index.js +23 -6
  36. package/dist/development/index.js.map +1 -1
  37. package/dist/development/internal/boardAnalyzer.cjs +16 -0
  38. package/dist/development/internal/boardAnalyzer.cjs.map +1 -0
  39. package/dist/development/internal/boardAnalyzer.js +16 -0
  40. package/dist/development/internal/boardAnalyzer.js.map +1 -0
  41. package/dist/development/internal/useBoardItemsMethods.cjs.map +1 -1
  42. package/dist/development/internal/useBoardItemsMethods.js.map +1 -1
  43. package/dist/development/internal/{useBoardColumns.cjs → useCreateBoardColumns.cjs} +10 -24
  44. package/dist/development/internal/useCreateBoardColumns.cjs.map +1 -0
  45. package/dist/development/internal/{useBoardColumns.js → useCreateBoardColumns.js} +10 -24
  46. package/dist/development/internal/useCreateBoardColumns.js.map +1 -0
  47. package/dist/{production → development/internal}/useDynamicBoard.cjs +14 -18
  48. package/dist/development/internal/useDynamicBoard.cjs.map +1 -0
  49. package/dist/{production → development/internal}/useDynamicBoard.js +14 -18
  50. package/dist/development/internal/useDynamicBoard.js.map +1 -0
  51. package/dist/{production → development/internal}/useStaticBoard.cjs +8 -16
  52. package/dist/development/internal/useStaticBoard.cjs.map +1 -0
  53. package/dist/{production → development/internal}/useStaticBoard.js +9 -17
  54. package/dist/development/internal/useStaticBoard.js.map +1 -0
  55. package/dist/production/components/Board.cjs +118 -0
  56. package/dist/production/components/Board.cjs.map +1 -0
  57. package/dist/production/components/Board.js +118 -0
  58. package/dist/production/components/Board.js.map +1 -0
  59. package/dist/production/components/BoardColumn.cjs +7 -0
  60. package/dist/production/components/BoardColumn.cjs.map +1 -0
  61. package/dist/production/components/BoardColumn.js +7 -0
  62. package/dist/production/components/BoardColumn.js.map +1 -0
  63. package/dist/production/components/BoardColumnLabel.cjs +10 -0
  64. package/dist/production/components/BoardColumnLabel.cjs.map +1 -0
  65. package/dist/production/components/BoardColumnLabel.js +10 -0
  66. package/dist/production/components/BoardColumnLabel.js.map +1 -0
  67. package/dist/production/components/BoardEachColumn.cjs +22 -0
  68. package/dist/production/components/BoardEachColumn.cjs.map +1 -0
  69. package/dist/production/components/BoardEachColumn.js +22 -0
  70. package/dist/production/components/BoardEachColumn.js.map +1 -0
  71. package/dist/production/components/BoardEachItem.cjs +33 -0
  72. package/dist/production/components/BoardEachItem.cjs.map +1 -0
  73. package/dist/production/components/BoardEachItem.js +33 -0
  74. package/dist/production/components/BoardEachItem.js.map +1 -0
  75. package/dist/production/components/BoardItem.cjs +8 -0
  76. package/dist/production/components/BoardItem.cjs.map +1 -0
  77. package/dist/production/components/BoardItem.js +8 -0
  78. package/dist/production/components/BoardItem.js.map +1 -0
  79. package/dist/production/components/BoardNullColumn.cjs +14 -0
  80. package/dist/production/components/BoardNullColumn.cjs.map +1 -0
  81. package/dist/production/components/BoardNullColumn.js +14 -0
  82. package/dist/production/components/BoardNullColumn.js.map +1 -0
  83. package/dist/production/contexts.cjs +24 -0
  84. package/dist/production/contexts.cjs.map +1 -0
  85. package/dist/production/contexts.js +24 -0
  86. package/dist/production/contexts.js.map +1 -0
  87. package/dist/production/index.cjs +23 -6
  88. package/dist/production/index.cjs.map +1 -1
  89. package/dist/production/index.js +23 -6
  90. package/dist/production/index.js.map +1 -1
  91. package/dist/production/internal/boardAnalyzer.cjs +16 -0
  92. package/dist/production/internal/boardAnalyzer.cjs.map +1 -0
  93. package/dist/production/internal/boardAnalyzer.js +16 -0
  94. package/dist/production/internal/boardAnalyzer.js.map +1 -0
  95. package/dist/production/internal/useBoardItemsMethods.cjs.map +1 -1
  96. package/dist/production/internal/useBoardItemsMethods.js.map +1 -1
  97. package/dist/production/internal/{useBoardColumns.cjs → useCreateBoardColumns.cjs} +10 -24
  98. package/dist/production/internal/useCreateBoardColumns.cjs.map +1 -0
  99. package/dist/production/internal/{useBoardColumns.js → useCreateBoardColumns.js} +10 -24
  100. package/dist/production/internal/useCreateBoardColumns.js.map +1 -0
  101. package/dist/{development → production/internal}/useDynamicBoard.cjs +14 -18
  102. package/dist/production/internal/useDynamicBoard.cjs.map +1 -0
  103. package/dist/{development → production/internal}/useDynamicBoard.js +14 -18
  104. package/dist/production/internal/useDynamicBoard.js.map +1 -0
  105. package/dist/{development → production/internal}/useStaticBoard.cjs +8 -16
  106. package/dist/production/internal/useStaticBoard.cjs.map +1 -0
  107. package/dist/{development → production/internal}/useStaticBoard.js +9 -17
  108. package/dist/production/internal/useStaticBoard.js.map +1 -0
  109. package/dist/types/{types.d.ts → components/Board.d.ts} +5 -8
  110. package/dist/types/components/Board.d.ts.map +1 -0
  111. package/dist/types/components/BoardColumn.d.ts +5 -0
  112. package/dist/types/components/BoardColumn.d.ts.map +1 -0
  113. package/dist/types/components/BoardColumnLabel.d.ts +2 -0
  114. package/dist/types/components/BoardColumnLabel.d.ts.map +1 -0
  115. package/dist/types/components/BoardEachColumn.d.ts +10 -0
  116. package/dist/types/components/BoardEachColumn.d.ts.map +1 -0
  117. package/dist/types/components/BoardEachItem.d.ts +10 -0
  118. package/dist/types/components/BoardEachItem.d.ts.map +1 -0
  119. package/dist/types/components/BoardItem.d.ts +8 -0
  120. package/dist/types/components/BoardItem.d.ts.map +1 -0
  121. package/dist/types/components/BoardNullColumn.d.ts +7 -0
  122. package/dist/types/components/BoardNullColumn.d.ts.map +1 -0
  123. package/dist/types/components/index.d.ts +8 -0
  124. package/dist/types/components/index.d.ts.map +1 -0
  125. package/dist/types/contexts.d.ts +18 -0
  126. package/dist/types/contexts.d.ts.map +1 -0
  127. package/dist/types/index.d.ts +2 -4
  128. package/dist/types/index.d.ts.map +1 -1
  129. package/dist/types/internal/boardAnalyzer.d.ts +6 -0
  130. package/dist/types/internal/boardAnalyzer.d.ts.map +1 -0
  131. package/dist/types/internal/useBoardItemsMethods.d.ts +1 -1
  132. package/dist/types/internal/useBoardItemsMethods.d.ts.map +1 -1
  133. package/dist/types/internal/useCreateBoardColumns.d.ts +10 -0
  134. package/dist/types/internal/useCreateBoardColumns.d.ts.map +1 -0
  135. package/dist/types/{useDynamicBoard.d.ts → internal/useDynamicBoard.d.ts} +4 -3
  136. package/dist/types/internal/useDynamicBoard.d.ts.map +1 -0
  137. package/dist/types/internal/useGroupItemsByColumn.d.ts.map +1 -1
  138. package/dist/types/{useStaticBoard.d.ts → internal/useStaticBoard.d.ts} +4 -3
  139. package/dist/types/internal/useStaticBoard.d.ts.map +1 -0
  140. package/dist/types/tsconfig.tsbuildinfo +1 -1
  141. package/dist/types/types/BoardColumnNode.d.ts +15 -0
  142. package/dist/types/types/BoardColumnNode.d.ts.map +1 -0
  143. package/dist/types/types/BoardData.d.ts +5 -0
  144. package/dist/types/types/BoardData.d.ts.map +1 -0
  145. package/dist/types/types/BoardItemNode.d.ts +7 -0
  146. package/dist/types/types/BoardItemNode.d.ts.map +1 -0
  147. package/dist/types/{BoardBindingProps.d.ts → types/BoardMethods.d.ts} +4 -23
  148. package/dist/types/types/BoardMethods.d.ts.map +1 -0
  149. package/dist/types/types/index.d.ts +4 -0
  150. package/dist/types/types/index.d.ts.map +1 -0
  151. package/package.json +10 -7
  152. package/src/components/Board.tsx +219 -0
  153. package/src/components/BoardColumn.tsx +7 -0
  154. package/src/components/BoardColumnLabel.tsx +6 -0
  155. package/src/components/BoardEachColumn.tsx +32 -0
  156. package/src/components/BoardEachItem.tsx +48 -0
  157. package/src/components/BoardItem.tsx +8 -0
  158. package/src/components/BoardNullColumn.tsx +20 -0
  159. package/src/components/index.ts +7 -0
  160. package/src/contexts.ts +23 -0
  161. package/src/index.ts +2 -4
  162. package/src/internal/boardAnalyzer.ts +25 -0
  163. package/src/internal/useBoardItemsMethods.ts +1 -1
  164. package/src/internal/{useBoardColumns.ts → useCreateBoardColumns.ts} +11 -28
  165. package/src/{useDynamicBoard.ts → internal/useDynamicBoard.ts} +21 -18
  166. package/src/{useStaticBoard.ts → internal/useStaticBoard.ts} +13 -18
  167. package/src/tsconfig.json +3 -0
  168. package/src/types/BoardColumnNode.ts +16 -0
  169. package/src/types/BoardData.ts +6 -0
  170. package/src/types/BoardItemNode.ts +7 -0
  171. package/src/{BoardBindingProps.ts → types/BoardMethods.ts} +3 -29
  172. package/src/types/index.ts +3 -0
  173. package/dist/development/Board.cjs +0 -116
  174. package/dist/development/Board.cjs.map +0 -1
  175. package/dist/development/Board.js +0 -116
  176. package/dist/development/Board.js.map +0 -1
  177. package/dist/development/internal/useBoardColumns.cjs.map +0 -1
  178. package/dist/development/internal/useBoardColumns.js.map +0 -1
  179. package/dist/development/useDynamicBoard.cjs.map +0 -1
  180. package/dist/development/useDynamicBoard.js.map +0 -1
  181. package/dist/development/useStaticBoard.cjs.map +0 -1
  182. package/dist/development/useStaticBoard.js.map +0 -1
  183. package/dist/production/Board.cjs +0 -116
  184. package/dist/production/Board.cjs.map +0 -1
  185. package/dist/production/Board.js +0 -116
  186. package/dist/production/Board.js.map +0 -1
  187. package/dist/production/internal/useBoardColumns.cjs.map +0 -1
  188. package/dist/production/internal/useBoardColumns.js.map +0 -1
  189. package/dist/production/useDynamicBoard.cjs.map +0 -1
  190. package/dist/production/useDynamicBoard.js.map +0 -1
  191. package/dist/production/useStaticBoard.cjs.map +0 -1
  192. package/dist/production/useStaticBoard.js.map +0 -1
  193. package/dist/types/Board.d.ts +0 -10
  194. package/dist/types/Board.d.ts.map +0 -1
  195. package/dist/types/BoardBindingProps.d.ts.map +0 -1
  196. package/dist/types/internal/useBoardColumns.d.ts +0 -11
  197. package/dist/types/internal/useBoardColumns.d.ts.map +0 -1
  198. package/dist/types/types.d.ts.map +0 -1
  199. package/dist/types/useDynamicBoard.d.ts.map +0 -1
  200. package/dist/types/useStaticBoard.d.ts.map +0 -1
  201. package/src/Board.tsx +0 -156
  202. package/src/types.ts +0 -64
@@ -1,28 +1,12 @@
1
- import { EntityAccessor } from '@contember/react-binding';
2
- import { ReactNode } from 'react';
3
- export type BoardItem = {
4
- id: string | number;
5
- index: number;
6
- value: EntityAccessor;
7
- };
8
- export type BoardStaticColumnValue = {
9
- value: string;
10
- label?: ReactNode;
11
- };
12
- export type BoardColumnValue = BoardStaticColumnValue | EntityAccessor;
13
- export type BoardColumn<ColumnValue extends BoardColumnValue = BoardColumnValue> = {
14
- id: string | number;
15
- index: number;
16
- value: ColumnValue | null;
17
- items: BoardItem[];
18
- };
1
+ import { EntityAccessor } from '@contember/binding';
2
+ import { BoardColumnValue } from './BoardColumnNode';
19
3
  export type BoardAddColumnMethod = (index: number | undefined, preprocess?: EntityAccessor.BatchUpdatesHandler) => void;
20
4
  export type BoardMoveColumnMethod = (entity: EntityAccessor, index: number) => void;
21
5
  export type BoardRemoveColumnMethod = (entity: EntityAccessor) => void;
22
6
  export type BoardMoveItemMethod<ColumnValue extends BoardColumnValue> = (entity: EntityAccessor, column: ColumnValue | null, index: number) => void;
23
7
  export type BoardAddItemMethod<ColumnValue extends BoardColumnValue> = (column: ColumnValue | null, index: number | undefined, preprocess?: EntityAccessor.BatchUpdatesHandler) => void;
24
8
  export type BoardRemoveItemMethod = (entity: EntityAccessor) => void;
25
- export type BoardMethods<ColumnValue extends BoardColumnValue> = {
9
+ export type BoardMethods<ColumnValue extends BoardColumnValue = BoardColumnValue> = {
26
10
  moveColumn?: BoardMoveColumnMethod;
27
11
  addColumn?: BoardAddColumnMethod;
28
12
  removeColumn?: BoardRemoveColumnMethod;
@@ -30,7 +14,4 @@ export type BoardMethods<ColumnValue extends BoardColumnValue> = {
30
14
  addItem?: BoardAddItemMethod<ColumnValue>;
31
15
  removeItem?: BoardRemoveItemMethod;
32
16
  };
33
- export type BoardBindingProps<ColumnValue extends BoardColumnValue> = {
34
- columns: BoardColumn<ColumnValue>[];
35
- } & BoardMethods<ColumnValue>;
36
- //# sourceMappingURL=BoardBindingProps.d.ts.map
17
+ //# sourceMappingURL=BoardMethods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardMethods.d.ts","sourceRoot":"","sources":["../../../src/types/BoardMethods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,cAAc,CAAC,mBAAmB,KAAK,IAAI,CAAC;AACxH,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AACpF,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AACvE,MAAM,MAAM,mBAAmB,CAAC,WAAW,SAAS,gBAAgB,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AACpJ,MAAM,MAAM,kBAAkB,CAAC,WAAW,SAAS,gBAAgB,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,cAAc,CAAC,mBAAmB,KAAK,IAAI,CAAC;AACxL,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAErE,MAAM,MAAM,YAAY,CAAC,WAAW,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IACnF,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,YAAY,CAAC,EAAE,uBAAuB,CAAA;IAEtC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAA;IAC3C,OAAO,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAA;IACzC,UAAU,CAAC,EAAE,qBAAqB,CAAA;CAClC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './BoardMethods';
2
+ export * from './BoardColumnNode';
3
+ export * from './BoardItemNode';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@contember/react-board",
3
3
  "license": "Apache-2.0",
4
- "version": "1.3.0-alpha.9",
4
+ "version": "2.0.0-alpha.2",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/production/index.js",
@@ -22,7 +22,7 @@
22
22
  "typings": "./dist/types/index.d.ts",
23
23
  "scripts": {
24
24
  "build": "yarn build:js:dev && yarn build:js:prod",
25
- "build:js:dev": "vite build --mode development",
25
+ "build:js:dev": "NODE_ENV=development vite build --mode development",
26
26
  "build:js:prod": "vite build --mode production",
27
27
  "ae:build": "api-extractor run --local",
28
28
  "ae:test": "api-extractor run",
@@ -34,15 +34,18 @@
34
34
  "directory": "packages/react-board"
35
35
  },
36
36
  "dependencies": {
37
- "@contember/react-binding": "1.3.0-alpha.9"
37
+ "@contember/binding": "2.0.0-alpha.2",
38
+ "@contember/react-binding": "2.0.0-alpha.2",
39
+ "@contember/react-multipass-rendering": "2.0.0-alpha.2",
40
+ "@contember/react-utils": "2.0.0-alpha.2"
38
41
  },
39
42
  "peerDependencies": {
40
- "react": "^17 || ^18",
41
- "react-dom": "^17 || ^18"
43
+ "react": "^18 || ^19",
44
+ "react-dom": "^18 || ^19"
42
45
  },
43
46
  "devDependencies": {
44
- "react": "^18.2.0",
45
- "react-dom": "^18.2.0"
47
+ "react": "^18.3.1",
48
+ "react-dom": "^18.3.1"
46
49
  },
47
50
  "stableVersion": "0.0.0"
48
51
  }
@@ -0,0 +1,219 @@
1
+ import {
2
+ Component,
3
+ EntityListSubTree,
4
+ Field,
5
+ HasMany,
6
+ HasOne,
7
+ SugaredQualifiedEntityList,
8
+ SugaredRelativeEntityList,
9
+ SugaredRelativeSingleEntity,
10
+ SugaredRelativeSingleField,
11
+ useEntityList,
12
+ useEntityListSubTree,
13
+ } from '@contember/react-binding'
14
+ import { boardColumnsAnalyzer, boardItemsAnalyzer } from '../internal/boardAnalyzer'
15
+ import { Fragment, ReactNode } from 'react'
16
+ import { useDynamicBoard } from '../internal/useDynamicBoard'
17
+ import { useStaticBoard } from '../internal/useStaticBoard'
18
+ import { BoardColumnsContext, BoardMethodsContext } from '../contexts'
19
+
20
+ export type BoardProps =
21
+ | BoardQualifiedDynamicProps
22
+ | BoardRelativeDynamicProps
23
+ | BoardQualifiedStaticProps
24
+ | BoardRelativeStaticProps
25
+
26
+
27
+ export const Board = Component<BoardProps>(props => {
28
+ if ('entities' in props) {
29
+ if (Array.isArray(props.columns)) {
30
+ return <BoardQualifiedStatic {...(props as BoardQualifiedStaticProps)} />
31
+ } else {
32
+ return <BoardQualifiedDynamic {...(props as BoardQualifiedDynamicProps)} />
33
+ }
34
+ } else {
35
+ if (Array.isArray(props.columns)) {
36
+ return <RelativeStaticBoard {...(props as BoardRelativeStaticProps)} />
37
+ } else {
38
+ return <RelativeDynamicBoard {...(props as BoardRelativeDynamicProps)} />
39
+ }
40
+ }
41
+ })
42
+
43
+ export type BoardDynamicColumnsBindingProps = {
44
+ columns: SugaredQualifiedEntityList['entities']
45
+ columnsSortableBy?: string | SugaredRelativeSingleField
46
+ discriminationField: string | SugaredRelativeSingleEntity
47
+ }
48
+
49
+ export type BoardStaticColumnsBindingProps = {
50
+ columns: {
51
+ value: string,
52
+ label: ReactNode
53
+ }[]
54
+ discriminationField: string | SugaredRelativeSingleField
55
+ }
56
+
57
+ export type BoardCommonProps =
58
+ & {
59
+ children: ReactNode
60
+ sortableBy?: string | SugaredRelativeSingleField
61
+ sortScope?: 'column' | 'board'
62
+ }
63
+
64
+ export type BoardQualifiedItemsProps =
65
+ & Pick<SugaredQualifiedEntityList, 'entities' | 'orderBy' | 'limit' | 'offset'>
66
+
67
+
68
+ export type BoardRelativeItemsProps =
69
+ & Pick<SugaredRelativeEntityList, 'field' | 'orderBy' | 'limit' | 'offset'>
70
+
71
+
72
+ export type BoardQualifiedDynamicProps =
73
+ & BoardCommonProps
74
+ & BoardDynamicColumnsBindingProps
75
+ & BoardQualifiedItemsProps
76
+
77
+ const BoardQualifiedDynamic = Component<BoardQualifiedDynamicProps>(({ entities, orderBy, limit, offset, columns, columnsSortableBy, discriminationField, sortableBy, sortScope, children }) => {
78
+ const itemsAccessor = useEntityListSubTree({ entities, orderBy, limit, offset })
79
+ const columnsAccessor = useEntityListSubTree({ entities: columns })
80
+ const [data, methods] = useDynamicBoard({
81
+ columnEntities: columnsAccessor,
82
+ itemEntities: itemsAccessor,
83
+ columns,
84
+ sortableBy,
85
+ sortScope,
86
+ columnsSortableBy,
87
+ discriminationField,
88
+ })
89
+ return (
90
+ <BoardMethodsContext.Provider value={methods}>
91
+ <BoardColumnsContext.Provider value={data.columns}>
92
+ {children}
93
+ </BoardColumnsContext.Provider>
94
+ </BoardMethodsContext.Provider>
95
+ )
96
+ }, ({ entities, orderBy, limit, offset, columns, discriminationField, sortableBy, columnsSortableBy, children }, env) => {
97
+
98
+ const columnChildren = boardColumnsAnalyzer.processChildren(children, env)
99
+ const itemChildren = boardItemsAnalyzer.processChildren(children, env)
100
+
101
+ return (<>
102
+ <EntityListSubTree entities={entities} orderBy={orderBy} limit={limit} offset={offset}>
103
+ <HasOne {...typeof discriminationField === 'string' ? { field: discriminationField } : discriminationField} />
104
+ {sortableBy && <Field {...typeof sortableBy === 'string' ? { field: sortableBy } : sortableBy} />}
105
+ {itemChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
106
+ </EntityListSubTree>
107
+ <EntityListSubTree entities={columns}>
108
+ {columnsSortableBy && <Field {...typeof columnsSortableBy === 'string' ? { field: columnsSortableBy } : columnsSortableBy} />}
109
+ {columnChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
110
+ </EntityListSubTree>
111
+ </>)
112
+ })
113
+
114
+
115
+ export type BoardRelativeDynamicProps =
116
+ & BoardCommonProps
117
+ & BoardDynamicColumnsBindingProps
118
+ & BoardRelativeItemsProps
119
+
120
+
121
+ const RelativeDynamicBoard = Component<BoardRelativeDynamicProps>(({ field, orderBy, limit, offset, columns, columnsSortableBy, discriminationField, sortableBy, sortScope, children }) => {
122
+ const itemsAccessor = useEntityList({ field, orderBy, limit, offset })
123
+ const columnsAccessor = useEntityListSubTree({ entities: columns })
124
+ const [data, methods] = useDynamicBoard({
125
+ columnEntities: columnsAccessor,
126
+ itemEntities: itemsAccessor,
127
+ columns,
128
+ sortableBy,
129
+ sortScope,
130
+ columnsSortableBy,
131
+ discriminationField,
132
+ })
133
+ return (
134
+ <BoardMethodsContext.Provider value={methods}>
135
+ <BoardColumnsContext.Provider value={data.columns}>
136
+ {children}
137
+ </BoardColumnsContext.Provider>
138
+ </BoardMethodsContext.Provider>
139
+ )
140
+ }, ({ field, orderBy, limit, offset, columns, discriminationField, sortableBy, columnsSortableBy, children }, env) => {
141
+ const columnChildren = boardColumnsAnalyzer.processChildren(children, env)
142
+ const itemChildren = boardItemsAnalyzer.processChildren(children, env)
143
+ return (<>
144
+ <HasMany field={field} orderBy={orderBy} limit={limit} offset={offset}>
145
+ <HasOne {...typeof discriminationField === 'string' ? { field: discriminationField } : discriminationField} />
146
+ {sortableBy && <Field {...typeof sortableBy === 'string' ? { field: sortableBy } : sortableBy} />}
147
+ {itemChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
148
+ </HasMany>
149
+ <EntityListSubTree entities={columns}>
150
+ {columnsSortableBy && <Field {...typeof columnsSortableBy === 'string' ? { field: columnsSortableBy } : columnsSortableBy} />}
151
+ {columnChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
152
+ </EntityListSubTree>
153
+ </>)
154
+ })
155
+ export type BoardQualifiedStaticProps =
156
+ & BoardCommonProps
157
+ & BoardStaticColumnsBindingProps
158
+ & BoardQualifiedItemsProps
159
+
160
+
161
+ const BoardQualifiedStatic = Component<BoardQualifiedStaticProps>(({ entities, orderBy, limit, offset, columns, discriminationField, sortableBy, sortScope, children }) => {
162
+ const itemsAccessor = useEntityListSubTree({ entities, orderBy, limit, offset })
163
+ const [data, methods] = useStaticBoard({
164
+ itemEntities: itemsAccessor,
165
+ columns,
166
+ sortableBy,
167
+ sortScope,
168
+ discriminationField,
169
+ })
170
+ return (
171
+ <BoardMethodsContext.Provider value={methods}>
172
+ <BoardColumnsContext.Provider value={data.columns}>
173
+ {children}
174
+ </BoardColumnsContext.Provider>
175
+ </BoardMethodsContext.Provider>
176
+ )
177
+ }, ({ entities, orderBy, limit, offset, columns, discriminationField, sortableBy, children }, env) => {
178
+ const itemChildren = boardItemsAnalyzer.processChildren(children, env)
179
+ return (<>
180
+ <EntityListSubTree entities={entities} orderBy={orderBy} limit={limit} offset={offset}>
181
+ <Field {...typeof discriminationField === 'string' ? { field: discriminationField } : discriminationField} />
182
+ {sortableBy && <Field {...typeof sortableBy === 'string' ? { field: sortableBy } : sortableBy} />}
183
+ {itemChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
184
+ </EntityListSubTree>
185
+ </>)
186
+ })
187
+
188
+
189
+ export type BoardRelativeStaticProps =
190
+ & BoardCommonProps
191
+ & BoardStaticColumnsBindingProps
192
+ & BoardRelativeItemsProps
193
+
194
+ const RelativeStaticBoard = Component<BoardRelativeStaticProps>(({ field, orderBy, limit, offset, columns, discriminationField, sortableBy, sortScope, children }) => {
195
+ const itemsAccessor = useEntityList({ field, orderBy, limit, offset })
196
+ const [data, methods] = useStaticBoard({
197
+ itemEntities: itemsAccessor,
198
+ columns,
199
+ sortableBy,
200
+ sortScope,
201
+ discriminationField,
202
+ })
203
+ return (
204
+ <BoardMethodsContext.Provider value={methods}>
205
+ <BoardColumnsContext.Provider value={data.columns}>
206
+ {children}
207
+ </BoardColumnsContext.Provider>
208
+ </BoardMethodsContext.Provider>
209
+ )
210
+ }, ({ field, orderBy, limit, offset, columns, discriminationField, sortableBy, children }, env) => {
211
+ const itemChildren = boardItemsAnalyzer.processChildren(children, env)
212
+ return (<>
213
+ <HasMany field={field} orderBy={orderBy} limit={limit} offset={offset}>
214
+ <Field {...typeof discriminationField === 'string' ? { field: discriminationField } : discriminationField} />
215
+ {sortableBy && <Field {...typeof sortableBy === 'string' ? { field: sortableBy } : sortableBy} />}
216
+ {itemChildren.map((it, index) => <Fragment key={index}>{it}</Fragment>)}
217
+ </HasMany>
218
+ </>)
219
+ })
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react'
2
+
3
+ export const BoardColumn = ({}: {
4
+ children: ReactNode
5
+ }) => {
6
+ return null
7
+ }
@@ -0,0 +1,6 @@
1
+ import { useBoardCurrentColumn } from '../contexts'
2
+
3
+ export const BoardColumnLabel = () => {
4
+ const value = useBoardCurrentColumn().value
5
+ return value && 'label' in value ? <>{value.label}</> : null
6
+ }
@@ -0,0 +1,32 @@
1
+ import { EntityAccessor } from '@contember/binding'
2
+ import { Entity } from '@contember/react-binding'
3
+ import { BoardCurrentColumnContext, useBoardColumns } from '../contexts'
4
+ import { ReactNode } from 'react'
5
+ import { BoardColumn } from './BoardColumn'
6
+ import { BoardNullColumnPlaceholder } from '../const'
7
+
8
+ export const BoardEachColumn = ({ children }: {
9
+ children: ReactNode
10
+ }) => {
11
+ const columns = useBoardColumns()
12
+
13
+ return <>
14
+ {columns.map(column => {
15
+ if (column.id === BoardNullColumnPlaceholder) {
16
+ return null
17
+ }
18
+ return (
19
+ <BoardCurrentColumnContext.Provider value={column} key={column.id}>
20
+ {column.value instanceof EntityAccessor ? (
21
+ <Entity accessor={column.value}>
22
+ {children}
23
+ </Entity>
24
+ ) : children}
25
+ </BoardCurrentColumnContext.Provider>
26
+ )
27
+ })}
28
+ </>
29
+ }
30
+ BoardEachColumn.staticRender = ({ children }: { children: ReactNode }) => {
31
+ return <BoardColumn>{children}</BoardColumn>
32
+ }
@@ -0,0 +1,48 @@
1
+ import { ReactNode, useMemo } from 'react'
2
+ import { BoardCurrentItemContext, useBoardCurrentColumn } from '../contexts'
3
+ import { Entity } from '@contember/react-binding'
4
+ import { BoardItem } from './BoardItem'
5
+ import { BoardColumnNode, BoardItemNode } from '../types'
6
+
7
+ export const BoardEachItem = ({ children }: {
8
+ children: ReactNode
9
+ }) => {
10
+ const currentColumn = useBoardCurrentColumn()
11
+
12
+ return <>
13
+ {currentColumn.items.map((item, index) => {
14
+ return (
15
+ <BoardEachItemInner
16
+ key={item.id}
17
+ item={item}
18
+ column={currentColumn}
19
+ >
20
+ {children}
21
+ </BoardEachItemInner>
22
+ )
23
+ })}
24
+ </>
25
+ }
26
+ BoardEachItem.staticRender = ({ children }: { children: ReactNode }) => {
27
+ return <BoardItem>{children}</BoardItem>
28
+ }
29
+
30
+ const BoardEachItemInner = ({ children, item, column }: {
31
+ children: ReactNode
32
+ column: BoardColumnNode
33
+ item: BoardItemNode
34
+
35
+ }) => {
36
+ const itemWithColumn = useMemo(() => ({
37
+ ...item,
38
+ column,
39
+ }), [item, column])
40
+
41
+ return (
42
+ <BoardCurrentItemContext.Provider value={itemWithColumn} key={item.id}>
43
+ <Entity accessor={item.value}>
44
+ {children}
45
+ </Entity>
46
+ </BoardCurrentItemContext.Provider>
47
+ )
48
+ }
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react'
2
+
3
+ export const BoardItem = ({}: {
4
+ children: ReactNode
5
+ }) => {
6
+ return null
7
+ }
8
+ BoardItem.staticRender = () => null
@@ -0,0 +1,20 @@
1
+ import { BoardCurrentColumnContext, useBoardColumns } from '../contexts'
2
+ import { ReactNode } from 'react'
3
+ import { BoardNullColumnPlaceholder } from '../const'
4
+
5
+ export type BoardNullColumnProps = {
6
+ children: ReactNode
7
+ hideEmpty?: boolean
8
+ };
9
+ export const BoardNullColumn = ({ children, hideEmpty }: BoardNullColumnProps) => {
10
+ const column = useBoardColumns().find(it => it.id === BoardNullColumnPlaceholder)
11
+ if (!column || (hideEmpty && column.items.length === 0)) {
12
+ return null
13
+ }
14
+
15
+ return (
16
+ <BoardCurrentColumnContext.Provider value={column}>
17
+ {children}
18
+ </BoardCurrentColumnContext.Provider>
19
+ )
20
+ }
@@ -0,0 +1,7 @@
1
+ export * from './Board'
2
+ export * from './BoardColumn'
3
+ export * from './BoardItem'
4
+ export * from './BoardEachColumn'
5
+ export * from './BoardEachItem'
6
+ export * from './BoardNullColumn'
7
+ export * from './BoardColumnLabel'
@@ -0,0 +1,23 @@
1
+ import { createRequiredContext } from '@contember/react-utils'
2
+ import { BoardColumnNode, BoardColumnValue, BoardItemNode, BoardMethods } from './types'
3
+
4
+ const _BoardMethodsContext = createRequiredContext<BoardMethods<any>>('BoardMethodsContext')
5
+ /** @internal */
6
+ export const BoardMethodsContext = _BoardMethodsContext[0]
7
+ export const useBoardMethods = _BoardMethodsContext[1] as <T extends BoardColumnValue = BoardColumnValue>() => BoardMethods<T>
8
+
9
+
10
+ const BoardColumnsContext_ = createRequiredContext<BoardColumnNode[]>('BoardColumnsContext')
11
+ /** @internal */
12
+ export const BoardColumnsContext = BoardColumnsContext_[0]
13
+ export const useBoardColumns = BoardColumnsContext_[1] as <T extends BoardColumnValue = BoardColumnValue>() => BoardColumnNode<T>[]
14
+
15
+ const _BoardColumnContext = createRequiredContext<BoardColumnNode>('BoardCurrentColumnContext')
16
+ /** @internal*/
17
+ export const BoardCurrentColumnContext = _BoardColumnContext[0]
18
+ export const useBoardCurrentColumn = _BoardColumnContext[1]
19
+
20
+ const BoardCurrentItemContext_ = createRequiredContext<BoardItemNode & { column: BoardColumnNode }>('BoardCurrentItemContext')
21
+ /** @internal*/
22
+ export const BoardCurrentItemContext = BoardCurrentItemContext_[0]
23
+ export const useBoardCurrentItem = BoardCurrentItemContext_[1]
package/src/index.ts CHANGED
@@ -1,6 +1,4 @@
1
- export * from './Board'
2
- export * from './BoardBindingProps'
3
1
  export * from './const'
4
2
  export * from './types'
5
- export * from './useDynamicBoard'
6
- export * from './useStaticBoard'
3
+ export * from './components'
4
+ export * from './contexts'
@@ -0,0 +1,25 @@
1
+ import { Environment } from '@contember/binding'
2
+ import { ChildrenAnalyzer, Leaf } from '@contember/react-multipass-rendering'
3
+ import { BoardItem } from '../components/BoardItem'
4
+ import { ReactNode } from 'react'
5
+ import { BoardColumn } from '../components/BoardColumn'
6
+
7
+ const itemLeaf = new Leaf(node => node.props.children, BoardItem)
8
+ const columnLeaf = new Leaf(node => node.props.children, BoardColumn)
9
+
10
+
11
+ export const boardColumnsAnalyzer = new ChildrenAnalyzer<
12
+ ReactNode,
13
+ never,
14
+ Environment
15
+ >([columnLeaf], {
16
+ staticRenderFactoryName: 'staticRender',
17
+ })
18
+
19
+ export const boardItemsAnalyzer = new ChildrenAnalyzer<
20
+ ReactNode,
21
+ never,
22
+ Environment
23
+ >([itemLeaf], {
24
+ staticRenderFactoryName: 'staticRender',
25
+ })
@@ -1,4 +1,3 @@
1
- import { BoardAddItemMethod, BoardColumnValue, BoardMethods, BoardMoveItemMethod, BoardRemoveItemMethod } from '../BoardBindingProps'
2
1
  import { useCallback, useMemo } from 'react'
3
2
  import {
4
3
  BatchUpdatesOptions,
@@ -10,6 +9,7 @@ import {
10
9
  } from '@contember/react-binding'
11
10
  import { BoardColumnKey, UseGroupItemsByColumn } from './useGroupItemsByColumn'
12
11
  import { arrayMove } from '../utils/arrayMove'
12
+ import { BoardAddItemMethod, BoardColumnValue, BoardMethods, BoardMoveItemMethod, BoardRemoveItemMethod } from '../types'
13
13
 
14
14
 
15
15
  export type UseBoardItemsMethodsProps<ColumnValue extends BoardColumnValue> = {
@@ -1,44 +1,30 @@
1
- import { BoardColumn, BoardColumnValue } from '../BoardBindingProps'
2
1
  import { useMemo } from 'react'
3
2
  import { UseGroupItemsByColumn } from './useGroupItemsByColumn'
4
3
  import { EntityListAccessor } from '@contember/react-binding'
5
4
  import { BoardNullColumnPlaceholder } from '../const'
6
- import { BoardNullBehaviourProps } from '../types'
5
+ import { BoardColumnNode, BoardColumnValue } from '../types'
7
6
 
8
- export const useBoardColumns = <ColumnValue extends BoardColumnValue>({ groupItemsByColumn, items, columns, nullColumn, nullColumnPlacement, columnIdGetter }: {
7
+ export const useCreateBoardColumns = <ColumnValue extends BoardColumnValue>({ groupItemsByColumn, items, columns, columnIdGetter }: {
9
8
  items: EntityListAccessor
10
9
  columns: Iterable<ColumnValue>
11
10
  columnIdGetter: (column: ColumnValue) => string | number
12
11
  groupItemsByColumn: UseGroupItemsByColumn,
13
- } & BoardNullBehaviourProps): BoardColumn<ColumnValue>[] => {
12
+ }): BoardColumnNode<ColumnValue>[] => {
14
13
 
15
14
  return useMemo(() => {
16
15
  const itemsByColumn = groupItemsByColumn(items)
17
16
 
18
- const result: BoardColumn<ColumnValue>[] = []
19
- let index = 0
20
17
  const nullItems = itemsByColumn.get(null) ?? []
21
-
22
- const pushNullColumn = () => {
23
- if (nullColumn === 'never') {
24
- return
25
- }
26
- if (nullColumn === 'auto' && nullItems.length === 0) {
27
- return
28
- }
29
-
30
- result.push({
18
+ const result: BoardColumnNode<ColumnValue>[] = [
19
+ {
31
20
  id: BoardNullColumnPlaceholder,
32
- index: index++,
21
+ index: Number.MAX_SAFE_INTEGER,
33
22
  value: null,
34
23
  items: nullItems.map((it, index) => ({ value: it, id: it.id, index })),
35
- })
36
- }
24
+ },
25
+ ]
26
+ let index = 0
37
27
 
38
- if (nullColumnPlacement === 'start') {
39
- index--
40
- pushNullColumn()
41
- }
42
28
 
43
29
  for (const column of columns) {
44
30
  result.push({
@@ -48,10 +34,7 @@ export const useBoardColumns = <ColumnValue extends BoardColumnValue>({ groupIte
48
34
  items: itemsByColumn.get(columnIdGetter(column))?.map((it, index) => ({ value: it, id: it.id, index })) ?? [],
49
35
  })
50
36
  }
51
-
52
- if (nullColumnPlacement !== 'start') {
53
- pushNullColumn()
54
- }
55
37
  return result
56
- }, [columnIdGetter, columns, groupItemsByColumn, items, nullColumn, nullColumnPlacement])
38
+
39
+ }, [columnIdGetter, columns, groupItemsByColumn, items])
57
40
  }
@@ -10,12 +10,18 @@ import {
10
10
  useDesugaredRelativeSingleEntity,
11
11
  useDesugaredRelativeSingleField,
12
12
  } from '@contember/react-binding'
13
- import { BoardAddColumnMethod, BoardBindingProps, BoardMoveColumnMethod, BoardRemoveColumnMethod } from './BoardBindingProps'
14
- import { useGroupItemsByColumn } from './internal/useGroupItemsByColumn'
15
- import { useBoardColumns } from './internal/useBoardColumns'
16
- import { BoardCommonProps, BoardDynamicColumnsBindingProps } from './types'
17
- import { useBoardItemsMethods } from './internal/useBoardItemsMethods'
18
- import { arrayMove } from './utils/arrayMove'
13
+ import {
14
+ BoardAddColumnMethod,
15
+ BoardMethods,
16
+ BoardMoveColumnMethod,
17
+ BoardRemoveColumnMethod,
18
+ } from '../types'
19
+ import { useGroupItemsByColumn } from './useGroupItemsByColumn'
20
+ import { useCreateBoardColumns } from './useCreateBoardColumns'
21
+ import { arrayMove } from '../utils/arrayMove'
22
+ import { useBoardItemsMethods } from './useBoardItemsMethods'
23
+ import { BoardData } from '../types/BoardData'
24
+ import { BoardCommonProps, BoardDynamicColumnsBindingProps } from '../components'
19
25
 
20
26
 
21
27
  export type UseDynamicBoardBindingProps =
@@ -39,9 +45,7 @@ export const useDynamicBoard = ({
39
45
  discriminationField,
40
46
  columnEntities,
41
47
  itemEntities,
42
- nullColumnPlacement = 'end',
43
- nullColumn = 'auto',
44
- }: UseDynamicBoardBindingProps): BoardBindingProps<EntityAccessor> => {
48
+ }: UseDynamicBoardBindingProps): [BoardData<EntityAccessor>, BoardMethods<EntityAccessor>] => {
45
49
 
46
50
  const desugaredSortableByField = useDesugaredRelativeSingleField(sortableBy)
47
51
  const desugaredColumnSortableByField = useDesugaredRelativeSingleField(columnsSortableBy)
@@ -61,13 +65,11 @@ export const useDynamicBoard = ({
61
65
 
62
66
  const getSortedColumns = useGetSortedColumns(desugaredColumnSortableByField)
63
67
 
64
- const columnsResult = useBoardColumns<EntityAccessor>({
68
+ const columnsResult = useCreateBoardColumns<EntityAccessor>({
65
69
  columns: getSortedColumns(columnEntities),
66
70
  columnIdGetter: it => it.id,
67
71
  groupItemsByColumn,
68
72
  items: itemEntities,
69
- nullColumn,
70
- nullColumnPlacement,
71
73
  })
72
74
 
73
75
  const addColumn = useCallback<BoardAddColumnMethod>((index, preprocess) => {
@@ -123,13 +125,14 @@ export const useDynamicBoard = ({
123
125
  itemEntities,
124
126
  })
125
127
 
126
- return {
127
- columns: columnsResult,
128
- addColumn,
128
+ const methods = useMemo(() => ({
129
129
  addItem,
130
- moveColumn,
131
130
  moveItem,
132
- removeColumn,
133
131
  removeItem,
134
- }
132
+ moveColumn,
133
+ addColumn,
134
+ removeColumn,
135
+ }), [addItem, moveItem, removeItem, moveColumn, addColumn, removeColumn])
136
+
137
+ return [{ columns: columnsResult }, methods]
135
138
  }