@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,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,76 @@
1
+ import {useCallback, useLayoutEffect} from "react"
2
+ import apiMakerConfig from "@kaspernj/api-maker/build/config"
3
+ import {Dimensions} from "react-native"
4
+ import * as inflection from "inflection"
5
+ import useShape from "set-state-compare/src/use-shape"
6
+
7
+ const calculateBreakPoint = (window) => {
8
+ const windowWidth = window.width
9
+ const result = {}
10
+
11
+ for (const breakpointData of apiMakerConfig.getBreakPoints()) {
12
+ const breakpoint = breakpointData[0]
13
+ const width = breakpointData[1]
14
+
15
+ if (!result.name && windowWidth >= width) {
16
+ result.name = breakpoint
17
+ }
18
+
19
+ result[`${breakpoint}Down`] = !result.name
20
+ result[`${breakpoint}Up`] = Boolean(result.name)
21
+ }
22
+
23
+ if (result.name) {
24
+ return result
25
+ }
26
+
27
+ throw new Error(`Couldn't not find breakpoint from window width: ${windowWidth}`)
28
+ }
29
+
30
+ const sizeTypes = ["down", "up"]
31
+
32
+ const useBreakpoint = () => {
33
+ const s = useShape()
34
+ const onCalled = useCallback(({window}) => {
35
+ const breakpoint = calculateBreakPoint(window)
36
+
37
+ if (breakpoint.name != s.s.breakpoint.name) {
38
+ s.set({breakpoint})
39
+ }
40
+ }, [])
41
+
42
+ s.useStates({
43
+ breakpoint: () => calculateBreakPoint(Dimensions.get("window"))
44
+ })
45
+
46
+ const styling = useCallback((args) => {
47
+ const style = Object.assign({}, args.base)
48
+
49
+ for (const breakpointData of apiMakerConfig.getBreakPoints()) {
50
+ const breakpoint = breakpointData[0]
51
+
52
+ for (const sizeType of sizeTypes) {
53
+ const breakpointWithSizeType = `${breakpoint}${inflection.camelize(sizeType)}`
54
+
55
+ if (args[breakpointWithSizeType] && s.s.breakpoint[breakpointWithSizeType]) {
56
+ Object.assign(style, args[breakpointWithSizeType])
57
+ }
58
+ }
59
+ }
60
+
61
+ return style
62
+ }, [])
63
+
64
+ useLayoutEffect(() => {
65
+ const subscription = Dimensions.addEventListener("change", onCalled)
66
+
67
+ return () => subscription?.remove()
68
+ })
69
+
70
+ return {
71
+ styling,
72
+ ...s.s.breakpoint
73
+ }
74
+ }
75
+
76
+ 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