@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,35 @@
1
+ import {camelize} from "inflection"
2
+ import useQueryParams from "on-location-changed/build/use-query-params"
3
+
4
+ const calculateQParams = (defaultParams, queryParams, searchKey) => {
5
+ if (searchKey in queryParams) {
6
+ return JSON.parse(queryParams[searchKey])
7
+ } else if (defaultParams) {
8
+ return {...defaultParams}
9
+ }
10
+
11
+ return {}
12
+ }
13
+
14
+ const useSorting = ({defaultParams, query}) => {
15
+ const queryParams = useQueryParams()
16
+ const searchKey = query.queryArgs.searchKey || "q"
17
+ const qParams = calculateQParams(defaultParams, queryParams, searchKey)
18
+ let matchSortParam
19
+
20
+ if (typeof qParams.s == "string") {
21
+ matchSortParam = qParams.s?.match(/^(.+?)( asc| desc|)$/)
22
+ }
23
+
24
+ const sortAttribute = matchSortParam ? camelize(matchSortParam[1], true) : null
25
+ const sortMode = matchSortParam ? matchSortParam[2].trim() : null
26
+
27
+ return {
28
+ qParams,
29
+ searchKey,
30
+ sortAttribute,
31
+ sortMode
32
+ }
33
+ }
34
+
35
+ export default useSorting
@@ -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,87 @@
1
+ import {Animated, Easing} from "react-native"
2
+ import {digg} from "diggerize"
3
+
4
+ export default class TableWidths {
5
+ constructor({columns, table, width}) {
6
+ this.columns = columns
7
+ this.tableWidth = width
8
+ this.table = table
9
+ this.setWidths()
10
+ }
11
+
12
+ setWidths() {
13
+ this.columnsWidths = {}
14
+
15
+ let widthLeft = this.tableWidth
16
+ const updateData = []
17
+
18
+ // Set widths that are defined
19
+ for (const columnIndex in this.columns) {
20
+ const column = this.columns[columnIndex]
21
+ const tableSettingColumn = column.tableSettingColumn
22
+
23
+ if (column.animatedPosition) throw new Error("Column already had an animated position")
24
+
25
+ column.animatedPosition = new Animated.ValueXY()
26
+ column.animatedZIndex = new Animated.Value(0)
27
+
28
+ if (tableSettingColumn.hasWidth()) {
29
+ if (column.animatedWidth) throw new Error("Column already had an animated width")
30
+
31
+ column.animatedWidth = new Animated.Value(tableSettingColumn.width())
32
+ column.width = tableSettingColumn.width()
33
+
34
+ widthLeft -= tableSettingColumn.width()
35
+ }
36
+ }
37
+
38
+ // Calculate how many columns are shown
39
+ const columnsWithoutWidth = this.columns.filter((column) => !column.tableSettingColumn.hasWidth())
40
+ let amountOfColumns = columnsWithoutWidth.length
41
+
42
+ amountOfColumns++ // Actions column
43
+
44
+ if (this.table.p.workplace) amountOfColumns++
45
+
46
+ // Set widths of columns without
47
+ for (const columnIndex in this.columns) {
48
+ const column = this.columns[columnIndex]
49
+ const tableSettingColumn = column.tableSettingColumn
50
+
51
+ if (!tableSettingColumn.hasWidth()) {
52
+ let newWidth = widthLeft / amountOfColumns
53
+
54
+ if (newWidth < 200) newWidth = 200
55
+
56
+ column.animatedWidth = new Animated.Value(newWidth)
57
+ column.width = newWidth
58
+
59
+ updateData << {
60
+ id: tableSettingColumn.id(),
61
+ width: newWidth
62
+ }
63
+ }
64
+ }
65
+
66
+ if (updateData.length > 0) {
67
+ // FIXME: Should update the columns on the backend if anything changed
68
+ }
69
+ }
70
+
71
+ getWidthOfColumn(identifier) {
72
+ const column = this.columns.find((column) => column.tableSettingColumn.identifier() == identifier)
73
+
74
+ if (!column) throw new Error(`No such column: ${identifier}`)
75
+
76
+ return digg(column, "width")
77
+ }
78
+
79
+ setWidthOfColumn({identifier, width}) {
80
+ const column = this.columns.find((column) => column.tableSettingColumn.identifier() == identifier)
81
+
82
+ if (!column) throw new Error(`No such column: ${identifier}`)
83
+
84
+ column.width = width
85
+ column.animatedWidth.setValue(width)
86
+ }
87
+ }
@@ -0,0 +1,112 @@
1
+ import React, {useEffect, useMemo, useRef} from "react"
2
+ import BaseComponent from "../base-component"
3
+ import classNames from "classnames"
4
+ import Collection from "../collection"
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 {simpleObjectDifferent} from "set-state-compare/src/diff-utils"
10
+ import useModelEvent from "../use-model-event"
11
+
12
+ const Checkbox = memo(shapeComponent(class Checkbox extends BaseComponent {
13
+ render() {
14
+ const {indeterminate, ...restProps} = this.props
15
+ const checkboxRef = useRef()
16
+
17
+ useEffect(() => {
18
+ checkboxRef.current.indeterminate = indeterminate
19
+ })
20
+
21
+ return (
22
+ <input ref={checkboxRef} type="checkbox" {...restProps} />
23
+ )
24
+ }
25
+ }))
26
+
27
+ export default memo(shapeComponent(class ApiMakerTableWorkerPluginsCheckAllCheckbox extends BaseComponent {
28
+ static propTypes = propTypesExact({
29
+ currentWorkplace: PropTypes.object,
30
+ query: PropTypes.instanceOf(Collection),
31
+ style: PropTypes.object
32
+ })
33
+
34
+ setup() {
35
+ this.useStates({
36
+ checked: false,
37
+ indeterminate: false
38
+ })
39
+
40
+ useMemo(() => {
41
+ this.updateAllChecked()
42
+ }, [])
43
+
44
+ useModelEvent(this.props.currentWorkplace, "workplace_links_created", this.tt.onLinksCreated)
45
+ useModelEvent(this.props.currentWorkplace, "workplace_links_destroyed", this.tt.onLinksDestroyed)
46
+ }
47
+
48
+ componentDidUpdate(prevProps) {
49
+ const previousParams = prevProps.query.params()
50
+ const currentParams = this.props.query.params()
51
+
52
+ if (simpleObjectDifferent(previousParams, currentParams)) {
53
+ this.updateAllChecked()
54
+ }
55
+ }
56
+
57
+ async updateAllChecked() {
58
+ const {query, currentWorkplace} = this.props
59
+ const queryLinksStatusResult = await currentWorkplace.queryLinksStatus({query})
60
+ const allChecked = queryLinksStatusResult.all_checked
61
+ const someChecked = queryLinksStatusResult.some_checked
62
+
63
+ this.setState({
64
+ checked: allChecked,
65
+ indeterminate: someChecked
66
+ })
67
+ }
68
+
69
+ render() {
70
+ const {className, style} = this.props
71
+ const {checked, indeterminate} = this.state
72
+
73
+ return (
74
+ <Checkbox
75
+ checked={checked}
76
+ className={classNames("api-maker--table--worker-plugins-check-all-checkbox", className)}
77
+ indeterminate={indeterminate}
78
+ onChange={this.onCheckedChanged}
79
+ style={style}
80
+ />
81
+ )
82
+ }
83
+
84
+ modelClassName = () => this.props.query.modelClass().modelClassData().name
85
+
86
+ onCheckedChanged = async (e) => {
87
+ e.preventDefault()
88
+
89
+ const {currentWorkplace, query} = this.props
90
+ const checkbox = e.target
91
+
92
+ if (checkbox.checked) {
93
+ await currentWorkplace.addQuery({query})
94
+ this.setState({checked: true, indeterminate: false})
95
+ } else {
96
+ await currentWorkplace.removeQuery({query})
97
+ this.setState({checked: false, indeterminate: false})
98
+ }
99
+ }
100
+
101
+ onLinksCreated = ({args}) => {
102
+ if (args.created[this.modelClassName()]) {
103
+ this.updateAllChecked()
104
+ }
105
+ }
106
+
107
+ onLinksDestroyed = ({args}) => {
108
+ if (args.destroyed[this.modelClassName()]) {
109
+ this.updateAllChecked()
110
+ }
111
+ }
112
+ }))
@@ -0,0 +1,104 @@
1
+ import React, {useMemo} from "react"
2
+ import BaseComponent from "../base-component"
3
+ import classNames from "classnames"
4
+ import {digg} from "diggerize"
5
+ import memo from "set-state-compare/src/memo"
6
+ import modelClassRequire from "../model-class-require"
7
+ import PropTypes from "prop-types"
8
+ import PropTypesExact from "prop-types-exact"
9
+ import {shapeComponent} from "set-state-compare/src/shape-component"
10
+ import useModelEvent from "../use-model-event"
11
+
12
+ const Workplace = modelClassRequire("Workplace")
13
+
14
+ export default memo(shapeComponent(class ApiMakerTableWorkerPluginsCheckbox extends BaseComponent {
15
+ static propTypes = PropTypesExact({
16
+ currentWorkplace: PropTypes.object,
17
+ model: PropTypes.object.isRequired,
18
+ style: PropTypes.object
19
+ })
20
+
21
+ setup() {
22
+ this.useStates({
23
+ checked: false,
24
+ linkLoaded: false
25
+ })
26
+
27
+ useMemo(() => {
28
+ this.loadCurrentLink()
29
+ }, [])
30
+
31
+ useModelEvent(this.p.currentWorkplace, "workplace_links_created", this.tt.onLinksCreated)
32
+ useModelEvent(this.p.currentWorkplace, "workplace_links_destroyed", this.tt.onLinksDestroyed)
33
+ }
34
+
35
+ async loadCurrentLink() {
36
+ const {model} = this.props
37
+ const response = await Workplace.linkFor({model_class: model.modelClassData().name, model_id: model.id()})
38
+ const link = digg(response, "link")
39
+
40
+ this.setState({
41
+ checked: Boolean(link),
42
+ linkLoaded: true
43
+ })
44
+ }
45
+
46
+ render() {
47
+ const {className, model, style} = this.props
48
+ const {checked, linkLoaded} = this.state
49
+
50
+ if (!linkLoaded) {
51
+ return null
52
+ }
53
+
54
+ return (
55
+ <input
56
+ checked={checked}
57
+ className={classNames("api-maker--table--worker-plugins-checkbox", className)}
58
+ data-checked={checked}
59
+ data-model-id={model.id()}
60
+ onChange={this.tt.onCheckedChanged}
61
+ style={style}
62
+ type="checkbox"
63
+ />
64
+ )
65
+ }
66
+
67
+ onCheckedChanged = (e) => {
68
+ e.preventDefault()
69
+
70
+ const {model} = this.props
71
+ const checked = e.target.checked
72
+
73
+ if (checked) {
74
+ Workplace.createLink({model_class: model.modelClassData().name, model_id: model.id()})
75
+ } else {
76
+ const modelClassName = model.modelClassData().name
77
+ const params = {models: {}}
78
+
79
+ params.models[modelClassName] = [model.id()]
80
+
81
+ Workplace.destroyLinks(params)
82
+ }
83
+ }
84
+
85
+ onLinksCreated = ({args}) => {
86
+ const {model} = this.p
87
+ const id = model.id()
88
+ const modelClassName = model.modelClassData().name
89
+
90
+ if (args.created[modelClassName] && args.created[modelClassName].includes(id)) {
91
+ this.setState({checked: true})
92
+ }
93
+ }
94
+
95
+ onLinksDestroyed = ({args}) => {
96
+ const {model} = this.p
97
+ const id = model.id()
98
+ const modelClassName = model.modelClassData().name
99
+
100
+ if (args.destroyed[modelClassName] && args.destroyed[modelClassName].includes(id)) {
101
+ this.setState({checked: false})
102
+ }
103
+ }
104
+ }))
@@ -0,0 +1,11 @@
1
+ export default function apiMakerTranslatedAttributes(attributeNames, availableLocales) {
2
+ const translatedAttributes = []
3
+
4
+ for (const attribute of attributeNames) {
5
+ for (const locale of availableLocales) {
6
+ translatedAttributes.push(`${attribute}${locale.substring(0, 1).toUpperCase()}${locale.substring(1, 99)}`)
7
+ }
8
+ }
9
+
10
+ return translatedAttributes
11
+ }
@@ -1,9 +1,10 @@
1
1
  import {digg} from "diggerize"
