@kaspernj/api-maker 1.0.2011 → 1.0.2013

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 (413) 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/is-expo.js +22 -0
  72. package/build/key-value-store.js +53 -0
  73. package/build/link.js +73 -0
  74. package/build/logger.js +30 -0
  75. package/build/modal.js +38 -0
  76. package/build/model-class-require.js +13 -0
  77. package/build/model-events.js +30 -0
  78. package/build/model-name.js +28 -0
  79. package/build/model-prop-type.js +101 -0
  80. package/build/model-recipes-loader.js +32 -0
  81. package/build/model-recipes-model-loader.js +357 -0
  82. package/build/models-response-reader.js +40 -0
  83. package/build/models.js +8 -0
  84. package/build/money-formatter.js +78 -0
  85. package/build/not-loaded-error.js +2 -0
  86. package/build/params.js +61 -0
  87. package/build/preloaded.js +38 -0
  88. package/build/resize-observer.js +11 -0
  89. package/build/result.js +13 -0
  90. package/build/router/route.js +270 -0
  91. package/build/router/switch.js +72 -0
  92. package/build/router.js +59 -0
  93. package/build/routes-native.js +202 -0
  94. package/build/routes.js +50 -0
  95. package/build/run-last.js +35 -0
  96. package/build/serializer.js +63 -0
  97. package/build/services.js +20 -0
  98. package/build/session-status-updater.js +134 -0
  99. package/build/source-maps-loader.js +184 -0
  100. package/build/super-admin/config-reader.js +85 -0
  101. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  102. package/build/super-admin/edit-page/edit-attribute-content.js +55 -0
  103. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  104. package/build/super-admin/edit-page/edit-attribute.js +77 -0
  105. package/build/super-admin/edit-page.js +123 -0
  106. package/build/super-admin/has-edit-config.js +12 -0
  107. package/build/super-admin/index-page.js +25 -0
  108. package/build/super-admin/index.js +181 -0
  109. package/build/super-admin/layout/header/index.js +161 -0
  110. package/build/super-admin/layout/index.js +164 -0
  111. package/build/super-admin/layout/menu/index.js +206 -0
  112. package/build/super-admin/layout/menu/menu-content.js +46 -0
  113. package/build/super-admin/layout/menu/menu-item.js +84 -0
  114. package/build/super-admin/layout/no-access.js +27 -0
  115. package/build/super-admin/model-class-table.js +61 -0
  116. package/build/super-admin/models.js +8 -0
  117. package/build/super-admin/show-nav.js +51 -0
  118. package/build/super-admin/show-page/belongs-to-attribute-row.js +29 -0
  119. package/build/super-admin/show-page/index.js +141 -0
  120. package/build/super-admin/show-reflection-actions.js +47 -0
  121. package/build/super-admin/show-reflection-link.js +48 -0
  122. package/build/super-admin/show-reflection-page.js +48 -0
  123. package/build/table/column-content.js +117 -0
  124. package/build/table/column-identifier.js +18 -0
  125. package/build/table/column-visible.js +7 -0
  126. package/build/table/components/column.js +21 -0
  127. package/build/table/components/flat-list.js +21 -0
  128. package/build/table/components/header.js +26 -0
  129. package/build/table/components/row.js +26 -0
  130. package/build/table/filters/attribute-element.js +44 -0
  131. package/build/table/filters/filter-form.js +402 -0
  132. package/build/table/filters/filter.js +90 -0
  133. package/build/table/filters/index.js +184 -0
  134. package/build/table/filters/load-search-modal.js +175 -0
  135. package/build/table/filters/reflection-element.js +37 -0
  136. package/build/table/filters/save-search-modal.js +88 -0
  137. package/build/table/filters/scope-element.js +42 -0
  138. package/build/table/header-column-content.js +68 -0
  139. package/build/table/header-column.js +144 -0
  140. package/build/table/header-select.js +105 -0
  141. package/build/table/model-callback-args.js +10 -0
  142. package/build/table/model-column.js +97 -0
  143. package/build/table/model-row.js +193 -0
  144. package/build/table/select-calculator.js +63 -0
  145. package/build/table/settings/column-row.js +97 -0
  146. package/build/table/settings/download-action.js +79 -0
  147. package/build/table/settings/index.js +92 -0
  148. package/build/table/table-settings.js +219 -0
  149. package/build/table/table.js +972 -0
  150. package/build/table/use-sorting.js +34 -0
  151. package/build/table/widths.js +75 -0
  152. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  153. package/build/table/worker-plugins-checkbox.js +115 -0
  154. package/build/translated-attributes.js +10 -0
  155. package/build/translated-collections.js +12 -0
  156. package/build/updated-attribute.js +76 -0
  157. package/build/url-encode.js +15 -0
  158. package/build/use-breakpoint.js +71 -0
  159. package/build/use-can-can.js +55 -0
  160. package/build/use-collection.js +225 -0
  161. package/build/use-created-event.js +52 -0
  162. package/build/use-current-user.js +76 -0
  163. package/build/use-destroyed-event.js +60 -0
  164. package/build/use-event-emitter.js +13 -0
  165. package/build/use-event-listener.js +16 -0
  166. package/build/use-input.js +137 -0
  167. package/build/use-model-event.js +60 -0
  168. package/build/use-model.js +169 -0
  169. package/build/use-resize-observer.js +23 -0
  170. package/build/use-router.js +104 -0
  171. package/build/use-screen-layout.js +39 -0
  172. package/build/use-styles.js +41 -0
  173. package/build/use-updated-event.js +60 -0
  174. package/build/use-validation-errors.js +30 -0
  175. package/build/utils/card.js +51 -0
  176. package/build/utils/checkbox.js +78 -0
  177. package/build/utils/checkboxes.js +163 -0
  178. package/build/utils/default-style.js +18 -0
  179. package/build/utils/icon.js +23 -0
  180. package/build/utils/invalid-feedback.js +19 -0
  181. package/build/utils/modal.js +62 -0
  182. package/build/utils/text.js +44 -0
  183. package/build/validation-error.js +28 -0
  184. package/build/validation-errors.js +98 -0
  185. package/build/with-api-maker.js +29 -0
  186. package/build/with-collection.js +14 -0
  187. package/build/with-current-user.js +10 -0
  188. package/build/with-model.js +15 -0
  189. package/build/with-router.js +22 -0
  190. package/expo-module.config.json +17 -0
  191. package/ios/ApiMaker.podspec +29 -0
  192. package/ios/ApiMakerModule.swift +48 -0
  193. package/ios/ApiMakerView.swift +38 -0
  194. package/package.json +49 -46
  195. package/src/{api.mjs → api.js} +38 -37
  196. package/src/base-component.jsx +5 -0
  197. package/src/{base-error.mjs → base-error.js} +4 -6
  198. package/src/base-model/attribute.js +33 -0
  199. package/src/base-model/column.js +13 -0
  200. package/src/base-model/reflection.js +15 -0
  201. package/src/base-model/scope.js +12 -0
  202. package/src/{base-model.mjs → base-model.js} +302 -144
  203. package/src/bootstrap/attribute-row.jsx +135 -0
  204. package/src/bootstrap/attribute-rows.jsx +27 -0
  205. package/src/bootstrap/card.jsx +149 -0
  206. package/src/bootstrap/checkbox.jsx +86 -0
  207. package/src/bootstrap/checkboxes.jsx +185 -0
  208. package/src/bootstrap/index.js +0 -0
  209. package/src/bootstrap/input.jsx +173 -0
  210. package/src/bootstrap/invalid-feedback.jsx +31 -0
  211. package/src/bootstrap/paginate.jsx +187 -0
  212. package/src/bootstrap/radio-buttons.jsx +87 -0
  213. package/src/bootstrap/select.jsx +110 -0
  214. package/src/bootstrap/sort-link.jsx +106 -0
  215. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +16 -36
  216. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +26 -21
  217. package/src/{cable-subscription.mjs → cable-subscription.js} +6 -4
  218. package/src/cache-key-generator.js +100 -0
  219. package/src/{can-can.mjs → can-can.js} +13 -12
  220. package/src/channels-consumer.js +10 -0
  221. package/src/collection-loader.jsx +58 -224
  222. package/src/{collection.mjs → collection.js} +98 -44
  223. package/src/{command-submit-data.mjs → command-submit-data.js} +2 -7
  224. package/src/{commands-pool.mjs → commands-pool.js} +57 -41
  225. package/src/compose.js +11 -0
  226. package/src/{config.mjs → config.js} +6 -2
  227. package/src/{custom-error.mjs → custom-error.js} +1 -1
  228. package/src/data-set-to-attributes.js +13 -0
  229. package/src/{deserializer.mjs → deserializer.js} +3 -3
  230. package/src/destroy-error.js +7 -0
  231. package/src/devise.js +129 -0
  232. package/src/draggable-sort/controller.js +137 -0
  233. package/src/draggable-sort/index.jsx +108 -0
  234. package/src/draggable-sort/item.jsx +174 -0
  235. package/src/{error-logger.mjs → error-logger.js} +12 -7
  236. package/src/{error-messages.mjs → error-messages.js} +1 -0
  237. package/src/event-connection.jsx +1 -1
  238. package/src/event-emitter-listener.jsx +8 -27
  239. package/src/event-model-class.jsx +2 -4
  240. package/src/events.js +7 -0
  241. package/src/flash-message.js +70 -0
  242. package/src/form.jsx +91 -0
  243. package/src/history-expo.js +23 -0
  244. package/src/history-react-native.js +25 -0
  245. package/src/history.js +3 -0
  246. package/src/index.js +3 -0
  247. package/src/inputs/attachment.jsx +108 -0
  248. package/src/inputs/auto-submit.js +37 -0
  249. package/src/inputs/checkbox.jsx +125 -0
  250. package/src/inputs/checkboxes.jsx +116 -0
  251. package/src/inputs/id-for-component.js +15 -0
  252. package/src/inputs/input-wrapper.jsx +16 -0
  253. package/src/inputs/input.jsx +260 -0
  254. package/src/inputs/money.jsx +187 -0
  255. package/src/inputs/name-for-component.js +15 -0
  256. package/src/inputs/select.jsx +104 -0
  257. package/src/is-expo.js +18 -0
  258. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  259. package/src/link.jsx +54 -9
  260. package/src/logger.js +38 -0
  261. package/src/modal.jsx +37 -0
  262. package/src/model-class-require.js +17 -0
  263. package/src/{model-events.mjs → model-events.js} +1 -1
  264. package/src/{model-name.mjs → model-name.js} +8 -8
  265. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  266. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +5 -5
  267. package/src/{models-response-reader.mjs → models-response-reader.js} +3 -4
  268. package/src/models.js +7 -0
  269. package/src/{models.mjs.erb → models.js.erb} +6 -3
  270. package/src/{money-formatter.mjs → money-formatter.js} +5 -4
  271. package/src/{params.mjs → params.js} +17 -7
  272. package/src/{preloaded.mjs → preloaded.js} +2 -2
  273. package/src/resize-observer.jsx +10 -0
  274. package/src/result.js +13 -0
  275. package/src/router/route.jsx +246 -0
  276. package/src/router/switch.jsx +76 -0
  277. package/src/router.jsx +23 -21
  278. package/src/{routes-native.mjs → routes-native.js} +12 -6
  279. package/src/{routes.mjs → routes.js} +1 -1
  280. package/src/run-last.js +39 -0
  281. package/src/{serializer.mjs → serializer.js} +2 -2
  282. package/src/{services.mjs → services.js} +1 -1
  283. package/src/session-status-updater.js +172 -0
  284. package/src/{source-maps-loader.mjs → source-maps-loader.js} +54 -28
  285. package/src/super-admin/config-reader.jsx +93 -0
  286. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +81 -0
  287. package/src/super-admin/edit-page/edit-attribute-content.jsx +57 -0
  288. package/src/super-admin/edit-page/edit-attribute-input.jsx +71 -0
  289. package/src/super-admin/edit-page/edit-attribute.jsx +81 -0
  290. package/src/super-admin/edit-page.jsx +117 -0
  291. package/src/super-admin/has-edit-config.js +15 -0
  292. package/src/super-admin/index-page.jsx +23 -0
  293. package/src/super-admin/index.jsx +197 -0
  294. package/src/super-admin/layout/header/index.jsx +144 -0
  295. package/src/super-admin/layout/header/style.scss +45 -0
  296. package/src/super-admin/layout/index.jsx +154 -0
  297. package/src/super-admin/layout/menu/index.jsx +171 -0
  298. package/src/super-admin/layout/menu/menu-content.jsx +43 -0
  299. package/src/super-admin/layout/menu/menu-item.jsx +70 -0
  300. package/src/super-admin/layout/menu/style.scss +11 -0
  301. package/src/super-admin/layout/no-access.jsx +26 -0
  302. package/src/super-admin/model-class-table.jsx +66 -0
  303. package/src/super-admin/models.js +11 -0
  304. package/src/super-admin/show-nav.jsx +44 -0
  305. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +30 -0
  306. package/src/super-admin/show-page/index.jsx +141 -0
  307. package/src/super-admin/show-reflection-actions.jsx +49 -0
  308. package/src/super-admin/show-reflection-link.jsx +40 -0
  309. package/src/super-admin/show-reflection-page.jsx +47 -0
  310. package/src/super-admin/stylesheets/variables.scss +11 -0
  311. package/src/table/column-content.jsx +122 -0
  312. package/src/table/column-identifier.js +23 -0
  313. package/src/table/column-visible.js +7 -0
  314. package/src/table/components/column.jsx +19 -0
  315. package/src/table/components/flat-list.jsx +19 -0
  316. package/src/table/components/header.jsx +21 -0
  317. package/src/table/components/row.jsx +23 -0
  318. package/src/table/filters/attribute-element.jsx +47 -0
  319. package/src/table/filters/filter-form.jsx +407 -0
  320. package/src/table/filters/filter.jsx +70 -0
  321. package/src/table/filters/index.jsx +170 -0
  322. package/src/table/filters/load-search-modal.jsx +146 -0
  323. package/src/table/filters/reflection-element.jsx +38 -0
  324. package/src/table/filters/save-search-modal.jsx +74 -0
  325. package/src/table/filters/scope-element.jsx +44 -0
  326. package/src/table/header-column-content.jsx +55 -0
  327. package/src/table/header-column.jsx +129 -0
  328. package/src/table/header-select.jsx +73 -0
  329. package/src/table/model-callback-args.js +10 -0
  330. package/src/table/model-column.jsx +82 -0
  331. package/src/table/model-row.jsx +136 -0
  332. package/src/table/select-calculator.js +65 -0
  333. package/src/table/settings/column-row.jsx +93 -0
  334. package/src/table/settings/download-action.jsx +68 -0
  335. package/src/table/settings/index.jsx +65 -0
  336. package/src/table/table-settings.js +263 -0
  337. package/src/table/table.jsx +950 -0
  338. package/src/table/use-sorting.js +35 -0
  339. package/src/table/variables.scss +11 -0
  340. package/src/table/widths.jsx +87 -0
  341. package/src/table/worker-plugins-check-all-checkbox.jsx +112 -0
  342. package/src/table/worker-plugins-checkbox.jsx +104 -0
  343. package/src/translated-attributes.js +11 -0
  344. package/src/{translated-collections.mjs → translated-collections.js} +3 -2
  345. package/src/updated-attribute.jsx +1 -1
  346. package/src/url-encode.js +18 -0
  347. package/src/use-breakpoint.js +87 -0
  348. package/src/use-can-can.js +55 -0
  349. package/src/use-collection.js +280 -0
  350. package/src/use-created-event.js +55 -0
  351. package/src/use-current-user.js +88 -0
  352. package/src/use-destroyed-event.js +60 -0
  353. package/src/use-event-emitter.js +15 -0
  354. package/src/use-event-listener.js +19 -0
  355. package/src/use-input.js +157 -0
  356. package/src/use-model-event.js +60 -0
  357. package/src/use-model.js +189 -0
  358. package/src/use-resize-observer.js +24 -0
  359. package/src/use-router.jsx +128 -0
  360. package/src/use-screen-layout.js +49 -0
  361. package/src/use-styles.js +50 -0
  362. package/src/use-updated-event.js +60 -0
  363. package/src/use-validation-errors.js +33 -0
  364. package/src/utils/card.jsx +49 -0
  365. package/src/utils/checkbox.jsx +80 -0
  366. package/src/utils/checkboxes.jsx +158 -0
  367. package/src/utils/default-style.jsx +25 -0
  368. package/src/utils/icon.jsx +21 -0
  369. package/src/utils/invalid-feedback.jsx +20 -0
  370. package/src/utils/modal.jsx +60 -0
  371. package/src/utils/text.jsx +38 -0
  372. package/src/{validation-error.mjs → validation-error.js} +9 -5
  373. package/src/{validation-errors.mjs → validation-errors.js} +15 -27
  374. package/src/with-api-maker.jsx +31 -0
  375. package/src/with-collection.jsx +17 -0
  376. package/src/with-current-user.jsx +7 -25
  377. package/src/with-model.jsx +16 -0
  378. package/src/with-router.jsx +7 -129
  379. package/__tests__/base-model.test.js +0 -71
  380. package/__tests__/cable-connection-pool.test.js +0 -227
  381. package/__tests__/cable-subscription-pool.test.js +0 -26
  382. package/__tests__/can-can.test.js +0 -34
  383. package/__tests__/collection.test.js +0 -51
  384. package/__tests__/custom-error.test.js +0 -13
  385. package/__tests__/model-name.test.js +0 -34
  386. package/__tests__/model-prop-type.test.js +0 -113
  387. package/__tests__/params.test.js +0 -40
  388. package/__tests__/routes-native.test.js +0 -103
  389. package/__tests__/routes.test.js +0 -46
  390. package/__tests__/serializer.test.js +0 -30
  391. package/__tests__/support/task.js +0 -27
  392. package/__tests__/support/user.js +0 -32
  393. package/index.js +0 -1
  394. package/jest.config.js +0 -4
  395. package/src/can-can-loader.jsx +0 -54
  396. package/src/channels-consumer.mjs +0 -3
  397. package/src/destroy-error.mjs +0 -7
  398. package/src/devise.mjs +0 -122
  399. package/src/event-created.jsx +0 -65
  400. package/src/event-destroyed.jsx +0 -29
  401. package/src/event-listener.jsx +0 -38
  402. package/src/event-updated.jsx +0 -74
  403. package/src/logger.mjs +0 -25
  404. package/src/model-class-require.mjs +0 -10
  405. package/src/model-load-wrapper.jsx +0 -116
  406. package/src/result.mjs +0 -29
  407. package/src/session-status-updater.mjs +0 -116
  408. package/webpack.config.js +0 -15
  409. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  410. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  411. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  412. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  413. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
