@tcn/ui-table 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +1 -1
  2. package/dist/cell.css +1 -0
  3. package/dist/cell.module-WpHnQBVu.js +5 -0
  4. package/dist/cell.module-WpHnQBVu.js.map +1 -0
  5. package/dist/components/cells/data_cell.d.ts +3 -2
  6. package/dist/components/cells/data_cell.d.ts.map +1 -0
  7. package/dist/components/cells/data_cell.js +18 -10
  8. package/dist/components/cells/data_cell.js.map +1 -1
  9. package/dist/components/cells/footer_cell.d.ts +3 -2
  10. package/dist/components/cells/footer_cell.d.ts.map +1 -0
  11. package/dist/components/cells/footer_cell.js +18 -10
  12. package/dist/components/cells/footer_cell.js.map +1 -1
  13. package/dist/components/cells/header_cell.d.ts +3 -2
  14. package/dist/components/cells/header_cell.d.ts.map +1 -0
  15. package/dist/components/cells/header_cell.js +52 -18
  16. package/dist/components/cells/header_cell.js.map +1 -1
  17. package/dist/components/cells/sticky_row_data_cell.d.ts +3 -2
  18. package/dist/components/cells/sticky_row_data_cell.d.ts.map +1 -0
  19. package/dist/components/cells/sticky_row_data_cell.js +26 -11
  20. package/dist/components/cells/sticky_row_data_cell.js.map +1 -1
  21. package/dist/components/cells/sticky_row_fill_cell.d.ts +2 -2
  22. package/dist/components/cells/sticky_row_fill_cell.d.ts.map +1 -0
  23. package/dist/components/cells/sticky_row_fill_cell.js +15 -5
  24. package/dist/components/cells/sticky_row_fill_cell.js.map +1 -1
  25. package/dist/components/global_search.d.ts +2 -2
  26. package/dist/components/global_search.d.ts.map +1 -0
  27. package/dist/components/global_search.js +26 -9
  28. package/dist/components/global_search.js.map +1 -1
  29. package/dist/components/global_search_presenter.d.ts +2 -1
  30. package/dist/components/global_search_presenter.d.ts.map +1 -0
  31. package/dist/components/global_search_presenter.js +20 -18
  32. package/dist/components/global_search_presenter.js.map +1 -1
  33. package/dist/components/table/table.d.ts +3 -2
  34. package/dist/components/table/table.d.ts.map +1 -0
  35. package/dist/components/table/table.js +140 -77
  36. package/dist/components/table/table.js.map +1 -1
  37. package/dist/components/table/table_column.d.ts +1 -1
  38. package/dist/components/table/table_column.d.ts.map +1 -0
  39. package/dist/components/table/table_column.js +6 -5
  40. package/dist/components/table/table_column.js.map +1 -1
  41. package/dist/components/table/table_presenter.d.ts +3 -2
  42. package/dist/components/table/table_presenter.d.ts.map +1 -0
  43. package/dist/components/table/table_presenter.js +45 -62
  44. package/dist/components/table/table_presenter.js.map +1 -1
  45. package/dist/components/table_filter_panel/field_filters/date_field_filter.d.ts +2 -2
  46. package/dist/components/table_filter_panel/field_filters/date_field_filter.d.ts.map +1 -0
  47. package/dist/components/table_filter_panel/field_filters/date_field_filter.js +59 -33
  48. package/dist/components/table_filter_panel/field_filters/date_field_filter.js.map +1 -1
  49. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.d.ts +4 -3
  50. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.d.ts.map +1 -0
  51. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.js +57 -91
  52. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.js.map +1 -1
  53. package/dist/components/table_filter_panel/field_filters/field_filter_props.d.ts +1 -0
  54. package/dist/components/table_filter_panel/field_filters/field_filter_props.d.ts.map +1 -0
  55. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.d.ts +1 -0
  56. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.d.ts.map +1 -0
  57. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.d.ts +3 -3
  58. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.d.ts.map +1 -0
  59. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.js +52 -29
  60. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.js.map +1 -1
  61. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.d.ts +3 -2
  62. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.d.ts.map +1 -0
  63. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.js +53 -70
  64. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.js.map +1 -1
  65. package/dist/components/table_filter_panel/field_filters/number_field_filter.d.ts +3 -3
  66. package/dist/components/table_filter_panel/field_filters/number_field_filter.d.ts.map +1 -0
  67. package/dist/components/table_filter_panel/field_filters/number_field_filter.js +47 -23
  68. package/dist/components/table_filter_panel/field_filters/number_field_filter.js.map +1 -1
  69. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.d.ts +5 -4
  70. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.d.ts.map +1 -0
  71. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.js +53 -58
  72. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.js.map +1 -1
  73. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.d.ts +2 -2
  74. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.d.ts.map +1 -0
  75. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.js +61 -31
  76. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.js.map +1 -1
  77. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.d.ts +4 -3
  78. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.d.ts.map +1 -0
  79. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.js +57 -91
  80. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.js.map +1 -1
  81. package/dist/components/table_filter_panel/field_filters/select_field_filter.d.ts +3 -3
  82. package/dist/components/table_filter_panel/field_filters/select_field_filter.d.ts.map +1 -0
  83. package/dist/components/table_filter_panel/field_filters/select_field_filter.js +49 -24
  84. package/dist/components/table_filter_panel/field_filters/select_field_filter.js.map +1 -1
  85. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.d.ts +3 -2
  86. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.d.ts.map +1 -0
  87. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.js +49 -53
  88. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.js.map +1 -1
  89. package/dist/components/table_filter_panel/field_filters/string_field_filter.d.ts +3 -3
  90. package/dist/components/table_filter_panel/field_filters/string_field_filter.d.ts.map +1 -0
  91. package/dist/components/table_filter_panel/field_filters/string_field_filter.js +62 -33
  92. package/dist/components/table_filter_panel/field_filters/string_field_filter.js.map +1 -1
  93. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.d.ts +5 -4
  94. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.d.ts.map +1 -0
  95. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.js +54 -59
  96. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.js.map +1 -1
  97. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.d.ts +2 -1
  98. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.d.ts.map +1 -0
  99. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.js +13 -19
  100. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.js.map +1 -1
  101. package/dist/components/table_filter_panel/table_filter_panel.d.ts +5 -4
  102. package/dist/components/table_filter_panel/table_filter_panel.d.ts.map +1 -0
  103. package/dist/components/table_filter_panel/table_filter_panel.js +15 -11
  104. package/dist/components/table_filter_panel/table_filter_panel.js.map +1 -1
  105. package/dist/components/table_filter_panel/table_filter_panel_presenter.d.ts +2 -2
  106. package/dist/components/table_filter_panel/table_filter_panel_presenter.d.ts.map +1 -0
  107. package/dist/components/table_filter_panel/table_filter_panel_presenter.js +45 -62
  108. package/dist/components/table_filter_panel/table_filter_panel_presenter.js.map +1 -1
  109. package/dist/components/table_filter_panel/types.d.ts +1 -0
  110. package/dist/components/table_filter_panel/types.d.ts.map +1 -0
  111. package/dist/components/table_filter_panel/types.js +5 -2
  112. package/dist/components/table_filter_panel/types.js.map +1 -1
  113. package/dist/components/table_pager.d.ts +2 -2
  114. package/dist/components/table_pager.d.ts.map +1 -0
  115. package/dist/components/table_pager.js +22 -20
  116. package/dist/components/table_pager.js.map +1 -1
  117. package/dist/index.d.ts +1 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +27 -13
  120. package/dist/index.js.map +1 -1
  121. package/dist/table.css +1 -0
  122. package/dist/table_pager.css +1 -0
  123. package/package.json +61 -61
  124. package/src/__stories__/aip_table.stories.tsx +190 -0
  125. package/src/__stories__/auth_provider.tsx +14 -0
  126. package/src/__stories__/demo.stories.tsx +137 -0
  127. package/src/__stories__/sample_data.ts +1398 -0
  128. package/src/__stories__/table.stories.tsx +423 -0
  129. package/src/__tests__/sanity.test.ts +7 -0
  130. package/src/components/cells/data_cell.tsx +25 -0
  131. package/src/components/cells/footer_cell.tsx +25 -0
  132. package/src/components/cells/header_cell.tsx +77 -0
  133. package/src/components/cells/sticky_row_data_cell.tsx +31 -0
  134. package/src/components/cells/sticky_row_fill_cell.tsx +16 -0
  135. package/src/components/global_search.tsx +33 -0
  136. package/src/components/global_search_presenter.ts +24 -0
  137. package/{dist → src}/components/table/table.module.css +3 -2
  138. package/src/components/table/table.tsx +183 -0
  139. package/src/components/table/table_column.tsx +27 -0
  140. package/src/components/table/table_presenter.test.ts +161 -0
  141. package/src/components/table/table_presenter.ts +103 -0
  142. package/src/components/table_filter_panel/field_filters/date_field_filter.tsx +70 -0
  143. package/src/components/table_filter_panel/field_filters/date_field_filter_presenter.test.ts +583 -0
  144. package/src/components/table_filter_panel/field_filters/date_field_filter_presenter.ts +110 -0
  145. package/src/components/table_filter_panel/field_filters/field_filter_props.ts +5 -0
  146. package/src/components/table_filter_panel/field_filters/field_filter_strategy.ts +14 -0
  147. package/src/components/table_filter_panel/field_filters/mulit_select_field_filter.tsx +68 -0
  148. package/src/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.ts +444 -0
  149. package/src/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.ts +90 -0
  150. package/src/components/table_filter_panel/field_filters/number_field_filter.tsx +53 -0
  151. package/src/components/table_filter_panel/field_filters/number_field_filter_presenter.test.ts +431 -0
  152. package/src/components/table_filter_panel/field_filters/number_field_filter_presenter.ts +80 -0
  153. package/src/components/table_filter_panel/field_filters/number_range_field_filter.tsx +68 -0
  154. package/src/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.ts +582 -0
  155. package/src/components/table_filter_panel/field_filters/number_range_field_filter_presenter.ts +110 -0
  156. package/src/components/table_filter_panel/field_filters/select_field_filter.tsx +57 -0
  157. package/src/components/table_filter_panel/field_filters/select_field_filter_presenter.test.ts +365 -0
  158. package/src/components/table_filter_panel/field_filters/select_field_filter_presenter.ts +74 -0
  159. package/src/components/table_filter_panel/field_filters/string_field_filter.tsx +70 -0
  160. package/src/components/table_filter_panel/field_filters/string_field_filter_presenter.test.ts +296 -0
  161. package/src/components/table_filter_panel/field_filters/string_field_filter_presenter.ts +81 -0
  162. package/src/components/table_filter_panel/field_filters/use_field_filter_strategy.tsx +30 -0
  163. package/src/components/table_filter_panel/table_filter_panel.stories.tsx +46 -0
  164. package/src/components/table_filter_panel/table_filter_panel.tsx +26 -0
  165. package/src/components/table_filter_panel/table_filter_panel_presenter.ts +77 -0
  166. package/src/components/table_filter_panel/types.ts +3 -0
  167. package/src/components/table_pager.tsx +39 -0
  168. package/src/index.ts +16 -0
  169. package/tsconfig.json +36 -0
  170. package/types/file_types.d.ts +54 -0
  171. package/types/react_color.d.ts +61 -0
  172. package/dist/__stories__/aip_table.stories.d.ts +0 -5
  173. package/dist/__stories__/aip_table.stories.js +0 -96
  174. package/dist/__stories__/aip_table.stories.js.map +0 -1
  175. package/dist/__stories__/auth_provider.d.ts +0 -4
  176. package/dist/__stories__/auth_provider.js +0 -10
  177. package/dist/__stories__/auth_provider.js.map +0 -1
  178. package/dist/__stories__/demo.stories.d.ts +0 -6
  179. package/dist/__stories__/demo.stories.js +0 -94
  180. package/dist/__stories__/demo.stories.js.map +0 -1
  181. package/dist/__stories__/sample_data.d.ts +0 -36
  182. package/dist/__stories__/sample_data.js +0 -1385
  183. package/dist/__stories__/sample_data.js.map +0 -1
  184. package/dist/__stories__/table.stories.d.ts +0 -12
  185. package/dist/__stories__/table.stories.js +0 -272
  186. package/dist/__stories__/table.stories.js.map +0 -1
  187. package/dist/components/table/table_presenter.test.d.ts +0 -1
  188. package/dist/components/table/table_presenter.test.js +0 -125
  189. package/dist/components/table/table_presenter.test.js.map +0 -1
  190. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.d.ts +0 -1
  191. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.js +0 -434
  192. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.js.map +0 -1
  193. package/dist/components/table_filter_panel/field_filters/field_filter_props.js +0 -2
  194. package/dist/components/table_filter_panel/field_filters/field_filter_props.js.map +0 -1
  195. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.js +0 -2
  196. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.js.map +0 -1
  197. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.d.ts +0 -1
  198. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.js +0 -332
  199. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.js.map +0 -1
  200. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.d.ts +0 -1
  201. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.js +0 -347
  202. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.js.map +0 -1
  203. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.d.ts +0 -1
  204. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.js +0 -452
  205. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.js.map +0 -1
  206. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.d.ts +0 -1
  207. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.js +0 -285
  208. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.js.map +0 -1
  209. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.d.ts +0 -1
  210. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.js +0 -232
  211. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.js.map +0 -1
  212. package/dist/components/table_filter_panel/table_filter_panel.stories.d.ts +0 -6
  213. package/dist/components/table_filter_panel/table_filter_panel.stories.js +0 -25
  214. package/dist/components/table_filter_panel/table_filter_panel.stories.js.map +0 -1
  215. /package/{dist → src}/__stories__/table.module.css +0 -0
  216. /package/{dist → src}/components/cells/cell.module.css +0 -0
  217. /package/{dist → src}/components/table_pager.module.css +0 -0
