@kaspernj/api-maker 1.0.2011 → 1.0.2012

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 (410) hide show
  1. package/{.eslintrc.cjs → .eslintrc.js} +10 -1
  2. package/README.md +35 -0
  3. package/android/build.gradle +43 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
  6. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
  7. package/build/api.js +120 -0
  8. package/build/attribute-not-loaded-error.js +2 -0
  9. package/build/base-component.js +5 -0
  10. package/build/base-error.js +33 -0
  11. package/build/base-model/attribute.js +25 -0
  12. package/build/base-model/column.js +11 -0
  13. package/build/base-model/reflection.js +14 -0
  14. package/build/base-model/scope.js +11 -0
  15. package/build/base-model.js +828 -0
  16. package/build/bootstrap/attribute-row.js +135 -0
  17. package/build/bootstrap/attribute-rows.js +31 -0
  18. package/build/bootstrap/card.js +138 -0
  19. package/build/bootstrap/checkbox.js +97 -0
  20. package/build/bootstrap/checkboxes.js +183 -0
  21. package/build/bootstrap/index.js +2 -0
  22. package/build/bootstrap/input.js +129 -0
  23. package/build/bootstrap/invalid-feedback.js +27 -0
  24. package/build/bootstrap/paginate.js +150 -0
  25. package/build/bootstrap/radio-buttons.js +72 -0
  26. package/build/bootstrap/select.js +88 -0
  27. package/build/bootstrap/sort-link.js +131 -0
  28. package/build/cable-connection-pool.js +128 -0
  29. package/build/cable-subscription-pool.js +207 -0
  30. package/build/cable-subscription.js +21 -0
  31. package/build/cache-key-generator.js +81 -0
  32. package/build/can-can.js +134 -0
  33. package/build/channels-consumer.js +9 -0
  34. package/build/collection-loader.js +48 -0
  35. package/build/collection.js +280 -0
  36. package/build/command-submit-data.js +81 -0
  37. package/build/commands-pool.js +195 -0
  38. package/build/compose.js +9 -0
  39. package/build/config.js +62 -0
  40. package/build/custom-error.js +5 -0
  41. package/build/data-set-to-attributes.js +10 -0
  42. package/build/deserializer.js +56 -0
  43. package/build/destroy-error.js +5 -0
  44. package/build/devise.js +112 -0
  45. package/build/draggable-sort/controller.js +136 -0
  46. package/build/draggable-sort/index.js +114 -0
  47. package/build/draggable-sort/item.js +188 -0
  48. package/build/error-logger.js +101 -0
  49. package/build/error-messages.js +13 -0
  50. package/build/event-connection.js +32 -0
  51. package/build/event-emitter-listener.js +15 -0
  52. package/build/event-model-class.js +24 -0
  53. package/build/events.js +5 -0
  54. package/build/flash-message.js +79 -0
  55. package/build/form.js +83 -0
  56. package/build/history-expo.js +20 -0
  57. package/build/history-react-native.js +20 -0
  58. package/build/history.js +3 -0
  59. package/build/index.js +3 -0
  60. package/build/inputs/attachment.js +133 -0
  61. package/build/inputs/auto-submit.js +36 -0
  62. package/build/inputs/checkbox.js +138 -0
  63. package/build/inputs/checkboxes.js +112 -0
  64. package/build/inputs/id-for-component.js +15 -0
  65. package/build/inputs/input-wrapper.js +19 -0
  66. package/build/inputs/input.js +243 -0
  67. package/build/inputs/money.js +179 -0
  68. package/build/inputs/name-for-component.js +13 -0
  69. package/build/inputs/select.js +93 -0
  70. package/build/instance-of-class-name.js +23 -0
  71. package/build/key-value-store.js +53 -0
  72. package/build/link.js +73 -0
  73. package/build/logger.js +30 -0
  74. package/build/modal.js +38 -0
  75. package/build/model-class-require.js +13 -0
  76. package/build/model-events.js +30 -0
  77. package/build/model-name.js +28 -0
  78. package/build/model-prop-type.js +101 -0
  79. package/build/model-recipes-loader.js +32 -0
  80. package/build/model-recipes-model-loader.js +357 -0
  81. package/build/models-response-reader.js +40 -0
  82. package/build/models.js +8 -0
  83. package/build/money-formatter.js +78 -0
  84. package/build/not-loaded-error.js +2 -0
  85. package/build/params.js +61 -0
  86. package/build/preloaded.js +38 -0
  87. package/build/resize-observer.js +11 -0
  88. package/build/result.js +13 -0
  89. package/build/router/route.js +270 -0
  90. package/build/router/switch.js +72 -0
  91. package/build/router.js +59 -0
  92. package/build/routes-native.js +202 -0
  93. package/build/routes.js +50 -0
  94. package/build/run-last.js +35 -0
  95. package/build/serializer.js +63 -0
  96. package/build/services.js +20 -0
  97. package/build/session-status-updater.js +134 -0
  98. package/build/source-maps-loader.js +184 -0
  99. package/build/super-admin/config-reader.js +85 -0
  100. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  101. package/build/super-admin/edit-page/edit-attribute-content.js +55 -0
  102. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  103. package/build/super-admin/edit-page/edit-attribute.js +77 -0
  104. package/build/super-admin/edit-page.js +123 -0
  105. package/build/super-admin/has-edit-config.js +12 -0
  106. package/build/super-admin/index-page.js +25 -0
  107. package/build/super-admin/index.js +181 -0
  108. package/build/super-admin/layout/header/index.js +161 -0
  109. package/build/super-admin/layout/index.js +164 -0
  110. package/build/super-admin/layout/menu/index.js +206 -0
  111. package/build/super-admin/layout/menu/menu-content.js +46 -0
  112. package/build/super-admin/layout/menu/menu-item.js +84 -0
  113. package/build/super-admin/layout/no-access.js +27 -0
  114. package/build/super-admin/model-class-table.js +61 -0
  115. package/build/super-admin/models.js +8 -0
  116. package/build/super-admin/show-nav.js +51 -0
  117. package/build/super-admin/show-page/belongs-to-attribute-row.js +29 -0
  118. package/build/super-admin/show-page/index.js +141 -0
  119. package/build/super-admin/show-reflection-actions.js +47 -0
  120. package/build/super-admin/show-reflection-link.js +48 -0
  121. package/build/super-admin/show-reflection-page.js +48 -0
  122. package/build/table/column-content.js +117 -0
  123. package/build/table/column-identifier.js +18 -0
  124. package/build/table/column-visible.js +7 -0
  125. package/build/table/components/column.js +21 -0
  126. package/build/table/components/flat-list.js +21 -0
  127. package/build/table/components/header.js +26 -0
  128. package/build/table/components/row.js +26 -0
  129. package/build/table/filters/attribute-element.js +44 -0
  130. package/build/table/filters/filter-form.js +402 -0
  131. package/build/table/filters/filter.js +90 -0
  132. package/build/table/filters/index.js +184 -0
  133. package/build/table/filters/load-search-modal.js +175 -0
  134. package/build/table/filters/reflection-element.js +37 -0
  135. package/build/table/filters/save-search-modal.js +88 -0
  136. package/build/table/filters/scope-element.js +42 -0
  137. package/build/table/header-column-content.js +68 -0
  138. package/build/table/header-column.js +144 -0
  139. package/build/table/header-select.js +105 -0
  140. package/build/table/model-callback-args.js +10 -0
  141. package/build/table/model-column.js +97 -0
  142. package/build/table/model-row.js +193 -0
  143. package/build/table/select-calculator.js +63 -0
  144. package/build/table/settings/column-row.js +97 -0
  145. package/build/table/settings/download-action.js +79 -0
  146. package/build/table/settings/index.js +92 -0
  147. package/build/table/table-settings.js +219 -0
  148. package/build/table/table.js +972 -0
  149. package/build/table/use-sorting.js +34 -0
  150. package/build/table/widths.js +75 -0
  151. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  152. package/build/table/worker-plugins-checkbox.js +115 -0
  153. package/build/translated-attributes.js +10 -0
  154. package/build/translated-collections.js +12 -0
  155. package/build/updated-attribute.js +76 -0
  156. package/build/url-encode.js +15 -0
  157. package/build/use-breakpoint.js +62 -0
  158. package/build/use-can-can.js +55 -0
  159. package/build/use-collection.js +225 -0
  160. package/build/use-created-event.js +52 -0
  161. package/build/use-current-user.js +76 -0
  162. package/build/use-destroyed-event.js +60 -0
  163. package/build/use-event-emitter.js +13 -0
  164. package/build/use-event-listener.js +16 -0
  165. package/build/use-input.js +137 -0
  166. package/build/use-model-event.js +60 -0
  167. package/build/use-model.js +169 -0
  168. package/build/use-resize-observer.js +23 -0
  169. package/build/use-router.js +104 -0
  170. package/build/use-screen-layout.js +39 -0
  171. package/build/use-updated-event.js +60 -0
  172. package/build/use-validation-errors.js +30 -0
  173. package/build/utils/card.js +51 -0
  174. package/build/utils/checkbox.js +78 -0
  175. package/build/utils/checkboxes.js +163 -0
  176. package/build/utils/default-style.js +18 -0
  177. package/build/utils/icon.js +23 -0
  178. package/build/utils/invalid-feedback.js +19 -0
  179. package/build/utils/modal.js +62 -0
  180. package/build/utils/text.js +19 -0
  181. package/build/validation-error.js +28 -0
  182. package/build/validation-errors.js +98 -0
  183. package/build/with-api-maker.js +29 -0
  184. package/build/with-collection.js +14 -0
  185. package/build/with-current-user.js +10 -0
  186. package/build/with-model.js +15 -0
  187. package/build/with-router.js +22 -0
  188. package/expo-module.config.json +17 -0
  189. package/ios/ApiMaker.podspec +29 -0
  190. package/ios/ApiMakerModule.swift +48 -0
  191. package/ios/ApiMakerView.swift +38 -0
  192. package/link.sh +8 -0
  193. package/package.json +49 -46
  194. package/src/{api.mjs → api.js} +38 -37
  195. package/src/base-component.jsx +5 -0
  196. package/src/{base-error.mjs → base-error.js} +4 -6
  197. package/src/base-model/attribute.js +33 -0
  198. package/src/base-model/column.js +13 -0
  199. package/src/base-model/reflection.js +15 -0
  200. package/src/base-model/scope.js +12 -0
  201. package/src/{base-model.mjs → base-model.js} +302 -144
  202. package/src/bootstrap/attribute-row.jsx +135 -0
  203. package/src/bootstrap/attribute-rows.jsx +27 -0
  204. package/src/bootstrap/card.jsx +149 -0
  205. package/src/bootstrap/checkbox.jsx +86 -0
  206. package/src/bootstrap/checkboxes.jsx +185 -0
  207. package/src/bootstrap/index.js +0 -0
  208. package/src/bootstrap/input.jsx +173 -0
  209. package/src/bootstrap/invalid-feedback.jsx +31 -0
  210. package/src/bootstrap/paginate.jsx +187 -0
  211. package/src/bootstrap/radio-buttons.jsx +87 -0
  212. package/src/bootstrap/select.jsx +110 -0
  213. package/src/bootstrap/sort-link.jsx +106 -0
  214. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +16 -36
  215. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +26 -21
  216. package/src/{cable-subscription.mjs → cable-subscription.js} +6 -4
  217. package/src/cache-key-generator.js +100 -0
  218. package/src/{can-can.mjs → can-can.js} +13 -12
  219. package/src/channels-consumer.js +10 -0
  220. package/src/collection-loader.jsx +58 -224
  221. package/src/{collection.mjs → collection.js} +98 -44
  222. package/src/{command-submit-data.mjs → command-submit-data.js} +2 -7
  223. package/src/{commands-pool.mjs → commands-pool.js} +57 -41
  224. package/src/compose.js +11 -0
  225. package/src/{config.mjs → config.js} +6 -2
  226. package/src/{custom-error.mjs → custom-error.js} +1 -1
  227. package/src/data-set-to-attributes.js +13 -0
  228. package/src/{deserializer.mjs → deserializer.js} +3 -3
  229. package/src/destroy-error.js +7 -0
  230. package/src/devise.js +129 -0
  231. package/src/draggable-sort/controller.js +137 -0
  232. package/src/draggable-sort/index.jsx +108 -0
  233. package/src/draggable-sort/item.jsx +174 -0
  234. package/src/{error-logger.mjs → error-logger.js} +12 -7
  235. package/src/{error-messages.mjs → error-messages.js} +1 -0
  236. package/src/event-connection.jsx +1 -1
  237. package/src/event-emitter-listener.jsx +8 -27
  238. package/src/event-model-class.jsx +2 -4
  239. package/src/events.js +7 -0
  240. package/src/flash-message.js +70 -0
  241. package/src/form.jsx +91 -0
  242. package/src/history-expo.js +23 -0
  243. package/src/history-react-native.js +25 -0
  244. package/src/history.js +3 -0
  245. package/src/index.js +3 -0
  246. package/src/inputs/attachment.jsx +108 -0
  247. package/src/inputs/auto-submit.js +37 -0
  248. package/src/inputs/checkbox.jsx +125 -0
  249. package/src/inputs/checkboxes.jsx +116 -0
  250. package/src/inputs/id-for-component.js +15 -0
  251. package/src/inputs/input-wrapper.jsx +16 -0
  252. package/src/inputs/input.jsx +260 -0
  253. package/src/inputs/money.jsx +187 -0
  254. package/src/inputs/name-for-component.js +15 -0
  255. package/src/inputs/select.jsx +104 -0
  256. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  257. package/src/link.jsx +54 -9
  258. package/src/logger.js +38 -0
  259. package/src/modal.jsx +37 -0
  260. package/src/model-class-require.js +17 -0
  261. package/src/{model-events.mjs → model-events.js} +1 -1
  262. package/src/{model-name.mjs → model-name.js} +8 -8
  263. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  264. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +5 -5
  265. package/src/{models-response-reader.mjs → models-response-reader.js} +3 -4
  266. package/src/models.js +7 -0
  267. package/src/{models.mjs.erb → models.js.erb} +6 -3
  268. package/src/{money-formatter.mjs → money-formatter.js} +5 -4
  269. package/src/{params.mjs → params.js} +17 -7
  270. package/src/{preloaded.mjs → preloaded.js} +2 -2
  271. package/src/resize-observer.jsx +10 -0
  272. package/src/result.js +13 -0
  273. package/src/router/route.jsx +246 -0
  274. package/src/router/switch.jsx +76 -0
  275. package/src/router.jsx +23 -21
  276. package/src/{routes-native.mjs → routes-native.js} +12 -6
  277. package/src/{routes.mjs → routes.js} +1 -1
  278. package/src/run-last.js +39 -0
  279. package/src/{serializer.mjs → serializer.js} +2 -2
  280. package/src/{services.mjs → services.js} +1 -1
  281. package/src/session-status-updater.js +172 -0
  282. package/src/{source-maps-loader.mjs → source-maps-loader.js} +54 -28
  283. package/src/super-admin/config-reader.jsx +93 -0
  284. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +81 -0
  285. package/src/super-admin/edit-page/edit-attribute-content.jsx +57 -0
  286. package/src/super-admin/edit-page/edit-attribute-input.jsx +71 -0
  287. package/src/super-admin/edit-page/edit-attribute.jsx +81 -0
  288. package/src/super-admin/edit-page.jsx +117 -0
  289. package/src/super-admin/has-edit-config.js +15 -0
  290. package/src/super-admin/index-page.jsx +23 -0
  291. package/src/super-admin/index.jsx +197 -0
  292. package/src/super-admin/layout/header/index.jsx +144 -0
  293. package/src/super-admin/layout/header/style.scss +45 -0
  294. package/src/super-admin/layout/index.jsx +154 -0
  295. package/src/super-admin/layout/menu/index.jsx +171 -0
  296. package/src/super-admin/layout/menu/menu-content.jsx +43 -0
  297. package/src/super-admin/layout/menu/menu-item.jsx +70 -0
  298. package/src/super-admin/layout/menu/style.scss +11 -0
  299. package/src/super-admin/layout/no-access.jsx +26 -0
  300. package/src/super-admin/model-class-table.jsx +66 -0
  301. package/src/super-admin/models.js +11 -0
  302. package/src/super-admin/show-nav.jsx +44 -0
  303. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +30 -0
  304. package/src/super-admin/show-page/index.jsx +141 -0
  305. package/src/super-admin/show-reflection-actions.jsx +49 -0
  306. package/src/super-admin/show-reflection-link.jsx +40 -0
  307. package/src/super-admin/show-reflection-page.jsx +47 -0
  308. package/src/super-admin/stylesheets/variables.scss +11 -0
  309. package/src/table/column-content.jsx +122 -0
  310. package/src/table/column-identifier.js +23 -0
  311. package/src/table/column-visible.js +7 -0
  312. package/src/table/components/column.jsx +19 -0
  313. package/src/table/components/flat-list.jsx +19 -0
  314. package/src/table/components/header.jsx +21 -0
  315. package/src/table/components/row.jsx +23 -0
  316. package/src/table/filters/attribute-element.jsx +47 -0
  317. package/src/table/filters/filter-form.jsx +407 -0
  318. package/src/table/filters/filter.jsx +70 -0
  319. package/src/table/filters/index.jsx +170 -0
  320. package/src/table/filters/load-search-modal.jsx +146 -0
  321. package/src/table/filters/reflection-element.jsx +38 -0
  322. package/src/table/filters/save-search-modal.jsx +74 -0
  323. package/src/table/filters/scope-element.jsx +44 -0
  324. package/src/table/header-column-content.jsx +55 -0
  325. package/src/table/header-column.jsx +129 -0
  326. package/src/table/header-select.jsx +73 -0
  327. package/src/table/model-callback-args.js +10 -0
  328. package/src/table/model-column.jsx +82 -0
  329. package/src/table/model-row.jsx +136 -0
  330. package/src/table/select-calculator.js +65 -0
  331. package/src/table/settings/column-row.jsx +93 -0
  332. package/src/table/settings/download-action.jsx +68 -0
  333. package/src/table/settings/index.jsx +65 -0
  334. package/src/table/table-settings.js +263 -0
  335. package/src/table/table.jsx +950 -0
  336. package/src/table/use-sorting.js +35 -0
  337. package/src/table/variables.scss +11 -0
  338. package/src/table/widths.jsx +87 -0
  339. package/src/table/worker-plugins-check-all-checkbox.jsx +112 -0
  340. package/src/table/worker-plugins-checkbox.jsx +104 -0
  341. package/src/translated-attributes.js +11 -0
  342. package/src/{translated-collections.mjs → translated-collections.js} +3 -2
  343. package/src/updated-attribute.jsx +1 -1
  344. package/src/url-encode.js +18 -0
  345. package/src/use-breakpoint.js +76 -0
  346. package/src/use-can-can.js +55 -0
  347. package/src/use-collection.js +280 -0
  348. package/src/use-created-event.js +55 -0
  349. package/src/use-current-user.js +88 -0
  350. package/src/use-destroyed-event.js +60 -0
  351. package/src/use-event-emitter.js +15 -0
  352. package/src/use-event-listener.js +19 -0
  353. package/src/use-input.js +157 -0
  354. package/src/use-model-event.js +60 -0
  355. package/src/use-model.js +189 -0
  356. package/src/use-resize-observer.js +24 -0
  357. package/src/use-router.jsx +128 -0
  358. package/src/use-screen-layout.js +49 -0
  359. package/src/use-updated-event.js +60 -0
  360. package/src/use-validation-errors.js +33 -0
  361. package/src/utils/card.jsx +49 -0
  362. package/src/utils/checkbox.jsx +80 -0
  363. package/src/utils/checkboxes.jsx +158 -0
  364. package/src/utils/default-style.jsx +25 -0
  365. package/src/utils/icon.jsx +21 -0
  366. package/src/utils/invalid-feedback.jsx +20 -0
  367. package/src/utils/modal.jsx +60 -0
  368. package/src/utils/text.jsx +16 -0
  369. package/src/{validation-error.mjs → validation-error.js} +9 -5
  370. package/src/{validation-errors.mjs → validation-errors.js} +15 -27
  371. package/src/with-api-maker.jsx +31 -0
  372. package/src/with-collection.jsx +17 -0
  373. package/src/with-current-user.jsx +7 -25
  374. package/src/with-model.jsx +16 -0
  375. package/src/with-router.jsx +7 -129
  376. package/__tests__/base-model.test.js +0 -71
  377. package/__tests__/cable-connection-pool.test.js +0 -227
  378. package/__tests__/cable-subscription-pool.test.js +0 -26
  379. package/__tests__/can-can.test.js +0 -34
  380. package/__tests__/collection.test.js +0 -51
  381. package/__tests__/custom-error.test.js +0 -13
  382. package/__tests__/model-name.test.js +0 -34
  383. package/__tests__/model-prop-type.test.js +0 -113
  384. package/__tests__/params.test.js +0 -40
  385. package/__tests__/routes-native.test.js +0 -103
  386. package/__tests__/routes.test.js +0 -46
  387. package/__tests__/serializer.test.js +0 -30
  388. package/__tests__/support/task.js +0 -27
  389. package/__tests__/support/user.js +0 -32
  390. package/index.js +0 -1
  391. package/jest.config.js +0 -4
  392. package/src/can-can-loader.jsx +0 -54
  393. package/src/channels-consumer.mjs +0 -3
  394. package/src/destroy-error.mjs +0 -7
  395. package/src/devise.mjs +0 -122
  396. package/src/event-created.jsx +0 -65
  397. package/src/event-destroyed.jsx +0 -29
  398. package/src/event-listener.jsx +0 -38
  399. package/src/event-updated.jsx +0 -74
  400. package/src/logger.mjs +0 -25
  401. package/src/model-class-require.mjs +0 -10
  402. package/src/model-load-wrapper.jsx +0 -116
  403. package/src/result.mjs +0 -29
  404. package/src/session-status-updater.mjs +0 -116
  405. package/webpack.config.js +0 -15
  406. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  407. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  408. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  409. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  410. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