@@ -0,0 +1,81 @@
1
+ import React, {useMemo} from "react"
2
+ import {StyleSheet, View} from "react-native"
3
+ import Checkbox from "../../utils/checkbox"
4
+ import BaseComponent from "../../base-component"
5
+ import memo from "set-state-compare/src/memo"
6
+ import PropTypes from "prop-types"
7
+ import propTypesExact from "prop-types-exact"
8
+ import {shapeComponent} from "set-state-compare/src/shape-component"
9
+ import {useForm} from "../../form"
10
+
11
+ const styles = StyleSheet.create({
12
+ checkbox: {
13
+ marginRight: 4
14
+ }
15
+ })
16
+
17
+ export default memo(shapeComponent(class EditAttributeInput extends BaseComponent {
18
+ static propTypes = propTypesExact({
19
+ attributeName: PropTypes.string.isRequired,
20
+ id: PropTypes.string.isRequired,
21
+ label: PropTypes.string.isRequired,
22
+ model: PropTypes.object.isRequired,
23
+ name: PropTypes.string.isRequired
24
+ })
25
+
26
+ setup() {
27
+ const {attributeName, id, name} = this.p
28
+
29
+ this.form = useForm()
30
+ this.useStates({
31
+ checked: this.tt.defaultChecked
32
+ })
33
+
34
+ this.dataSet = useMemo(
35
+ () => ({
36
+ attribute: attributeName,
37
+ id,
38
+ name
39
+ }),
40
+ [attributeName, id, name]
41
+ )
42
+
43
+ useMemo(() => {
44
+ if (this.form) {
45
+ this.form.setValue(name, this.s.checked)
46
+ }
47
+ }, [])
48
+ }
49
+
50
+ defaultChecked = () => this.p.model[this.p.attributeName]() || false
51
+
52
+ render() {
53
+ const {dataSet} = this.tt
54
+ const {attributeName, label, model} = this.p
55
+ const {checked} = this.s
56
+
57
+ if (!(attributeName in model)) {
58
+ throw new Error(`${attributeName} isn't set on the resource ${model.modelClassData().name}`)
59
+ }
60
+
61
+ return (
62
+ <View dataSet={{component: "api-maker/super-admin/edit-page/edit-attribute-input"}} style={{flexDirection: "row", alignItems: "center"}}>
63
+ <Checkbox
64
+ checked={checked}
65
+ dataSet={dataSet}
66
+ label={label}
67
+ onCheckedChange={this.tt.onCheckedChange}
68
+ style={styles.checkbox}
69
+ />
70
+ </View>
71
+ )
72
+ }
73
+
74
+ onCheckedChange = (newChecked) => {
75
+ if (this.form) {
76
+ this.form.setValue(this.p.name, newChecked)
77
+ }
78
+
79
+ this.setState({checked: newChecked})
80
+ }
81
+ }))
@@ -0,0 +1,57 @@
1
+ import BaseComponent from "../../base-component"
2
+ import memo from "set-state-compare/src/memo"
3
+ import PropTypes from "prop-types"
4
+ import propTypesExact from "prop-types-exact"
5
+ import {shapeComponent} from "set-state-compare/src/shape-component"
6
+ import {useForm} from "../../form"
7
+ import {useMemo} from "react"
8
+
9
+ export default memo(shapeComponent(class EditAttributeContent extends BaseComponent {
10
+ static propTypes = propTypesExact({
11
+ attribute: PropTypes.object.isRequired,
12
+ id: PropTypes.string.isRequired,
13
+ model: PropTypes.object.isRequired,
14
+ name: PropTypes.string.isRequired
15
+ })
16
+
17
+ setup() {
18
+ this.form = useForm()
19
+ this.useStates({
20
+ value: () => this.defaultValue()
21
+ })
22
+ }
23
+
24
+ render() {
25
+ const {attribute, id, model} = this.props
26
+
27
+ if (!(attribute.attribute in model)) {
28
+ throw new Error(`${attribute.attribute} isn't set on the resource ${model.modelClassData().name}`)
29
+ }
30
+
31
+ const contentArgs = useMemo(() => ({
32
+ inputProps: {
33
+ attribute: attribute.attribute,
34
+ defaultValue: this.defaultValue(),
35
+ id,
36
+ model
37
+ },
38
+ onChangeValue: this.tt.onChangeValue,
39
+ value: this.s.value
40
+ }), [attribute.attribute, id, model, this.s.value])
41
+
42
+ return attribute.content(contentArgs)
43
+ }
44
+
45
+ defaultValue = () => {
46
+ if (!(this.p.attribute.attribute in this.p.model)) {
47
+ throw new Error(`No attribute called ${this.p.attribute.attribute} in model ${this.p.model.modelClassData().name}`)
48
+ }
49
+
50
+ return this.p.model[this.p.attribute.attribute]() || ""
51
+ }
52
+
53
+ onChangeValue = (newValue) => {
54
+ this.setState({value: newValue})
55
+ this.tt.form.setValue(this.p.name, newValue)
56
+ }
57
+ }))
@@ -0,0 +1,71 @@
1
+ import React, {useMemo} from "react"
2
+ import {TextInput, View} from "react-native"
3
+ import BaseComponent from "../../base-component"
4
+ import memo from "set-state-compare/src/memo"
5
+ import PropTypes from "prop-types"
6
+ import propTypesExact from "prop-types-exact"
7
+ import {shapeComponent} from "set-state-compare/src/shape-component"
8
+ import Text from "../../utils/text"
9
+ import {useForm} from "../../form"
10
+
11
+ export default memo(shapeComponent(class EditAttributeInput extends BaseComponent {
12
+ static propTypes = propTypesExact({
13
+ attributeName: PropTypes.string.isRequired,
14
+ id: PropTypes.string.isRequired,
15
+ label: PropTypes.string.isRequired,
16
+ model: PropTypes.object.isRequired,
17
+ name: PropTypes.string.isRequired
18
+ })
19
+
20
+ setup() {
21
+ const {name} = this.p
22
+
23
+ this.form = useForm()
24
+ this.useStates({
25
+ value: this.defaultValue()
26
+ })
27
+
28
+ useMemo(() => {
29
+ if (this.form) {
30
+ this.form.setValue(name, this.s.value)
31
+ }
32
+ }, [])
33
+ }
34
+
35
+ defaultValue = () => this.p.model[this.p.attributeName]() || ""
36
+
37
+ render() {
38
+ const {attributeName, id, label, model, name} = this.p
39
+ const {value} = this.s
40
+
41
+ if (!(attributeName in model)) {
42
+ throw new Error(`${attributeName} isn't set on the resource ${model.modelClassData().name}`)
43
+ }
44
+
45
+ return (
46
+ <View dataSet={{component: "api-maker/super-admin/edit-page/edit-attribute-input"}}>
47
+ <Text>{label}</Text>
48
+ <View>
49
+ <TextInput
50
+ dataSet={{
51
+ attribute: attributeName,
52
+ id,
53
+ name
54
+ }}
55
+ onChangeText={this.tt.onChangeText}
56
+ style={{paddingTop: 9, paddingRight: 13, paddingBottom: 9, paddingLeft: 13, borderRadius: 5, backgroundColor: "#fff", border: "1px solid #cecece"}}
57
+ value={value}
58
+ />
59
+ </View>
60
+ </View>
61
+ )
62
+ }
63
+
64
+ onChangeText = (newValue) => {
65
+ if (this.form) {
66
+ this.form.setValue(this.p.name, newValue)
67
+ }
68
+
69
+ this.setState({value: newValue})
70
+ }
71
+ }))
@@ -0,0 +1,81 @@
1
+ import BaseComponent from "../../base-component"
2
+ import {digg} from "diggerize"
3
+ import EditAttributeCheckbox from "./edit-attribute-checkbox"
4
+ import EditAttributeContent from "./edit-attribute-content"
5
+ import EditAttributeInput from "./edit-attribute-input"
6
+ import * as inflection from "inflection"
7
+ import Locales from "shared/locales"
8
+ import memo from "set-state-compare/src/memo"
9
+ import PropTypes from "prop-types"
10
+ import propTypesExact from "prop-types-exact"
11
+ import React from "react"
12
+ import {View} from "react-native"
13
+ import {shapeComponent} from "set-state-compare/src/shape-component"
14
+
15
+ export default memo(shapeComponent(class EditAttribute extends BaseComponent {
16
+ static propTypes = propTypesExact({
17
+ attribute: PropTypes.object.isRequired,
18
+ model: PropTypes.object,
19
+ modelClass: PropTypes.func
20
+ })
21
+
22
+ render() {
23
+ const {attribute, model, modelClass} = this.props
24
+ const availableLocales = Locales.availableLocales()
25
+ const camelizedLower = digg(modelClass.modelClassData(), "camelizedLower")
26
+ const modelAttribute = modelClass.attributes().find((modelAttributeI) => modelAttributeI.name() == attribute.attribute)
27
+
28
+ return (
29
+ <View dataSet={{component: "api-maker/super-admin/edit-page/edit-attribute"}} style={{marginBottom: attribute.translated ? undefined : 12}}>
30
+ {(() => {
31
+ if (attribute.content) {
32
+ return (
33
+ <EditAttributeContent
34
+ attribute={attribute}
35
+ id={`${inflection.underscore(camelizedLower)}_${inflection.underscore(attribute.attribute)}`}
36
+ model={model}
37
+ name={inflection.underscore(attribute.attribute)}
38
+ />
39
+ )
40
+ } else if (attribute.translated) {
41
+ return (
42
+ <>
43
+ {availableLocales.map((locale) =>
44
+ <View key={locale} style={{marginBottom: 12}}>
45
+ <EditAttributeInput
46
+ attributeName={`${attribute.attribute}${inflection.camelize(locale)}`}
47
+ id={`${inflection.underscore(camelizedLower)}_${inflection.underscore(attribute.attribute)}_${locale}`}
48
+ label={`${modelClass.humanAttributeName(attribute.attribute)} (${locale})`}
49
+ model={model}
50
+ name={`${inflection.underscore(attribute.attribute)}_${locale}`}
51
+ />
52
+ </View>
53
+ )}
54
+ </>
55
+ )
56
+ } else if (modelAttribute?.getColumn()?.getType() == "boolean") {
57
+ return (
58
+ <EditAttributeCheckbox
59
+ attributeName={attribute.attribute}
60
+ id={`${inflection.underscore(camelizedLower)}_${inflection.underscore(attribute.attribute)}`}
61
+ label={modelClass.humanAttributeName(attribute.attribute)}
62
+ model={model}
63
+ name={inflection.underscore(attribute.attribute)}
64
+ />
65
+ )
66
+ } else {
67
+ return (
68
+ <EditAttributeInput
69
+ attributeName={attribute.attribute}
70
+ id={`${inflection.underscore(camelizedLower)}_${inflection.underscore(attribute.attribute)}`}
71
+ label={modelClass.humanAttributeName(attribute.attribute)}
72
+ model={model}
73
+ name={inflection.underscore(attribute.attribute)}
74
+ />
75
+ )
76
+ }
77
+ })()}
78
+ </View>
79
+ )
80
+ }
81
+ }))
@@ -0,0 +1,117 @@
1
+ import {Pressable, View} from "react-native"
2
+ import BaseComponent from "../base-component"
3
+ import ConfigReader from "./config-reader"
4
+ import {digg} from "diggerize"
5
+ import EditAttribute from "./edit-page/edit-attribute"
6
+ import FlashMessage from "../flash-message"
7
+ import {Form} from "../form"
8
+ import * as inflection from "inflection"
9
+ import Locales from "shared/locales"
10
+ import memo from "set-state-compare/src/memo"
11
+ import Params from "../params"
12
+ import PropTypes from "prop-types"
13
+ import propTypesExact from "prop-types-exact"
14
+ import React from "react"
15
+ import {shapeComponent} from "set-state-compare/src/shape-component"
16
+ import Text from "../utils/text"
17
+ import useCurrentUser from "../use-current-user"
18
+ import useModel from "../use-model"
19
+ import useQueryParams from "on-location-changed/build/use-query-params"
20
+
21
+ export default memo(shapeComponent(class ApiMakerSuperAdminEditPage extends BaseComponent {
22
+ static propTypes = propTypesExact({
23
+ modelClass: PropTypes.func.isRequired
24
+ })
25
+
26
+ setup() {
27
+ const {modelClass} = this.p
28
+ const modelClassName = modelClass.modelClassData().name
29
+ const availableLocales = Locales.availableLocales()
30
+ this.configReader = ConfigReader.forModel(modelClass)
31
+ const currentUser = useCurrentUser()
32
+ const queryParams = useQueryParams()
33
+ const selectedModelAttributes = ["id"]
34
+ const selectedAttributes = {}
35
+ this.attributes = this.configReader.modelConfig?.edit?.attributes
36
+
37
+ if (!this.attributes) {
38
+ throw new Error(`No 'attributes' given from edit config for ${modelClass.modelClassData().name}`)
39
+ }
40
+
41
+ for (const attribute of this.attributes) {
42
+ if (attribute.translated) {
43
+ for (const locale of availableLocales) {
44
+ selectedModelAttributes.push(`${attribute.attribute}${inflection.camelize(locale)}`)
45
+ }
46
+ } else {
47
+ selectedModelAttributes.push(attribute.attribute)
48
+ }
49
+ }
50
+
51
+ selectedAttributes[modelClassName] = selectedModelAttributes
52
+
53
+ const useModelResult = useModel(modelClass, {
54
+ cacheArgs: [currentUser?.id()],
55
+ loadByQueryParam: (props) => props.queryParams.model_id,
56
+ newIfNoId: this.configReader.modelConfig?.edit?.newIfNoId || true,
57
+ preload: this.configReader.modelConfig?.edit?.preload,
58
+ select: selectedAttributes
59
+ })
60
+
61
+ const modelIdVarName = `${inflection.camelize(modelClass.modelClassData().name, true)}Id`
62
+ const modelVarName = inflection.camelize(modelClass.modelClassData().name, true)
63
+
64
+ this.model = digg(useModelResult, modelVarName)
65
+ this.modelId = queryParams.model_id
66
+ this.modelArgs = {}
67
+ this.modelArgs[modelIdVarName] = this.modelId
68
+ this.useStates({form: null})
69
+ }
70
+
71
+ render() {
72
+ const {attributes, model} = this.tt
73
+ const {modelClass} = this.p
74
+ const extraContent = this.configReader.modelConfig?.edit?.extraContentconst
75
+
76
+ return (
77
+ <View dataSet={{class: "super-admin--edit-page"}}>
78
+ <Form setForm={this.setStates.form}>
79
+ {model && attributes?.map((attribute) =>
80
+ <EditAttribute attribute={attribute} key={attribute.attribute} model={model} modelClass={modelClass} />
81
+ )}
82
+ {extraContent && extraContent(modelArgs)}
83
+ <Pressable
84
+ dataSet={{class: "submit-button"}}
85
+ onPress={this.tt.onSubmit}
86
+ style={{
87
+ paddingTop: 18,
88
+ paddingRight: 24,
89
+ paddingBottom: 18,
90
+ paddingLeft: 24,
91
+ borderRadius: 10,
92
+ backgroundColor: "#4c93ff",
93
+ marginTop: 10
94
+ }}
95
+ >
96
+ <Text style={{color: "#fff"}}>
97
+ Submit
98
+ </Text>
99
+ </Pressable>
100
+ </Form>
101
+ </View>
102
+ )
103
+ }
104
+
105
+ onSubmit = async () => {
106
+ try {
107
+ const {model} = this.tt
108
+ const formObject = this.s.form.asObject()
109
+
110
+ model.assignAttributes(formObject)
111
+ await model.save()
112
+ Params.changeParams({mode: undefined, model_id: model.id()})
113
+ } catch (error) {
114
+ FlashMessage.errorResponse(error)
115
+ }
116
+ }
117
+ }))
@@ -0,0 +1,15 @@
1
+ import ConfigReader from "./config-reader"
2
+
3
+ const hasEditConfig = (modelClass) => {
4
+ const configReader = ConfigReader.forModel(modelClass)
5
+ const extraContent = configReader.modelConfig?.edit?.extraContentconst
6
+ const attributes = configReader.modelConfig?.edit?.attributes
7
+
8
+ if (attributes || extraContent) {
9
+ return true
10
+ }
11
+
12
+ return false
13
+ }
14
+
15
+ export default hasEditConfig
@@ -0,0 +1,23 @@
1
+ import BaseComponent from "../base-component"
2
+ import memo from "set-state-compare/src/memo"
3
+ import ModelClassTable from "./model-class-table"
4
+ import PropTypes from "prop-types"
5
+ import React from "react"
6
+ import {shapeComponent} from "set-state-compare/src/shape-component"
7
+ import {View} from "react-native"
8
+
9
+ export default memo(shapeComponent(class ApiMakerSuperAdminIndexPage extends BaseComponent {
10
+ static propTypes = {
11
+ modelClass: PropTypes.func.isRequired
12
+ }
13
+
14
+ render() {
15
+ const {modelClass} = this.props
16
+
17
+ return (
18
+ <View dataSet={{component: "super-admin--index-page"}}>
19
+ <ModelClassTable modelClass={modelClass} />
20
+ </View>
21
+ )
22
+ }
23
+ }))
@@ -0,0 +1,197 @@
1
+ import React, {useMemo} from "react"
2
+ import {Pressable, View} from "react-native"
3
+ import BaseComponent from "../base-component"
4
+ import ConfigReader from "./config-reader"
5
+ import EditPage from "./edit-page"
6
+ import hasEditConfig from "./has-edit-config"
7
+ import IndexPage from "./index-page"
8
+ import Layout from "./layout/index"
9
+ import Link from "../link"
10
+ import memo from "set-state-compare/src/memo"
11
+ import * as models from "models"
12
+ import Params from "../params"
13
+ import {shapeComponent} from "set-state-compare/src/shape-component"
14
+ import ShowPage from "./show-page/index"
15
+ import ShowReflectionActions from "./show-reflection-actions"
16
+ import ShowReflectionPage from "./show-reflection-page"
17
+ import Text from "../utils/text"
18
+ import useCanCan from "../use-can-can"
19
+ import useCurrentUser from "../use-current-user"
20
+ import useQueryParams from "on-location-changed/build/use-query-params"
21
+
22
+ export default memo(shapeComponent(class ApiMakerSuperAdmin extends BaseComponent {
23
+ setup() {
24
+ this.queryParams = useQueryParams()
25
+
26
+ if (this.queryParams.model) {
27
+ this.modelClass = models[this.queryParams.model]
28
+ } else {
29
+ this.modelClass = null
30
+ }
31
+
32
+ this.configReader = useMemo(() => this.modelClass && ConfigReader.forModel(this.modelClass), [this.modelClass])
33
+ this.modelId = this.queryParams.model_id
34
+ this.modelName = this.modelClass?.modelClassData()?.name
35
+ this.currentUser = useCurrentUser()
36
+
37
+ this.canCan = useCanCan(
38
+ () => {
39
+ const abilities = []
40
+
41
+ if (this.modelClass) abilities.push([this.modelClass, ["new"]])
42
+
43
+ return abilities
44
+ },
45
+ [this.currentUser?.id(), this.modelClass]
46
+ )
47
+
48
+ this.useStates({
49
+ model: undefined
50
+ })
51
+ useMemo(
52
+ () => { this.loadModel() },
53
+ [this.modelId]
54
+ )
55
+ }
56
+
57
+ loadModel = async () => {
58
+ const {configReader, modelClass, modelId, modelName} = this.tt
59
+
60
+ if (modelId && modelClass) {
61
+ const abilities = {}
62
+ const abilitiesForModel = ["destroy", "edit"]
63
+ const layoutSelect = configReader?.modelConfig?.layout?.select
64
+
65
+ abilities[modelName] = abilitiesForModel
66
+
67
+ const query = await modelClass
68
+ .ransack({id_eq: modelId})
69
+ .abilities(abilities)
70
+
71
+ if (layoutSelect) query.select(layoutSelect)
72
+
73
+ const model = await query.first()
74
+
75
+ this.setState({model})
76
+ } else {
77
+ this.setState({model: undefined})
78
+ }
79
+ }
80
+
81
+ render() {
82
+ const {canCan, configReader, modelClass, modelId, modelName, queryParams} = this.tt
83
+ const {model} = this.s
84
+ const modelConfigActions = configReader?.modelConfig?.actions
85
+ let pageToShow
86
+
87
+ if (queryParams.model && queryParams.model_id && queryParams.model_reflection) {
88
+ pageToShow = "show_reflection"
89
+ } else if (queryParams.model && queryParams.model_id && queryParams.mode == "edit") {
90
+ pageToShow = "edit"
91
+ } else if (queryParams.model && queryParams.model_id) {
92
+ pageToShow = "show"
93
+ } else if (queryParams.model && queryParams.mode == "new") {
94
+ pageToShow = "edit"
95
+ } else if (queryParams.model) {
96
+ pageToShow = "index"
97
+ } else {
98
+ pageToShow = "welcome"
99
+ }
100
+
101
+ const actions = useMemo(
102
+ () => <View style={{flexDirection: "row", alignItems: "center"}}>
103
+ {model && modelConfigActions && modelConfigActions({model})}
104
+ {modelClass && pageToShow == "index" &&
105
+ <>
106
+ {canCan?.can("new", modelClass) && hasEditConfig(modelClass) &&
107
+ <Link
108
+ dataSet={{class: "create-new-model-link"}}
109
+ style={{marginLeft: 10, marginRight: 10}}
110
+ to={Params.withParams({model: modelName, mode: "new"})}
111
+ >
112
+ <Text>
113
+ Create new
114
+ </Text>
115
+ </Link>
116
+ }
117
+ </>
118
+ }
119
+ {model && pageToShow == "show" &&
120
+ <>
121
+ {model.can("edit") && hasEditConfig(modelClass) &&
122
+ <Link
123
+ dataSet={{class: "edit-model-link"}}
124
+ style={{marginLeft: 10, marginRight: 10}}
125
+ to={Params.withParams({model: modelName, model_id: modelId, mode: "edit"})}
126
+ >
127
+ <Text>
128
+ Edit
129
+ </Text>
130
+ </Link>
131
+ }
132
+ {model.can("destroy") &&
133
+ <Pressable
134
+ dataSet={{class: "destroy-model-link"}}
135
+ onPress={this.tt.onDestroyClicked}
136
+ style={{marginLeft: 10, marginRight: 10}}
137
+ >
138
+ <Text>
139
+ Delete
140
+ </Text>
141
+ </Pressable>
142
+ }
143
+ </>
144
+ }
145
+ {pageToShow == "show_reflection" &&
146
+ <ShowReflectionActions model={model} modelClass={modelClass} reflectionName={queryParams.model_reflection} />
147
+ }
148
+ </View>,
149
+ [canCan, configReader?.actions, model, modelClass, pageToShow]
150
+ )
151
+
152
+ return (
153
+ <Layout actions={actions} active={queryParams.model} headerTitle={modelClass?.modelName()?.human({count: 2})}>
154
+ {pageToShow == "index" &&
155
+ <IndexPage
156
+ key={`index-page-${modelName}`}
157
+ modelClass={modelClass}
158
+ />
159
+ }
160
+ {pageToShow == "show" &&
161
+ <ShowPage
162
+ key={`show-page-${modelName}-${modelId}`}
163
+ modelClass={modelClass}
164
+ modelId={modelId}
165
+ />
166
+ }
167
+ {pageToShow == "show_reflection" &&
168
+ <ShowReflectionPage
169
+ key={`show-reflection-page-${modelName}-${modelId}`}
170
+ modelClass={modelClass}
171
+ modelId={modelId}
172
+ />
173
+ }
174
+ {pageToShow == "edit" &&
175
+ <EditPage
176
+ key={`edit-page-${modelName}-${modelId}`}
177
+ modelClass={modelClass}
178
+ />
179
+ }
180
+ </Layout>
181
+ )
182
+ }
183
+
184
+ onDestroyClicked = async () => {
185
+ if (!confirm("Are you sure?")) {
186
+ return
187
+ }
188
+
189
+ try {
190
+ await this.s.model.destroy()
191
+
192
+ Params.changeParams({mode: undefined, model_id: undefined})
193
+ } catch (error) {
194
+ FlashMessage.errorResponse(error)
195
+ }
196
+ }
197
+ }))