package/package.json CHANGED
@@ -1,74 +1,74 @@
1
1
  {
2
2
  "name": "@tcn/ui-table",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
+ "description": "React table component library",
5
6
  "author": "TCN",
6
- "description": "Blackcat UI Table",
7
+ "license": "Apache-2.0",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "access": "public",
12
+ "blackcatConfig": {
13
+ "storybook": {
14
+ "publish": true,
15
+ "title": "UI Table",
16
+ "port": 6300
17
+ }
18
+ },
7
19
  "files": [
8
- "dist/**/*"
20
+ "dist",
21
+ "src",
22
+ "types",
23
+ "README.md",
24
+ "tsconfig.json"
9
25
  ],
10
- "main": "dist/index.js",
11
- "license": "Apache-2.0",
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "@bc-monorepo/source": "./src/index.ts",
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js",
33
+ "default": "./dist/index.js"
34
+ },
35
+ "./package.json": "./package.json"
36
+ },
37
+ "sideEffects": [
38
+ "**/*.css"
39
+ ],
40
+ "dependencies": {
41
+ "clarity-pattern-parser": "^11.5.4",
42
+ "@tcn/aip-160": "1.2.5",
43
+ "@tcn/icons": "2.2.1",
44
+ "@tcn/resource-store": "2.5.0",
45
+ "@tcn/ui": "0.4.0",
46
+ "@tcn/state": "1.1.1"
47
+ },
12
48
  "peerDependencies": {
13
49
  "react": "^18.2.0",
14
50
  "react-dom": "^18.2.0"
15
51
  },