@@ -0,0 +1,66 @@
1
+ import BaseComponent from "../base-component"
2
+ import ConfigReader from "./config-reader"
3
+ import {digg} from "diggerize"
4
+ import hasEditConfig from "./has-edit-config"
5
+ import * as inflection from "inflection"
6
+ import memo from "set-state-compare/src/memo"
7
+ import Params from "../params"
8
+ import PropTypes from "prop-types"
9
+ import React, {useMemo} from "react"
10
+ import {shapeComponent} from "set-state-compare/src/shape-component"
11
+ import Table from "../table/table"
12
+ import useCurrentUser from "../use-current-user"
13
+
14
+ export default memo(shapeComponent(class ApiMakerSuperAdminModelClassTable extends BaseComponent {
15
+ static propTypes = {
16
+ modelClass: PropTypes.func.isRequired
17
+ }
18
+
19
+ render() {
20
+ const {modelClass, ...restProps} = this.props
21
+ const currentUser = useCurrentUser()
22
+ const configReader = useMemo(() => ConfigReader.forModel(modelClass), [modelClass])
23
+ const {columns, select} = useMemo(() => configReader.tableColumns(), [modelClass])
24
+ const tableConfig = configReader.modelConfig?.table
25
+ const tableProps = {}
26
+
27
+ if (!columns) throw new Error("No columns given")
28
+
29
+ if (tableConfig?.query) tableProps.collection = tableConfig.query
30
+
31
+ return (
32
+ <Table
33
+ columns={columns}
34
+ currentUser={currentUser}
35
+ editModelPath={hasEditConfig(modelClass) ? this.tt.editModelPath : undefined}
36
+ modelClass={modelClass}
37
+ select={select}
38
+ viewModelPath={this.tt.viewModelPath}
39
+ workplace
40
+ {...tableProps}
41
+ {...restProps}
42
+ />
43
+ )
44
+ }
45
+
46
+ editModelPath = (args) => {
47
+ const argName = inflection.camelize(digg(this.p.modelClass.modelClassData(), "name"), true)
48
+ const model = digg(args, argName)
49
+
50
+ return Params.withParams({
51
+ model: this.p.modelClass.modelClassData().name,
52
+ model_id: model.primaryKey(),
53
+ mode: "edit"
54
+ })
55
+ }
56
+
57
+ viewModelPath = (args) => {
58
+ const argName = inflection.camelize(digg(this.p.modelClass.modelClassData(), "name"), true)
59
+ const model = digg(args, argName)
60
+
61
+ return Params.withParams({
62
+ model: this.p.modelClass.modelClassData().name,
63
+ model_id: model.primaryKey()
64
+ })
65
+ }
66
+ }))
@@ -0,0 +1,11 @@
1
+ import * as models from "models"
2
+
3
+ const modelsAsArray = []
4
+
5
+ for (const modelKey of Object.keys(models)) {
6
+ const model = models[modelKey]
7
+
8
+ modelsAsArray.push(model)
9
+ }
10
+
11
+ export default modelsAsArray
@@ -0,0 +1,44 @@
1
+ import BaseComponent from "../base-component"
2
+ import Link from "../link"
3
+ import PropTypes from "prop-types"
4
+ import PropTypesExact from "prop-types-exact"
5
+ import memo from "set-state-compare/src/memo"
6
+ import Params from "../params"
7
+ import React from "react"
8
+ import {shapeComponent} from "set-state-compare/src/shape-component"
9
+ import ShowReflectionLink from "./show-reflection-link"
10
+ import Text from "../utils/text"
11
+ import useI18n from "i18n-on-steroids/src/use-i18n"
12
+ import useQueryParams from "on-location-changed/build/use-query-params"
13
+ import {View} from "react-native"
14
+
15
+ export default memo(shapeComponent(class ApiMakerSuperAdminShowNav extends BaseComponent {
16
+ static propTypes = PropTypesExact({
17
+ model: PropTypes.object.isRequired,
18
+ modelClass: PropTypes.func.isRequired
19
+ })
20
+
21
+ render() {
22
+ const {t} = useI18n({namespace: "js.api_maker.suprt_admin.show_reflection_page"})
23
+ const {model, modelClass} = this.props
24
+ const queryParams = useQueryParams()
25
+ const reflections = modelClass.reflections()
26
+
27
+ return (
28
+ <View dataSet={{component: "super-admin--show-nav"}}>
29
+ <View>
30
+ <Link to={Params.withParams({model: modelClass.modelClassData().name, model_id: queryParams.model_id})}>
31
+ <Text>
32
+ {t(".general", {defaultValue: "General"})}
33
+ </Text>
34
+ </Link>
35
+ </View>
36
+ {model && reflections.filter((reflection) => reflection.macro() == "has_many").map((reflection) =>
37
+ <View key={reflection.name()}>
38
+ <ShowReflectionLink model={model} modelClass={modelClass} reflection={reflection} />
39
+ </View>
40
+ )}
41
+ </View>
42
+ )
43
+ }
44
+ }))
@@ -0,0 +1,30 @@
1
+ import AttributeRow from "../../bootstrap/attribute-row"
2
+ import BaseComponent from "../../base-component"
3
+ import * as inflection from "inflection"
4
+ import Link from "../../link"
5
+ import memo from "set-state-compare/src/memo"
6
+ import Params from "../../params"
7
+ import React from "react"
8
+ import {shapeComponent} from "set-state-compare/src/shape-component"
9
+ import Text from "../../utils/text"
10
+
11
+ export default memo(shapeComponent(class ApiMakerSuperAdminShowPageBelongsToAttributeRow extends BaseComponent {
12
+ render() {
13
+ const {model, modelClass, reflection} = this.props
14
+ const reflectionMethodName = inflection.camelize(reflection.name(), true)
15
+ const subModel = model[reflectionMethodName]()
16
+
17
+ return (
18
+ <AttributeRow label={modelClass.humanAttributeName(inflection.camelize(reflection.name(), true))}>
19
+ {subModel &&
20
+ <Link to={Params.withParams({model: subModel.modelClassData().name, model_id: subModel.primaryKey()})}>
21
+ <Text>
22
+ {subModel && "name" in subModel && subModel.name()}
23
+ {subModel && !("name" in subModel) && subModel?.id()}
24
+ </Text>
25
+ </Link>
26
+ }
27
+ </AttributeRow>
28
+ )
29
+ }
30
+ }))
@@ -0,0 +1,141 @@
1
+ import React, {useMemo} from "react"
2
+ import AttributeRow from "../../bootstrap/attribute-row"
3
+ import BaseComponent from "../../base-component"
4
+ import BelongsToAttributeRow from "./belongs-to-attribute-row"
5
+ import ConfigReader from "../config-reader"
6
+ import {digg} from "diggerize"
7
+ import memo from "set-state-compare/src/memo"
8
+ import * as inflection from "inflection"
9
+ import PropTypes from "prop-types"
10
+ import {shapeComponent} from "set-state-compare/src/shape-component"
11
+ import ShowNav from "../show-nav"
12
+ import useModel from "../../use-model"
13
+ import {View} from "react-native"
14
+
15
+ const AttributePresenter = memo(({attribute, model, modelArgs}) => {
16
+ const attributeRowProps = {
17
+ model
18
+ }
19
+
20
+ if (typeof attribute == "object") {
21
+ if (attribute.attribute) attributeRowProps.attribute = attribute.attribute
22
+ if (attribute.content) attributeRowProps.children = attribute.content(modelArgs)
23
+ if (attribute.label) attributeRowProps.label = attribute.label
24
+ } else if (attribute) {
25
+ attributeRowProps.attribute = attribute
26
+ }
27
+
28
+ return (
29
+ <AttributeRow {...attributeRowProps} />
30
+ )
31
+ })
32
+
33
+ export default memo(shapeComponent(class ApiMakerSuperAdminShowPage extends BaseComponent {
34
+ static propTypes = {
35
+ modelClass: PropTypes.func.isRequired
36
+ }
37
+
38
+ setup() {
39
+ const {modelClass} = this.props
40
+ const configReader = useMemo(() => ConfigReader.forModel(modelClass), [modelClass])
41
+ const showConfig = configReader.modelConfig?.show
42
+
43
+ this.setInstance({configReader, showConfig})
44
+ }
45
+
46
+ render() {
47
+ const {modelClass} = this.props
48
+ const {configReader, showConfig} = this.tt
49
+ const attributes = configReader.attributesToShow()
50
+ const extraContent = showConfig?.extraContent
51
+ const modelClassName = modelClass.modelClassData().name
52
+ const primaryKeyName = modelClass.primaryKey()
53
+ const preload = []
54
+ const select = showConfig?.extraSelect || {}
55
+ const modelClassSelect = select[modelClassName] || []
56
+
57
+ if (showConfig?.preload) {
58
+ for (const showConfigPreload of showConfig.preload) {
59
+ preload.push(showConfigPreload)
60
+ }
61
+ }
62
+
63
+ if (!(modelClassName in select)) select[modelClassName] = modelClassSelect
64
+ if (!modelClassSelect.includes(primaryKeyName)) modelClassSelect.push(primaryKeyName)
65
+
66
+ // Select all attributes selected by default because they will be shown by default
67
+ for (const attribute of modelClass.attributes()) {
68
+ if ((attribute.isSelectedByDefault() || attribute.name() == "name") && !modelClassSelect.includes(attribute.name())) {
69
+ modelClassSelect.push(attribute.name())
70
+ }
71
+ }
72
+
73
+ for (const reflection of modelClass.reflections()) {
74
+ if (reflection.macro() == "belongs_to") {
75
+ const reflectionModelClass = reflection.modelClass()
76
+ const reflectionModelClassName = reflectionModelClass.modelClassData().name
77
+ const reflectionModelClassAttributes = reflectionModelClass.attributes()
78
+ const nameAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == "name")
79
+
80
+ preload.push(inflection.underscore(reflection.name()))
81
+
82
+ if (!(reflectionModelClassName in select)) select[reflectionModelClassName] = []
83
+ if (!select[reflectionModelClassName].includes("id")) select[reflectionModelClassName].push("id")
84
+ if (nameAttribute && !select[reflectionModelClassName].includes("name")) select[reflectionModelClassName].push("name")
85
+
86
+ // The foreign key is needed to look up any belongs-to-relationships
87
+ if (!modelClassSelect.includes(reflection.foreignKey())) {
88
+ const foreignKeyAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == reflection.foreignKey())
89
+
90
+ if (!foreignKeyAttribute) {
91
+ throw new Error(`${reflection.foreignKey()} wasn't defined as an attribute on ${modelClassName}`)
92
+ }
93
+
94
+ modelClassSelect.push(reflection.foreignKey())
95
+ }
96
+ } else if (reflection.macro() == "has_one") {
97
+ const reflectionModelClass = reflection.modelClass()
98
+ const reflectionModelClassName = reflectionModelClass.modelClassData().name
99
+ const reflectionModelClassAttributes = reflectionModelClass.attributes()
100
+ const nameAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == "name")
101
+
102
+ preload.push(inflection.underscore(reflection.name()))
103
+
104
+ if (!(reflectionModelClassName in select)) select[reflectionModelClassName] = []
105
+ if (!select[reflectionModelClassName].includes("id")) select[reflectionModelClassName].push("id")
106
+ if (nameAttribute && !select[reflectionModelClassName].includes("name")) select[reflectionModelClassName].push("name")
107
+
108
+ // The foreign key is needed to look up any has-one-relationships
109
+ if (!modelClassSelect.includes(reflection.foreignKey()) && !select[reflectionModelClassName].includes(reflection.foreignKey()) && !reflection.through()) {
110
+ select[reflectionModelClassName].push(reflection.foreignKey())
111
+ }
112
+ }
113
+ }
114
+
115
+ const useModelResult = useModel(modelClass, {
116
+ loadByQueryParam: ({queryParams}) => queryParams.model_id,
117
+ preload,
118
+ select
119
+ })
120
+ const camelizedLower = digg(modelClass.modelClassData(), "camelizedLower")
121
+ const model = digg(useModelResult, camelizedLower)
122
+ const modelArgs = {}
123
+
124
+ modelArgs[inflection.camelize(modelClass.modelClassData().name, true)] = model
125
+
126
+ return (
127
+ <View dataSet={{component: "super-admin--show-page"}}>
128
+ {model &&
129
+ <ShowNav model={model} modelClass={modelClass} />
130
+ }
131
+ {attributes && model && attributes.map((attribute) =>
132
+ <AttributePresenter attribute={attribute} key={attribute.key || attribute.attribute || attribute} modelArgs={modelArgs} model={model} />
133
+ )}
134
+ {model && modelClass.reflections().filter((reflection) => reflection.macro() == "belongs_to" || reflection.macro() == "has_one").map((reflection) =>
135
+ <BelongsToAttributeRow key={reflection.name()} model={model} modelClass={modelClass} reflection={reflection} />
136
+ )}
137
+ {model && extraContent && extraContent(modelArgs)}
138
+ </View>
139
+ )
140
+ }
141
+ }))
@@ -0,0 +1,49 @@
1
+ import BaseComponent from "../base-component"
2
+ import {digg} from "diggerize"
3
+ import memo from "set-state-compare/src/memo"
4
+ import React, {useMemo} from "react"
5
+ import PropTypes from "prop-types"
6
+ import propTypesExact from "prop-types-exact"
7
+ import {shapeComponent} from "set-state-compare/src/shape-component"
8
+
9
+ export default memo(shapeComponent(class SuperAdminShowReflectionActions extends BaseComponent {
10
+ static propTypes = propTypesExact({
11
+ model: PropTypes.object,
12
+ modelClass: PropTypes.func,
13
+ reflectionName: PropTypes.string
14
+ })
15
+
16
+ setup() {
17
+ const {modelClass, reflectionName} = this.p
18
+
19
+ this.reflection = useMemo(() => modelClass.reflections().find((reflection) => reflection.name() == reflectionName), [modelClass, reflectionName])
20
+ this.canCan = useCanCan(() => [[this.reflection.modelClass(), ["new"]]])
21
+ }
22
+
23
+ render() {
24
+ const {canCan, reflection} = this.tt
25
+ const {model} = this.p
26
+ const modelClassName = digg(reflection, "reflectionData", "className")
27
+ const modelData = {}
28
+ const dataParamName = inflection.singularize(reflection.reflectionData.collectionName)
29
+
30
+ modelData[reflection.foreignKey()] = model?.id()
31
+
32
+ const linkParams = {
33
+ model: modelClassName,
34
+ mode: "new"
35
+ }
36
+
37
+ linkParams[dataParamName] = modelData
38
+
39
+ return (
40
+ <>
41
+ {canCan?.can("new", reflection.modelClass()) &&
42
+ <Link dataSet={{class: "create-new-model-link"}} to={Params.withParams(linkParams)}>
43
+ Create new
44
+ </Link>
45
+ }
46
+ </>
47
+ )
48
+ }
49
+ }))
@@ -0,0 +1,40 @@
1
+ import BaseComponent from "../base-component"
2
+ import {digg} from "diggerize"
3
+ import Link from "../link"
4
+ import memo from "set-state-compare/src/memo"
5
+ import Params from "../params"
6
+ import React from "react"
7
+ import {shapeComponent} from "set-state-compare/src/shape-component"
8
+ import Text from "../utils/text"
9
+ import {useMemo} from "react"
10
+
11
+ export default memo(shapeComponent(class ApiMakerSuperAdminShowReflectionLink extends BaseComponent {
12
+ setup() {
13
+ this.useStates({count: undefined})
14
+
15
+ useMemo(() => {
16
+ this.countRelationship()
17
+ }, [])
18
+ }
19
+
20
+ countRelationship = async () => {
21
+ const {model, reflection} = this.p
22
+ const query = model[reflection.name()]()
23
+ const count = await query.ransack().count()
24
+
25
+ this.setState({count})
26
+ }
27
+
28
+ render() {
29
+ const {model, modelClass, reflection} = this.p
30
+ const {count} = this.s
31
+
32
+ return (
33
+ <Link to={Params.withParams({model: digg(modelClass.modelClassData(), "name"), model_id: model.primaryKey(), model_reflection: reflection.name()})}>
34
+ <Text>
35
+ {modelClass.humanAttributeName(reflection.name())} ({count})
36
+ </Text>
37
+ </Link>
38
+ )
39
+ }
40
+ }))
@@ -0,0 +1,47 @@
1
+ import BaseComponent from "../base-component"
2
+ import {digg} from "diggerize"
3
+ import PropTypes from "prop-types"
4
+ import propTypesExact from "prop-types-exact"
5
+ import memo from "set-state-compare/src/memo"
6
+ import ModelClassTable from "./model-class-table"
7
+ import React from "react"
8
+ import {shapeComponent} from "set-state-compare/src/shape-component"
9
+ import ShowNav from "./show-nav"
10
+ import useQueryParams from "on-location-changed/build/use-query-params"
11
+ import {View} from "react-native"
12
+
13
+ export default memo(shapeComponent(class ApiMakerSuperAdminShowReflectionPage extends BaseComponent {
14
+ static propTypes = propTypesExact({
15
+ modelClass: PropTypes.func.isRequired,
16
+ modelId: PropTypes.string.isRequired
17
+ })
18
+
19
+ render() {
20
+ const {modelClass} = this.p
21
+ const queryParams = useQueryParams()
22
+ const camelizedLower = digg(modelClass.modelClassData(), "camelizedLower")
23
+ const useModelResult = useModel(modelClass, {loadByQueryParam: ({queryParams}) => digg(queryParams, "model_id")})
24
+ const model = digg(useModelResult, camelizedLower)
25
+ const reflections = modelClass.reflections()
26
+ const reflection = reflections.find((reflectionI) => reflectionI.name() == queryParams.model_reflection)
27
+ const reflectionModelClass = reflection.modelClass()
28
+ let collection
29
+
30
+ if (model) collection = model[reflection.name()]()
31
+
32
+ return (
33
+ <View dataSet={{component: "super-admin--show-page"}}>
34
+ {model &&
35
+ <ShowNav model={model} modelClass={modelClass} />
36
+ }
37
+ {collection &&
38
+ <ModelClassTable
39
+ collection={collection}
40
+ key={reflectionModelClass.modelName().human()}
41
+ modelClass={reflectionModelClass}
42
+ />
43
+ }
44
+ </View>
45
+ )
46
+ }
47
+ }))
@@ -0,0 +1,11 @@
1
+ $xs-from: 0;
2
+ $xs-to: 575;
3
+ $sm-from: 576px;
4
+ $sm-to: 767px;
5
+ $md-from: 768px;
6
+ $md-to: 991px;
7
+ $lg-from: 992px;
8
+ $lg-to: 1199px;
9
+ $xl-from: 1200px;
10
+ $xl-to: 1399px;
11
+ $xxl-from: 1400px;
@@ -0,0 +1,122 @@
1
+ import {digs} from "diggerize"
2
+ import * as inflection from "inflection"
3
+ import modelCallbackArgs from "./model-callback-args"
4
+ import MoneyFormatter from "../money-formatter"
5
+ import React from "react"
6
+ import Text from "../utils/text"
7
+
8
+ export default class ApiMakerTableColumnContent {
9
+ constructor({column, l, mode = "react-native", model, t, table}) {
10
+ this.column = column
11
+ this.l = l
12
+ this.mode = mode
13
+ this.model = model
14
+ this.t = t
15
+ this.table = table
16
+ }
17
+
18
+ columnContentFromContentArg() {
19
+ const args = modelCallbackArgs(this.table, this.model)
20
+
21
+ args.mode = this.mode
22
+
23
+ const value = this.column.content(args)
24
+
25
+ return this.presentColumnValue(value)
26
+ }
27
+
28
+ columnsContentFromAttributeAndPath() {
29
+ const {attribute: attributeName} = digs(this.column, "attribute")
30
+ const attributeNameUnderscore = inflection.underscore(attributeName)
31
+ const path = this.column.path || []
32
+ let value
33
+ let currentModel = this.model
34
+
35
+ if (path.length > 0) {
36
+ for (const pathPart of path) {
37
+ currentModel = currentModel[pathPart]()
38
+ if (!currentModel) return
39
+ }
40
+ }
41
+
42
+ if (!(attributeName in currentModel)) {
43
+ throw new Error(`${currentModel.constructor.modelName().human()} doesn't respond to ${attributeName}`)
44
+ }
45
+
46
+ if (currentModel.isAttributeLoaded(attributeName)) {
47
+ value = currentModel[attributeName]()
48
+ }
49
+
50
+ const attribute = currentModel.constructor.attributes().find((attribute) => attribute.name() == attributeNameUnderscore)
51
+ const modelColumn = attribute?.getColumn()
52
+
53
+ if (modelColumn?.getType() == "date" && value) {
54
+ const contentText = this.presentDateTime({apiMakerType: "date", value})
55
+
56
+ if (this.mode == "html") {
57
+ return contentText
58
+ } else {
59
+ return (
60
+ <Text>{contentText}</Text>
61
+ )
62
+ }
63
+ }
64
+
65
+ return this.presentColumnValue(value)
66
+ }
67
+
68
+ content() {
69
+ if (this.column.content) {
70
+ return this.columnContentFromContentArg()
71
+ } else if (!this.column.content && this.column.attribute) {
72
+ return this.columnsContentFromAttributeAndPath()
73
+ }
74
+ }
75
+
76
+ presentColumnValue(value) {
77
+ let contentText
78
+
79
+ if (value instanceof Date) {
80
+ contentText = this.presentDateTime({value})
81
+ } else if (MoneyFormatter.isMoney(value)) {
82
+ contentText = MoneyFormatter.format(value)
83
+ } else if (typeof value == "boolean") {
84
+ if (value) {
85
+ contentText = this.t("js.shared.yes", {defaultValue: "Yes"})
86
+ } else {
87
+ contentText = this.t("js.shared.no", {defaultValue: "No"})
88
+ }
89
+ } else if (Array.isArray(value)) {
90
+ contentText = value
91
+ .map((valuePart) => this.presentColumnValue(valuePart))
92
+ .filter((valuePart) => Boolean(valuePart))
93
+ .join(", ")
94
+
95
+ } else if (typeof value == "string") {
96
+ contentText = value
97
+ } else {
98
+ // Its a React node - just return it and trust the provider to be HTML compatible.
99
+ return value
100
+ }
101
+
102
+ if (this.mode == "html") {
103
+ return contentText
104
+ }
105
+
106
+ return <Text>{contentText}</Text>
107
+ }
108
+
109
+ presentDateTime({apiMakerType, value}) {
110
+ if (!apiMakerType || apiMakerType == "time") {
111
+ const dateTimeFormatName = this.table.props.defaultDateTimeFormatName || "time.formats.default"
112
+
113
+ return this.l(dateTimeFormatName, value)
114
+ } else if (apiMakerType == "date") {
115
+ const dateFormatName = this.table.props.defaultDateFormatName || "date.formats.default"
116
+
117
+ return this.l(dateFormatName, value)
118
+ } else {
119
+ throw new Error(`Unhandled type: ${apiMakerType}`)
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,23 @@
1
+ export default function columnIdentifier(column) {
2
+ if ("identifier" in column) return column.identifier
3
+
4
+ const parts = []
5
+
6
+ if ("path" in column) {
7
+ for (const pathPart of column.path) {
8
+ parts.push(pathPart)
9
+ }
10
+ }
11
+
12
+ if ("attribute" in column) {
13
+ parts.push(`attribute-${column.attribute}`)
14
+ }
15
+
16
+ if ("sortKey" in column) {
17
+ parts.push(`sort-key-${column.sortKey}`)
18
+ }
19
+
20
+ if (parts.length == 0) throw new Error(`Couldn't figure out the identifier for that column: ${JSON.stringify(column)}`)
21
+
22
+ return parts.join("--")
23
+ }
@@ -0,0 +1,7 @@
1
+ export default function columnVisible(column, tableSettingColumn) {
2
+ if (tableSettingColumn.visible() !== null) return tableSettingColumn.visible()
3
+ if (!column) return false
4
+ if ("defaultVisible" in column) return column.defaultVisible
5
+
6
+ return true
7
+ }
@@ -0,0 +1,19 @@
1
+ import BaseComponent from "../../base-component"
2
+ import memo from "set-state-compare/src/memo"
3
+ import React from "react"
4
+ import {shapeComponent} from "set-state-compare/src/shape-component"
5
+ import {Animated, View} from "react-native"
6
+
7
+ export default memo(shapeComponent(class SharedTableColumn extends BaseComponent {
8
+ render() {
9
+ const {dataSet, ...restProps} = this.props
10
+ const actualDataSet = Object.assign(
11
+ {component: "api-maker/table/components/column"},
12
+ dataSet
13
+ )
14
+
15
+ return (
16
+ <Animated.View dataSet={actualDataSet} {...restProps} />
17
+ )
18
+ }
19
+ }))
@@ -0,0 +1,19 @@
1
+ import BaseComponent from "../../base-component"
2
+ import {FlatList} from "react-native"
3
+ import memo from "set-state-compare/src/memo"
4
+ import React from "react"
5
+ import {shapeComponent} from "set-state-compare/src/shape-component"
6
+
7
+ export default memo(shapeComponent(class SharedTagble extends BaseComponent {
8
+ render() {
9
+ const {style, ...restProps} = this.props
10
+ const actualStyle = Object.assign(
11
+ {width: "100%"},
12
+ style
13
+ )
14
+
15
+ return (
16
+ <FlatList style={actualStyle} {...restProps} />
17
+ )
18
+ }
19
+ }))
@@ -0,0 +1,21 @@
1
+ import BaseComponent from "../../base-component"
2
+ import classNames from "classnames"
3
+ import memo from "set-state-compare/src/memo"
4
+ import React from "react"
5
+ import {shapeComponent} from "set-state-compare/src/shape-component"
6
+ import {Animated} from "react-native"
7
+
8
+ export default memo(shapeComponent(class SharedTableHeader extends BaseComponent {
9
+ render() {
10
+ const {dataSet, ...restProps} = this.props
11
+ const {component, ...restDataSet} = dataSet || {}
12
+ const actualDataSet = Object.assign(
13
+ {component: classNames("api-maker/table/header", component)},
14
+ restDataSet
15
+ )
16
+
17
+ return (
18
+ <Animated.View dataSet={actualDataSet} {...restProps} />
19
+ )
20
+ }
21
+ }))