2
- import translatedCollectionsData from "./translated-collections-data.mjs.erb"
2
+ import I18nOnSteroids from "i18n-on-steroids"
3
+ import translatedCollectionsData from "translated-collections-data.json"
3
4
 
4
5
  export default class ApiMakerTranslatedCollections {
5
6
  static get (modelClass, collectionName) {
6
- const locale = I18n.locale
7
+ const locale = I18nOnSteroids.getCurrent().locale
7
8
  const modelClassName = digg(modelClass.modelClassData(), "name")
8
9
  const collection = digg(translatedCollectionsData, modelClassName, collectionName, locale, "collection_array")
9
10
 
@@ -1,5 +1,5 @@
1
1
  import {digg} from "diggerize"
2
- import ModelEvents from "./model-events.mjs"
2
+ import ModelEvents from "./model-events"
3
3
  import PropTypes from "prop-types"
4
4
  import propTypesExact from "prop-types-exact"
5
5
  import React from "react"
@@ -0,0 +1,18 @@
1
+ import escapeStringRegexp from "escape-string-regexp"
2
+
3
+ const replaces = {
4
+ " ": "+",
5
+ "&": "%26",
6
+ "#": "%23",
7
+ "+": "%2B",
8
+ "/": "%2F",
9
+ "?": "%3F"
10
+ }
11
+
12
+ const regexp = new RegExp(`(${Object.keys(replaces).map(escapeStringRegexp).join("|")})`, "g")
13
+
14
+ const urlEncode = (string) => {
15
+ return String(string).replaceAll(regexp, (character) => replaces[character])
16
+ }
17
+
18
+ export default urlEncode
@@ -0,0 +1,87 @@
1
+ import {useCallback, useLayoutEffect} from "react"
2
+ import config from "./config"
3
+ import {Dimensions} from "react-native"
4
+ import * as inflection from "inflection"
5
+ import isExpo from "./is-expo"
6
+ import useShape from "set-state-compare/src/use-shape"
7
+
8
+ const calculateBreakPoint = (windowObject) => {
9
+ let windowWidth
10
+
11
+ if (isExpo) {
12
+ windowWidth = windowObject.width
13
+ } else {
14
+ // Use 'window.innerWidth' outside Expo because sometimes window width excludes scroll
15
+ windowWidth = window.innerWidth
16
+ }
17
+
18
+ const result = {}
19
+
20
+ for (const breakpointData of config.getBreakPoints()) {
21
+ const breakpoint = breakpointData[0]
22
+ const width = breakpointData[1]
23
+
24
+ if (!result.name && windowWidth >= width) {
25
+ result.name = breakpoint
26
+ result[`${breakpoint}Down`] = true
27
+ } else {
28
+ result[`${breakpoint}Down`] = !result.name
29
+ }
30
+
31
+ result[`${breakpoint}Up`] = Boolean(result.name)
32
+ }
33
+
34
+ if (result.name) {
35
+ return result
36
+ }
37
+
38
+ throw new Error(`Couldn't not find breakpoint from window width: ${windowWidth}`)
39
+ }
40
+
41
+ const sizeTypes = ["down", "up"]
42
+
43
+ const useBreakpoint = () => {
44
+ const s = useShape()
45
+ const onCalled = useCallback(({window: windowObject}) => {
46
+ const breakpoint = calculateBreakPoint(windowObject)
47
+
48
+ if (breakpoint.name != s.s.breakpoint.name) {
49
+ s.set({breakpoint})
50
+ }
51
+ }, [])
52
+
53
+ s.useStates({
54
+ breakpoint: () => calculateBreakPoint(Dimensions.get("window"))
55
+ })
56
+
57
+ const styling = useCallback((args) => {
58
+ const style = Object.assign({}, args.base)
59
+
60
+ for (const breakpointData of apiMakerConfig.getBreakPoints()) {
61
+ const breakpoint = breakpointData[0]
62
+
63
+ for (const sizeType of sizeTypes) {
64
+ const breakpointWithSizeType = `${breakpoint}${inflection.camelize(sizeType)}`
65
+
66
+ if (args[breakpointWithSizeType] && s.s.breakpoint[breakpointWithSizeType]) {
67
+ Object.assign(style, args[breakpointWithSizeType])
68
+ }
69
+ }
70
+ }
71
+
72
+ return style
73
+ }, [])
74
+
75
+ useLayoutEffect(() => {
76
+ const subscription = Dimensions.addEventListener("change", onCalled)
77
+
78
+ return () => subscription?.remove()
79
+ })
80
+
81
+ return {
82
+ styling,
83
+ ...s.s.breakpoint
84
+ }
85
+ }
86
+
87
+ export default useBreakpoint
@@ -0,0 +1,55 @@
1
+ import CanCan from "./can-can"
2
+ import {useCallback, useMemo, useState} from "react"
3
+ import useCurrentUser from "./use-current-user"
4
+ import useEventEmitter from "./use-event-emitter"
5
+ import useShape from "set-state-compare/src/use-shape"
6
+
7
+ const useCanCan = (abilitiesCallback, dependencies) => {
8
+ const currentUser = useCurrentUser()
9
+ const s = useShape({abilitiesCallback})
10
+
11
+ s.useStates({
12
+ canCan: null,
13
+ lastUpdate: new Date()
14
+ })
15
+
16
+ if (!dependencies) {
17
+ dependencies = [currentUser?.id()]
18
+ }
19
+
20
+ const loadAbilities = useCallback(async () => {
21
+ const canCan = CanCan.current()
22
+ const abilities = s.p.abilitiesCallback()
23
+
24
+ await canCan.loadAbilities(abilities)
25
+
26
+ s.set({canCan, lastUpdate: new Date()})
27
+ }, [])
28
+
29
+ const onResetAbilities = useCallback(async () => {
30
+ s.set({canCan: null}, {silent: true})
31
+ await loadAbilities()
32
+ }, [])
33
+
34
+ const loadAbilitiesOnNew = useCallback(async () => {
35
+ const canCan = s.s.canCan
36
+
37
+ s.set({canCan: null}, {silent: true})
38
+
39
+ if (canCan) {
40
+ await canCan?.resetAbilities()
41
+ } else {
42
+ await loadAbilities()
43
+ }
44
+ }, [])
45
+
46
+ useMemo(() => {
47
+ loadAbilitiesOnNew()
48
+ }, dependencies)
49
+
50
+ useEventEmitter(CanCan.current().events, "onResetAbilities", onResetAbilities)
51
+
52
+ return s.s.canCan
53
+ }
54
+
55
+ export default useCanCan