16
52
  "scripts": {
17
- "check-all": "concurrently 'yarn check-types' 'biome check .'",
18
- "check-types": "./node_modules/.bin/tspc --project ./tsconfig.types.json --noEmit",
19
- "check-format": "biome format .",
20
- "check-lint": "biome lint .",
21
- "fix-all": "biome check --write",
22
- "fix-format": "biome format --write",
23
- "fix-lint": "biome lint --write",
24
- "fix-imports": "biome check --formatter-enabled=false --linter-enabled=false --organize-imports-enabled=true --write",
25
- "build": "tspc && copyfiles -u 1 'src/**/*.css' dist/",
26
- "build-types": "tspc --project ./tsconfig.types.json --emitDeclarationOnly",
53
+ "start": "pnpm storybook",
54
+ "build": "vite build",
55
+ "clean": "rm -rf dist storybook-static",
56
+ "clean-all": "pnpm clean && rm -rf node_modules",
27
57
  "test": "vitest run",
28
58
  "test-coverage": "vitest run --coverage",
29
- "storybook": "storybook dev -p 6006",
30
- "build-storybook": "storybook build"
31
- },
32
- "devDependencies": {
33
- "@biomejs/biome": "1.9.4",
34
- "@chromatic-com/storybook": "^1.2.25",
35
- "@storybook/addon-essentials": "^8.0.4",
36
- "@storybook/addon-interactions": "^8.0.4",
37
- "@storybook/addon-links": "^8.0.4",
38
- "@storybook/addon-onboarding": "^8.0.4",
39
- "@storybook/blocks": "^8.0.4",
40
- "@storybook/react": "^8.0.4",
41
- "@storybook/react-vite": "^8.0.4",
42
- "@storybook/test": "^8.0.4",
43
- "@storybook/testing-library": "^0.2.2",
44
- "@tcn-internal/sb-tcn-auth-addon": "^0.0.1",
45
- "@tcn/sb-blackcat-addon": "^3.0.12",
46
- "@types/copyfiles": "^2",
47
- "@types/node": "^20.11.30",
48
- "@types/react": "^18.2.70",
49
- "@types/react-dom": "^18.2.22",
50
- "@vitejs/plugin-react": "^4.2.1",
51
- "concurrently": "^8.2.2",
52
- "copyfiles": "^2.4.1",
53
- "react": "^18.2.0",
54
- "react-dom": "^18.2.0",
55
- "read-pkg-up": "^11.0.0",
56
- "storybook": "^8.0.4",
57
- "ts-patch": "^3.2.1",
58
- "typescript": "5.4.3",
59
- "typescript-transform-paths": "^3.5.1",
60
- "vite": "^5.2.6",
61
- "vite-css-modules": "^1.5.2",
62
- "vitest": "^2.1.4"
63
- },
64
- "dependencies": {
65
- "@tcn/aip-160": "^1.2.2",
66
- "@tcn/icons": "^2.1.0",
67
- "@tcn/resource-store": "^2.4.0",
68
- "@tcn/state": "^0.3.1",
69
- "@tcn/ui": "^0.3.3",
70
- "clarity-pattern-parser": "^11.5.4",
71
- "classnames": "^2.5.1"
72
- },
73
- "packageManager": "yarn@4.0.2"
74
- }
59
+ "check-all": "concurrently 'pnpm check-types' 'pnpm run biome check .'",
60
+ "check-types": "tsc --project tsconfig.typecheck.json --noEmit",
61
+ "check-format": "pnpm run biome format .",
62
+ "check-lint": "pnpm run biome lint .",
63
+ "check-imports": "pnpm run biome check --formatter-enabled=false --linter-enabled=false --assist-enabled=true",
64
+ "fix-all": "pnpm run biome check --write",
65
+ "fix-format": "pnpm run biome format --write",
66
+ "fix-lint": "pnpm run biome lint --write",
67
+ "fix-imports": "pnpm run biome check --write --unsafe --formatter-enabled=false --linter-enabled=false --assist-enabled=true",
68
+ "publish-dry-run": "pnpm build && pnpm publish --dry-run --force --no-git-checks",
69
+ "biome": "pnpm exec biome",
70
+ "storybook": "bash ../../scripts/ensure-addon-built.sh && storybook dev",
71
+ "storybook:silent": "storybook dev --no-open --disable-telemetry --quiet",
72
+ "storybook:build": "storybook build"
73
+ }
74
+ }
@@ -0,0 +1,190 @@
1
+ import { Meta } from '@storybook/react-vite';
2
+ import React, { useState } from 'react';
3
+
4
+ import { AIPDataSource } from '@tcn/resource-store';
5
+
6
+ import { Button } from '@tcn/ui/actions';
7
+ import { HStack, Spacer, VStack } from '@tcn/ui/stacks';
8
+ import { GlobalSearch } from '../components/global_search.js';
9
+ import { Table } from '../components/table/table.js';
10
+ import { TableColumn } from '../components/table/table_column.js';
11
+ import { TablePager } from '../components/table_pager.js';
12
+
13
+ import { Signal, useSignalValue, useSignalValueEffect } from '@tcn/state';
14
+ import { Title } from '@tcn/ui/typography';
15
+
16
+ import styles from './table.module.css';
17
+
18
+ import { VPanel } from '@tcn/ui/surfaces';
19
+ import { AuthContext, useToken } from './auth_provider.js';
20
+
21
+ const meta: Meta = {
22
+ title: 'AIP Table',
23
+ };
24
+
25
+ type Organization = {
26
+ name: string;
27
+ displayName: string;
28
+ billingId: string;
29
+ clientSid: string;
30
+ timeZone: string;
31
+ createTime: Date;
32
+ updateTime: Date;
33
+ };
34
+
35
+ const resourceURL =
36
+ 'https://api.dev.tcn.com/tcn/org/organizations/v1alpha1/organizations';
37
+ const resourceName = 'organizations';
38
+
39
+ function BasicContent() {
40
+ const authToken = useToken();
41
+
42
+ const [source] = useState(() => {
43
+ const fields = [
44
+ {
45
+ fieldName: 'name',
46
+ sourceFieldName: 'name',
47
+ getValue: (i: Organization) => i.name,
48
+ },
49
+ {
50
+ fieldName: 'displayName',
51
+ sourceFieldName: 'display_name',
52
+ getValue: (i: Organization) => i.displayName,
53
+ },
54
+ {
55
+ fieldName: 'billingId',
56
+ sourceFieldName: 'billing_id',
57
+ getValue: (i: Organization) => i.billingId,
58
+ },
59
+ {
60
+ fieldName: 'clientSid',
61
+ sourceFieldName: 'client_sid',
62
+ getValue: (i: Organization) => i.clientSid,
63
+ },
64
+ {
65
+ fieldName: 'timeZone',
66
+ sourceFieldName: 'time_zone',
67
+ getValue: (i: Organization) => i.timeZone,
68
+ },
69
+ {
70
+ fieldName: 'createTime',
71
+ sourceFieldName: 'create_time',
72
+ getValue: (i: Organization) => new Date(i.createTime),
73
+ },
74
+ {
75
+ fieldName: 'updateTime',
76
+ sourceFieldName: 'update_time',
77
+ getValue: (i: Organization) => new Date(i.updateTime),
78
+ },
79
+ ];
80
+ return new AIPDataSource<Organization, Organization>({
81
+ resourceUrl: resourceURL,
82
+ resourceName,
83
+ fields,
84
+ getAuthToken: () => authToken.get(),
85
+ });
86
+ });
87
+
88
+ const tokenValue = useSignalValue(authToken);
89
+
90
+ useSignalValueEffect(_ => {
91
+ source.list();
92
+ }, authToken);
93
+
94
+ return (
95
+ <VStack>
96
+ <HStack height="auto">{tokenValue === '' ? 'Sign in to load data' : ''}</HStack>
97
+ <VPanel>
98
+ <HStack className={styles.header} padding="8px" vAlign="center">
99
+ <Title>Organizations</Title>
100
+ <Spacer />
101
+ <GlobalSearch dataSource={source} />
102
+ </HStack>
103
+ <VStack height="flex">
104
+ <Table dataSource={source} onRowClick={i => alert(`Clicked ${i.name}`)}>
105
+ <TableColumn
106
+ heading="Name"
107
+ fieldName="name"
108
+ render={(i: Organization) => i.name}
109
+ width={320}
110
+ footer="Note: not for display"
111
+ sticky="start"
112
+ />
113
+ <TableColumn
114
+ heading="Display Name"
115
+ fieldName="display_name"
116
+ width={300}
117
+ render={(i: Organization) => i.displayName}
118
+ />
119
+ <TableColumn
120
+ heading="Client SID"
121
+ fieldName="client_sid"
122
+ width={80}
123
+ render={(i: Organization) => i.clientSid}
124
+ canSort
125
+ />
126
+ <TableColumn
127
+ heading="Random Stuff"
128
+ footer="Not derived from data"
129
+ width={300}
130
+ render={() =>
131
+ Array.from(
132
+ { length: Math.floor(Math.random() * 30) },
133
+ () => Math.floor(Math.random() * 94) + 32
134
+ )
135
+ .map(num => String.fromCharCode(num))
136
+ .join('')
137
+ }
138
+ />
139
+ <TableColumn
140
+ heading="Created Time"
141
+ fieldName="create_time"
142
+ width={200}
143
+ render={(i: Organization) => i.createTime.toLocaleString()}
144
+ />
145
+ <TableColumn
146
+ heading="Update Time"
147
+ fieldName="update_time"
148
+ width={200}
149
+ render={(i: Organization) => (
150
+ <div style={{ color: 'red' }}>{i.updateTime.toLocaleString()}</div>
151
+ )}
152
+ />
153
+ <TableColumn
154
+ heading="Actions"
155
+ width={80}
156
+ render={(i: Organization) => (
157
+ <div>
158
+ <Button
159
+ onClick={e => {
160
+ e.stopPropagation();
161
+ alert(`Edit ${i.name}`);
162
+ }}
163
+ >
164
+ Edit
165
+ </Button>
166
+ </div>
167
+ )}
168
+ sticky="end"
169
+ />
170
+ </Table>
171
+ </VStack>
172
+ <HStack padding="8px">
173
+ <TablePager dataSource={source} />
174
+ </HStack>
175
+ </VPanel>
176
+ </VStack>
177
+ );
178
+ }
179
+
180
+ export function Basic() {
181
+ const [tokenSignal] = useState(() => new Signal<string>(''));
182
+
183
+ return (
184
+ <AuthContext.Provider value={tokenSignal}>
185
+ <BasicContent />
186
+ </AuthContext.Provider>
187
+ );
188
+ }
189
+
190
+ export default meta;
@@ -0,0 +1,14 @@
1
+ import { Signal } from '@tcn/state';
2
+ import React, { useContext } from 'react';
3
+
4
+ export const AuthContext = React.createContext<Signal<string> | null>(null);
5
+
6
+ export function useToken() {
7
+ const token = useContext(AuthContext);
8
+
9
+ if (token == null) {
10
+ throw new Error('Token cannot be null.');
11
+ }
12
+
13
+ return token;
14
+ }
@@ -0,0 +1,137 @@
1
+ import { FilterTwoFilledIcon } from '@tcn/icons/filter_two_filled_icon.js';
2
+ import {
3
+ StaticDataSource,
4
+ StaticDateField,
5
+ StaticNumberField,
6
+ StaticStringField,
7
+ } from '@tcn/resource-store';
8
+ import { useSignalValue } from '@tcn/state';
9
+ import { Button } from '@tcn/ui/actions';
10
+ import { Box, HStack, Spacer } from '@tcn/ui/stacks';
11
+ import { VPanel } from '@tcn/ui/surfaces';
12
+ import { Title } from '@tcn/ui/typography';
13
+ import React, { useState } from 'react';
14
+ import { GlobalSearch } from '../components/global_search.js';
15
+ import { Table } from '../components/table/table.js';
16
+ import { TableColumn } from '../components/table/table_column.js';
17
+ import { DateFieldFilter } from '../components/table_filter_panel/field_filters/date_field_filter.js';
18
+ import { MulitSelectFieldFilter } from '../components/table_filter_panel/field_filters/mulit_select_field_filter.js';
19
+ import { NumberFieldFilter } from '../components/table_filter_panel/field_filters/number_field_filter.js';
20
+ import { NumberRangeFieldFilter } from '../components/table_filter_panel/field_filters/number_range_field_filter.js';
21
+ import { SelectFieldFilter } from '../components/table_filter_panel/field_filters/select_field_filter.js';
22
+ import { StringFieldFilter } from '../components/table_filter_panel/field_filters/string_field_filter.js';
23
+ import { TableFilterPanel } from '../components/table_filter_panel/table_filter_panel.js';
24
+ import { TablePager } from '../components/table_pager.js';
25
+ import { DataItem, items } from './sample_data.js';
26
+
27
+ export default {
28
+ title: 'Demo',
29
+ };
30
+
31
+ export function Demo() {
32
+ const [source] = useState(() => {
33
+ const source = new StaticDataSource<DataItem>(items, [
34
+ new StaticStringField('name', i => i.name),
35
+ new StaticNumberField('age', i => i.age),
36
+ new StaticStringField('email', i => i.email),
37
+ new StaticNumberField('skillLevel', i => i.skillLevel),
38
+ new StaticStringField('city', i => i.city),
39
+ new StaticDateField('birthdate', i => i.birthdate),
40
+ new StaticStringField('occupation', i => i.occupation),
41
+ new StaticStringField('isActive', i => (i.isActive ? 'Yes' : 'No')),
42
+ ]);
43
+ source.setPageSize(80);
44
+
45
+ return source;
46
+ });
47
+
48
+ // biome-ignore lint/correctness/noUnusedVariables: need a reference to the subscription to prevent it from being garbage collected
49
+ const [sub] = useState(() =>
50
+ source.broadcasts.filterString.subscribe(filterString => {
51
+ // biome-ignore lint/suspicious/noConsole: Debug logging in story
52
+ console.log('filterString:', filterString);
53
+ })
54
+ );
55
+
56
+ const [showFilter, setShowFilter] = useState(false);
57
+
58
+ const filterString = useSignalValue(source.broadcasts.filterString);
59
+ const isFiltered = filterString !== '';
60
+
61
+ return (
62
+ <VPanel height="100%">
63
+ <HStack padding="8px" vAlign="center">
64
+ <Title>Cosmerinas</Title>
65
+ <Spacer />
66
+ <GlobalSearch dataSource={source} />
67
+ <Button onClick={() => setShowFilter(!showFilter)}>
68
+ Filter
69
+ {isFiltered ? <FilterTwoFilledIcon /> : null}
70
+ </Button>
71
+ </HStack>
72
+ <HStack height="flex">
73
+ {showFilter && (
74
+ <Box width="300px" enableResizeOnEnd height="100%" padding="4px">
75
+ <TableFilterPanel dataSource={source}>
76
+ <StringFieldFilter fieldName="name" label="Name (string)" />
77
+ <NumberFieldFilter fieldName="age" label="Age (number)" />
78
+ <DateFieldFilter fieldName="birthdate" label="Birthdate (date range)" />
79
+ <SelectFieldFilter
80
+ fieldName="isActive"
81
+ label="Active (select)"
82
+ options={[
83
+ { label: 'Yes', value: true },
84
+ { label: 'No', value: false },
85
+ ]}
86
+ />
87
+ <NumberRangeFieldFilter
88
+ fieldName="skillLevel"
89
+ label="Skill Level (number range)"
90
+ />
91
+ <MulitSelectFieldFilter
92
+ fieldName="occupation"
93
+ label="Occupation (multi select)"
94
+ options={[
95
+ { label: 'Detective', value: 'Detective' },
96
+ { label: 'Mistborn', value: 'Mistborn' },
97
+ { label: 'Soother', value: 'Soother' },
98
+ { label: 'Tin-eye', value: 'Tin-eye' },
99
+ { label: 'Writer', value: 'Writer' },
100
+ { label: 'Chef', value: 'Chef' },
101
+ { label: 'Musician', value: 'Musician' },
102
+ { label: 'Merchant', value: 'Merchant' },
103
+ { label: 'King', value: 'King' },
104
+ { label: 'Assassin', value: 'Assassin' },
105
+ { label: 'Adventurer', value: 'Adventurer' },
106
+ { label: 'Other', value: 'Other' },
107
+ ]}
108
+ />
109
+ </TableFilterPanel>
110
+ </Box>
111
+ )}
112
+ <Box width="100%" height="flex">
113
+ <Table dataSource={source} height="100%" width="flex">
114
+ <TableColumn heading="Name" fieldName="name" />
115
+ <TableColumn heading="Age" fieldName="age" canSort />
116
+ <TableColumn heading="Email" fieldName="email" width={200} />
117
+ <TableColumn heading="Skill Level" fieldName="skillLevel" />
118
+ <TableColumn heading="City" fieldName="city" />
119
+ <TableColumn
120
+ heading="Birthdate"
121
+ fieldName="birthdate"
122
+ render={(i: DataItem) => i.birthdate.toLocaleDateString()}
123
+ />
124
+ <TableColumn heading="Occupation" fieldName="occupation" />
125
+ <TableColumn heading="Active" fieldName="isActive" />
126
+ </Table>
127
+ </Box>
128
+ </HStack>
129
+ <HStack padding="8px">
130
+ <Box width="flex">
131
+ <code style={{ fontFamily: 'monospace' }}>{filterString}</code>
132
+ </Box>
133
+ <TablePager dataSource={source} />
134
+ </HStack>
135
+ </VPanel>
136
+ );
137
+ }