@saltcorn/data 0.6.2-beta.1 → 0.6.2-beta.2

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 (555) hide show
  1. package/dist/base-plugin/actions.d.ts +141 -0
  2. package/dist/base-plugin/actions.d.ts.map +1 -0
  3. package/dist/base-plugin/actions.js +551 -0
  4. package/dist/base-plugin/actions.js.map +1 -0
  5. package/dist/base-plugin/base.test.d.ts +2 -0
  6. package/dist/base-plugin/base.test.d.ts.map +1 -0
  7. package/dist/base-plugin/base.test.js +15 -0
  8. package/dist/base-plugin/base.test.js.map +1 -0
  9. package/dist/base-plugin/fieldviews.d.ts +25 -0
  10. package/dist/base-plugin/fieldviews.d.ts.map +1 -0
  11. package/dist/base-plugin/fieldviews.js +159 -0
  12. package/dist/base-plugin/fieldviews.js.map +1 -0
  13. package/dist/base-plugin/fileviews.d.ts +52 -0
  14. package/dist/base-plugin/fileviews.d.ts.map +1 -0
  15. package/dist/base-plugin/fileviews.js +59 -0
  16. package/dist/base-plugin/fileviews.js.map +1 -0
  17. package/dist/base-plugin/index.d.ts +524 -0
  18. package/dist/base-plugin/index.d.ts.map +1 -0
  19. package/{base-plugin → dist/base-plugin}/index.js +22 -24
  20. package/dist/base-plugin/index.js.map +1 -0
  21. package/dist/base-plugin/types.d.ts +383 -0
  22. package/dist/base-plugin/types.d.ts.map +1 -0
  23. package/dist/base-plugin/types.js +1080 -0
  24. package/dist/base-plugin/types.js.map +1 -0
  25. package/dist/base-plugin/viewtemplates/edit.d.ts +116 -0
  26. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -0
  27. package/dist/base-plugin/viewtemplates/edit.js +561 -0
  28. package/dist/base-plugin/viewtemplates/edit.js.map +1 -0
  29. package/dist/base-plugin/viewtemplates/feed.d.ts +73 -0
  30. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -0
  31. package/dist/base-plugin/viewtemplates/feed.js +348 -0
  32. package/dist/base-plugin/viewtemplates/feed.js.map +1 -0
  33. package/dist/base-plugin/viewtemplates/filter.d.ts +46 -0
  34. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -0
  35. package/dist/base-plugin/viewtemplates/filter.js +267 -0
  36. package/dist/base-plugin/viewtemplates/filter.js.map +1 -0
  37. package/dist/base-plugin/viewtemplates/list.d.ts +99 -0
  38. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -0
  39. package/dist/base-plugin/viewtemplates/list.js +471 -0
  40. package/dist/base-plugin/viewtemplates/list.js.map +1 -0
  41. package/dist/base-plugin/viewtemplates/listshowlist.d.ts +41 -0
  42. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -0
  43. package/dist/base-plugin/viewtemplates/listshowlist.js +248 -0
  44. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -0
  45. package/dist/base-plugin/viewtemplates/room.d.ts +140 -0
  46. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -0
  47. package/dist/base-plugin/viewtemplates/room.js +469 -0
  48. package/dist/base-plugin/viewtemplates/room.js.map +1 -0
  49. package/dist/base-plugin/viewtemplates/show.d.ts +101 -0
  50. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -0
  51. package/dist/base-plugin/viewtemplates/show.js +562 -0
  52. package/dist/base-plugin/viewtemplates/show.js.map +1 -0
  53. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +108 -0
  54. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -0
  55. package/dist/base-plugin/viewtemplates/viewable_fields.js +563 -0
  56. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -0
  57. package/dist/contracts.d.ts +49 -0
  58. package/dist/contracts.d.ts.map +1 -0
  59. package/dist/contracts.js +212 -0
  60. package/dist/contracts.js.map +1 -0
  61. package/dist/coverage/lcov-report/block-navigation.d.ts +2 -0
  62. package/dist/coverage/lcov-report/block-navigation.d.ts.map +1 -0
  63. package/dist/coverage/lcov-report/block-navigation.js +66 -0
  64. package/dist/coverage/lcov-report/block-navigation.js.map +1 -0
  65. package/dist/coverage/lcov-report/prettify.d.ts +1 -0
  66. package/dist/coverage/lcov-report/prettify.d.ts.map +1 -0
  67. package/dist/coverage/lcov-report/prettify.js +478 -0
  68. package/dist/coverage/lcov-report/prettify.js.map +1 -0
  69. package/dist/coverage/lcov-report/sorter.d.ts +2 -0
  70. package/dist/coverage/lcov-report/sorter.d.ts.map +1 -0
  71. package/dist/coverage/lcov-report/sorter.js +141 -0
  72. package/dist/coverage/lcov-report/sorter.js.map +1 -0
  73. package/dist/db/connect.d.ts +40 -0
  74. package/dist/db/connect.d.ts.map +1 -0
  75. package/dist/db/connect.js +150 -0
  76. package/dist/db/connect.js.map +1 -0
  77. package/dist/db/db.test.d.ts +2 -0
  78. package/dist/db/db.test.d.ts.map +1 -0
  79. package/dist/db/db.test.js +28 -0
  80. package/dist/db/db.test.js.map +1 -0
  81. package/dist/db/fixtures.d.ts +8 -0
  82. package/dist/db/fixtures.d.ts.map +1 -0
  83. package/dist/db/fixtures.js +300 -0
  84. package/dist/db/fixtures.js.map +1 -0
  85. package/dist/db/index.d.ts +3 -0
  86. package/dist/db/index.d.ts.map +1 -0
  87. package/dist/db/index.js +41 -0
  88. package/dist/db/index.js.map +1 -0
  89. package/dist/db/reset_schema.d.ts +13 -0
  90. package/dist/db/reset_schema.d.ts.map +1 -0
  91. package/{db → dist/db}/reset_schema.js +45 -55
  92. package/dist/db/reset_schema.js.map +1 -0
  93. package/dist/db/state.d.ts +56 -0
  94. package/dist/db/state.d.ts.map +1 -0
  95. package/dist/db/state.js +608 -0
  96. package/dist/db/state.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/{index.js → dist/index.js} +2 -1
  100. package/dist/index.js.map +1 -0
  101. package/dist/migrate.d.ts +12 -0
  102. package/dist/migrate.d.ts.map +1 -0
  103. package/dist/migrate.js +94 -0
  104. package/dist/migrate.js.map +1 -0
  105. package/dist/migrations/202005141503.d.ts +2 -0
  106. package/dist/migrations/202005141503.d.ts.map +1 -0
  107. package/{migrations → dist/migrations}/202005141503.js +2 -1
  108. package/dist/migrations/202005141503.js.map +1 -0
  109. package/dist/migrations/202005241712.d.ts +2 -0
  110. package/dist/migrations/202005241712.d.ts.map +1 -0
  111. package/{migrations → dist/migrations}/202005241712.js +2 -1
  112. package/dist/migrations/202005241712.js.map +1 -0
  113. package/dist/migrations/202005251037.d.ts +2 -0
  114. package/dist/migrations/202005251037.d.ts.map +1 -0
  115. package/{migrations → dist/migrations}/202005251037.js +2 -1
  116. package/dist/migrations/202005251037.js.map +1 -0
  117. package/dist/migrations/202005282134.d.ts +2 -0
  118. package/dist/migrations/202005282134.d.ts.map +1 -0
  119. package/{migrations → dist/migrations}/202005282134.js +2 -1
  120. package/dist/migrations/202005282134.js.map +1 -0
  121. package/dist/migrations/202006022156.d.ts +2 -0
  122. package/dist/migrations/202006022156.d.ts.map +1 -0
  123. package/{migrations → dist/migrations}/202006022156.js +2 -1
  124. package/dist/migrations/202006022156.js.map +1 -0
  125. package/dist/migrations/202006051507.d.ts +2 -0
  126. package/dist/migrations/202006051507.d.ts.map +1 -0
  127. package/{migrations → dist/migrations}/202006051507.js +2 -1
  128. package/dist/migrations/202006051507.js.map +1 -0
  129. package/dist/migrations/202006240906.d.ts +2 -0
  130. package/dist/migrations/202006240906.d.ts.map +1 -0
  131. package/{migrations → dist/migrations}/202006240906.js +2 -1
  132. package/dist/migrations/202006240906.js.map +1 -0
  133. package/dist/migrations/202007091707.d.ts +2 -0
  134. package/dist/migrations/202007091707.d.ts.map +1 -0
  135. package/{migrations → dist/migrations}/202007091707.js +2 -1
  136. package/dist/migrations/202007091707.js.map +1 -0
  137. package/dist/migrations/202007202144.d.ts +2 -0
  138. package/dist/migrations/202007202144.d.ts.map +1 -0
  139. package/{migrations → dist/migrations}/202007202144.js +2 -1
  140. package/dist/migrations/202007202144.js.map +1 -0
  141. package/dist/migrations/202008031500.d.ts +2 -0
  142. package/dist/migrations/202008031500.d.ts.map +1 -0
  143. package/dist/migrations/202008031500.js +4 -0
  144. package/dist/migrations/202008031500.js.map +1 -0
  145. package/dist/migrations/202008051415.d.ts +2 -0
  146. package/dist/migrations/202008051415.d.ts.map +1 -0
  147. package/{migrations → dist/migrations}/202008051415.js +2 -1
  148. package/dist/migrations/202008051415.js.map +1 -0
  149. package/dist/migrations/202008121149.d.ts +3 -0
  150. package/dist/migrations/202008121149.d.ts.map +1 -0
  151. package/{migrations → dist/migrations}/202008121149.js +2 -2
  152. package/dist/migrations/202008121149.js.map +1 -0
  153. package/dist/migrations/202009112140.d.ts +3 -0
  154. package/dist/migrations/202009112140.d.ts.map +1 -0
  155. package/{migrations → dist/migrations}/202009112140.js +2 -2
  156. package/dist/migrations/202009112140.js.map +1 -0
  157. package/dist/migrations/202009181655.d.ts +2 -0
  158. package/dist/migrations/202009181655.d.ts.map +1 -0
  159. package/dist/migrations/202009181655.js +7 -0
  160. package/dist/migrations/202009181655.js.map +1 -0
  161. package/dist/migrations/202009221105.d.ts +2 -0
  162. package/dist/migrations/202009221105.d.ts.map +1 -0
  163. package/dist/migrations/202009221105.js +4 -0
  164. package/dist/migrations/202009221105.js.map +1 -0
  165. package/dist/migrations/202009231331.d.ts +2 -0
  166. package/dist/migrations/202009231331.d.ts.map +1 -0
  167. package/{migrations → dist/migrations}/202009231331.js +2 -1
  168. package/dist/migrations/202009231331.js.map +1 -0
  169. package/dist/migrations/202009301531.d.ts +2 -0
  170. package/dist/migrations/202009301531.d.ts.map +1 -0
  171. package/dist/migrations/202009301531.js +8 -0
  172. package/dist/migrations/202009301531.js.map +1 -0
  173. package/dist/migrations/202010231444.d.ts +2 -0
  174. package/dist/migrations/202010231444.d.ts.map +1 -0
  175. package/dist/migrations/202010231444.js +4 -0
  176. package/dist/migrations/202010231444.js.map +1 -0
  177. package/dist/migrations/202010251412.d.ts +2 -0
  178. package/dist/migrations/202010251412.d.ts.map +1 -0
  179. package/dist/migrations/202010251412.js +10 -0
  180. package/dist/migrations/202010251412.js.map +1 -0
  181. package/dist/migrations/202011021749.d.ts +2 -0
  182. package/dist/migrations/202011021749.d.ts.map +1 -0
  183. package/{migrations → dist/migrations}/202011021749.js +2 -1
  184. package/dist/migrations/202011021749.js.map +1 -0
  185. package/dist/migrations/202011051353.d.ts +2 -0
  186. package/dist/migrations/202011051353.d.ts.map +1 -0
  187. package/{migrations → dist/migrations}/202011051353.js +2 -1
  188. package/dist/migrations/202011051353.js.map +1 -0
  189. package/dist/migrations/202011111127.d.ts +2 -0
  190. package/dist/migrations/202011111127.d.ts.map +1 -0
  191. package/{migrations → dist/migrations}/202011111127.js +2 -1
  192. package/dist/migrations/202011111127.js.map +1 -0
  193. package/dist/migrations/202012011203.d.ts +2 -0
  194. package/dist/migrations/202012011203.d.ts.map +1 -0
  195. package/{migrations → dist/migrations}/202012011203.js +2 -1
  196. package/dist/migrations/202012011203.js.map +1 -0
  197. package/dist/migrations/202012100841.d.ts +2 -0
  198. package/dist/migrations/202012100841.d.ts.map +1 -0
  199. package/{migrations → dist/migrations}/202012100841.js +2 -1
  200. package/dist/migrations/202012100841.js.map +1 -0
  201. package/dist/migrations/202012281835.d.ts +2 -0
  202. package/dist/migrations/202012281835.d.ts.map +1 -0
  203. package/{migrations → dist/migrations}/202012281835.js +2 -1
  204. package/dist/migrations/202012281835.js.map +1 -0
  205. package/dist/migrations/202101061051.d.ts +2 -0
  206. package/dist/migrations/202101061051.d.ts.map +1 -0
  207. package/{migrations → dist/migrations}/202101061051.js +2 -1
  208. package/dist/migrations/202101061051.js.map +1 -0
  209. package/dist/migrations/202101141128.d.ts +2 -0
  210. package/dist/migrations/202101141128.d.ts.map +1 -0
  211. package/dist/migrations/202101141128.js +4 -0
  212. package/dist/migrations/202101141128.js.map +1 -0
  213. package/dist/migrations/202102091312.d.ts +3 -0
  214. package/dist/migrations/202102091312.d.ts.map +1 -0
  215. package/dist/migrations/202102091312.js +19 -0
  216. package/dist/migrations/202102091312.js.map +1 -0
  217. package/dist/migrations/202102101624.d.ts +2 -0
  218. package/dist/migrations/202102101624.d.ts.map +1 -0
  219. package/dist/migrations/202102101624.js +7 -0
  220. package/dist/migrations/202102101624.js.map +1 -0
  221. package/dist/migrations/202102172148.d.ts +2 -0
  222. package/dist/migrations/202102172148.d.ts.map +1 -0
  223. package/{migrations → dist/migrations}/202102172148.js +2 -2
  224. package/dist/migrations/202102172148.js.map +1 -0
  225. package/dist/migrations/202102261650.d.ts +2 -0
  226. package/dist/migrations/202102261650.d.ts.map +1 -0
  227. package/dist/migrations/202102261650.js +7 -0
  228. package/dist/migrations/202102261650.js.map +1 -0
  229. package/dist/migrations/202106102347.d.ts +2 -0
  230. package/dist/migrations/202106102347.d.ts.map +1 -0
  231. package/{migrations → dist/migrations}/202106102347.js +2 -3
  232. package/dist/migrations/202106102347.js.map +1 -0
  233. package/dist/migrations/202106112120.d.ts +2 -0
  234. package/dist/migrations/202106112120.d.ts.map +1 -0
  235. package/{migrations → dist/migrations}/202106112120.js +2 -3
  236. package/dist/migrations/202106112120.js.map +1 -0
  237. package/dist/migrations/202106120012.d.ts +2 -0
  238. package/dist/migrations/202106120012.d.ts.map +1 -0
  239. package/{migrations → dist/migrations}/202106120012.js +2 -3
  240. package/dist/migrations/202106120012.js.map +1 -0
  241. package/dist/migrations/202106120220.d.ts +2 -0
  242. package/dist/migrations/202106120220.d.ts.map +1 -0
  243. package/{migrations → dist/migrations}/202106120220.js +2 -4
  244. package/dist/migrations/202106120220.js.map +1 -0
  245. package/dist/migrations/202106121701.d.ts +2 -0
  246. package/dist/migrations/202106121701.d.ts.map +1 -0
  247. package/{migrations → dist/migrations}/202106121701.js +2 -3
  248. package/dist/migrations/202106121701.js.map +1 -0
  249. package/dist/migrations/202106121703.d.ts +3 -0
  250. package/dist/migrations/202106121703.d.ts.map +1 -0
  251. package/{migrations → dist/migrations}/202106121703.js +2 -3
  252. package/dist/migrations/202106121703.js.map +1 -0
  253. package/dist/migrations/202106251126.d.ts +2 -0
  254. package/dist/migrations/202106251126.d.ts.map +1 -0
  255. package/dist/migrations/202106251126.js +6 -0
  256. package/dist/migrations/202106251126.js.map +1 -0
  257. package/dist/migrations/202107281619.d.ts +2 -0
  258. package/dist/migrations/202107281619.d.ts.map +1 -0
  259. package/{migrations → dist/migrations}/202107281619.js +2 -1
  260. package/dist/migrations/202107281619.js.map +1 -0
  261. package/dist/migrations/202107302158.d.ts +3 -0
  262. package/dist/migrations/202107302158.d.ts.map +1 -0
  263. package/{migrations → dist/migrations}/202107302158.js +2 -3
  264. package/dist/migrations/202107302158.js.map +1 -0
  265. package/dist/migrations/202108022257.d.ts +2 -0
  266. package/dist/migrations/202108022257.d.ts.map +1 -0
  267. package/{migrations → dist/migrations}/202108022257.js +3 -4
  268. package/dist/migrations/202108022257.js.map +1 -0
  269. package/dist/migrations/202109201624.d.ts +2 -0
  270. package/dist/migrations/202109201624.d.ts.map +1 -0
  271. package/{migrations → dist/migrations}/202109201624.js +2 -1
  272. package/dist/migrations/202109201624.js.map +1 -0
  273. package/dist/migrations/202109301031.d.ts +3 -0
  274. package/dist/migrations/202109301031.d.ts.map +1 -0
  275. package/{migrations → dist/migrations}/202109301031.js +2 -2
  276. package/dist/migrations/202109301031.js.map +1 -0
  277. package/dist/migrations/202111290253.d.ts +3 -0
  278. package/dist/migrations/202111290253.d.ts.map +1 -0
  279. package/dist/migrations/202111290253.js +5 -0
  280. package/dist/migrations/202111290253.js.map +1 -0
  281. package/dist/models/backup.d.ts +22 -0
  282. package/dist/models/backup.d.ts.map +1 -0
  283. package/{models → dist/models}/backup.js +95 -192
  284. package/dist/models/backup.js.map +1 -0
  285. package/dist/models/config.d.ts +177 -0
  286. package/dist/models/config.d.ts.map +1 -0
  287. package/dist/models/config.js +683 -0
  288. package/dist/models/config.js.map +1 -0
  289. package/dist/models/crash.d.ts +74 -0
  290. package/dist/models/crash.d.ts.map +1 -0
  291. package/dist/models/crash.js +118 -0
  292. package/dist/models/crash.js.map +1 -0
  293. package/dist/models/discovery.d.ts +28 -0
  294. package/dist/models/discovery.d.ts.map +1 -0
  295. package/dist/models/discovery.js +163 -0
  296. package/dist/models/discovery.js.map +1 -0
  297. package/dist/models/email.d.ts +16 -0
  298. package/dist/models/email.d.ts.map +1 -0
  299. package/dist/models/email.js +90 -0
  300. package/dist/models/email.js.map +1 -0
  301. package/dist/models/eventlog.d.ts +77 -0
  302. package/dist/models/eventlog.d.ts.map +1 -0
  303. package/dist/models/eventlog.js +132 -0
  304. package/dist/models/eventlog.js.map +1 -0
  305. package/dist/models/expression.d.ts +54 -0
  306. package/dist/models/expression.d.ts.map +1 -0
  307. package/dist/models/expression.js +274 -0
  308. package/dist/models/expression.js.map +1 -0
  309. package/dist/models/field.d.ts +217 -0
  310. package/dist/models/field.d.ts.map +1 -0
  311. package/dist/models/field.js +619 -0
  312. package/dist/models/field.js.map +1 -0
  313. package/dist/models/fieldrepeat.d.ts +49 -0
  314. package/dist/models/fieldrepeat.d.ts.map +1 -0
  315. package/dist/models/fieldrepeat.js +88 -0
  316. package/dist/models/fieldrepeat.js.map +1 -0
  317. package/dist/models/file.d.ts +122 -0
  318. package/dist/models/file.d.ts.map +1 -0
  319. package/dist/models/file.js +224 -0
  320. package/dist/models/file.js.map +1 -0
  321. package/dist/models/form.d.ts +82 -0
  322. package/dist/models/form.d.ts.map +1 -0
  323. package/dist/models/form.js +163 -0
  324. package/dist/models/form.js.map +1 -0
  325. package/dist/models/index.d.ts +1 -0
  326. package/dist/models/index.d.ts.map +1 -0
  327. package/{models → dist/models}/index.js +42 -42
  328. package/dist/models/index.js.map +1 -0
  329. package/dist/models/layout.d.ts +34 -0
  330. package/dist/models/layout.d.ts.map +1 -0
  331. package/dist/models/layout.js +153 -0
  332. package/dist/models/layout.js.map +1 -0
  333. package/dist/models/library.d.ts +50 -0
  334. package/dist/models/library.d.ts.map +1 -0
  335. package/dist/models/library.js +129 -0
  336. package/dist/models/library.js.map +1 -0
  337. package/dist/models/pack.d.ts +89 -0
  338. package/dist/models/pack.d.ts.map +1 -0
  339. package/dist/models/pack.js +383 -0
  340. package/dist/models/pack.js.map +1 -0
  341. package/dist/models/page.d.ts +101 -0
  342. package/dist/models/page.d.ts.map +1 -0
  343. package/dist/models/page.js +223 -0
  344. package/dist/models/page.js.map +1 -0
  345. package/dist/models/plugin.d.ts +100 -0
  346. package/dist/models/plugin.d.ts.map +1 -0
  347. package/dist/models/plugin.js +204 -0
  348. package/dist/models/plugin.js.map +1 -0
  349. package/dist/models/random.d.ts +24 -0
  350. package/dist/models/random.d.ts.map +1 -0
  351. package/dist/models/random.js +186 -0
  352. package/dist/models/random.js.map +1 -0
  353. package/dist/models/role.d.ts +42 -0
  354. package/dist/models/role.d.ts.map +1 -0
  355. package/dist/models/role.js +64 -0
  356. package/dist/models/role.js.map +1 -0
  357. package/dist/models/scheduler.d.ts +18 -0
  358. package/dist/models/scheduler.d.ts.map +1 -0
  359. package/dist/models/scheduler.js +159 -0
  360. package/dist/models/scheduler.js.map +1 -0
  361. package/dist/models/table.d.ts +326 -0
  362. package/dist/models/table.d.ts.map +1 -0
  363. package/dist/models/table.js +1006 -0
  364. package/dist/models/table.js.map +1 -0
  365. package/dist/models/table_constraints.d.ts +69 -0
  366. package/dist/models/table_constraints.d.ts.map +1 -0
  367. package/dist/models/table_constraints.js +118 -0
  368. package/dist/models/table_constraints.js.map +1 -0
  369. package/dist/models/tenant.d.ts +55 -0
  370. package/dist/models/tenant.d.ts.map +1 -0
  371. package/{models → dist/models}/tenant.js +40 -63
  372. package/dist/models/tenant.js.map +1 -0
  373. package/dist/models/trigger.d.ts +133 -0
  374. package/dist/models/trigger.d.ts.map +1 -0
  375. package/dist/models/trigger.js +292 -0
  376. package/dist/models/trigger.js.map +1 -0
  377. package/dist/models/user.d.ts +235 -0
  378. package/dist/models/user.d.ts.map +1 -0
  379. package/dist/models/user.js +434 -0
  380. package/dist/models/user.js.map +1 -0
  381. package/dist/models/view.d.ts +204 -0
  382. package/dist/models/view.d.ts.map +1 -0
  383. package/dist/models/view.js +497 -0
  384. package/dist/models/view.js.map +1 -0
  385. package/dist/models/workflow.d.ts +48 -0
  386. package/dist/models/workflow.d.ts.map +1 -0
  387. package/dist/models/workflow.js +190 -0
  388. package/dist/models/workflow.js.map +1 -0
  389. package/dist/plugin-helper.d.ts +145 -0
  390. package/dist/plugin-helper.d.ts.map +1 -0
  391. package/dist/plugin-helper.js +1158 -0
  392. package/dist/plugin-helper.js.map +1 -0
  393. package/dist/plugin-testing.d.ts +3 -0
  394. package/dist/plugin-testing.d.ts.map +1 -0
  395. package/dist/plugin-testing.js +120 -0
  396. package/dist/plugin-testing.js.map +1 -0
  397. package/dist/tests/actions.test.d.ts +2 -0
  398. package/dist/tests/actions.test.d.ts.map +1 -0
  399. package/dist/tests/actions.test.js +205 -0
  400. package/dist/tests/actions.test.js.map +1 -0
  401. package/dist/tests/auxtest.test.d.ts +2 -0
  402. package/dist/tests/auxtest.test.d.ts.map +1 -0
  403. package/dist/tests/auxtest.test.js +48 -0
  404. package/dist/tests/auxtest.test.js.map +1 -0
  405. package/dist/tests/backup.test.d.ts +2 -0
  406. package/dist/tests/backup.test.d.ts.map +1 -0
  407. package/dist/tests/backup.test.js +88 -0
  408. package/dist/tests/backup.test.js.map +1 -0
  409. package/dist/tests/calc.test.d.ts +2 -0
  410. package/dist/tests/calc.test.d.ts.map +1 -0
  411. package/dist/tests/calc.test.js +231 -0
  412. package/dist/tests/calc.test.js.map +1 -0
  413. package/dist/tests/config.test.d.ts +2 -0
  414. package/dist/tests/config.test.d.ts.map +1 -0
  415. package/dist/tests/config.test.js +83 -0
  416. package/dist/tests/config.test.js.map +1 -0
  417. package/dist/tests/discover.test.d.ts +2 -0
  418. package/dist/tests/discover.test.d.ts.map +1 -0
  419. package/dist/tests/discover.test.js +106 -0
  420. package/dist/tests/discover.test.js.map +1 -0
  421. package/dist/tests/exact_views.test.d.ts +2 -0
  422. package/dist/tests/exact_views.test.d.ts.map +1 -0
  423. package/dist/tests/exact_views.test.js +511 -0
  424. package/dist/tests/exact_views.test.js.map +1 -0
  425. package/dist/tests/field.test.d.ts +2 -0
  426. package/dist/tests/field.test.d.ts.map +1 -0
  427. package/dist/tests/field.test.js +237 -0
  428. package/dist/tests/field.test.js.map +1 -0
  429. package/dist/tests/form.test.d.ts +2 -0
  430. package/dist/tests/form.test.d.ts.map +1 -0
  431. package/dist/tests/form.test.js +191 -0
  432. package/dist/tests/form.test.js.map +1 -0
  433. package/dist/tests/mocks.d.ts +111 -0
  434. package/dist/tests/mocks.d.ts.map +1 -0
  435. package/dist/tests/mocks.js +165 -0
  436. package/dist/tests/mocks.js.map +1 -0
  437. package/dist/tests/models.test.d.ts +2 -0
  438. package/dist/tests/models.test.d.ts.map +1 -0
  439. package/dist/tests/models.test.js +210 -0
  440. package/dist/tests/models.test.js.map +1 -0
  441. package/dist/tests/pack.test.d.ts +2 -0
  442. package/dist/tests/pack.test.d.ts.map +1 -0
  443. package/dist/tests/pack.test.js +331 -0
  444. package/dist/tests/pack.test.js.map +1 -0
  445. package/dist/tests/plugin.test.d.ts +2 -0
  446. package/dist/tests/plugin.test.d.ts.map +1 -0
  447. package/dist/tests/plugin.test.js +53 -0
  448. package/dist/tests/plugin.test.js.map +1 -0
  449. package/dist/tests/random.test.d.ts +2 -0
  450. package/dist/tests/random.test.d.ts.map +1 -0
  451. package/dist/tests/random.test.js +138 -0
  452. package/dist/tests/random.test.js.map +1 -0
  453. package/dist/tests/table.test.d.ts +2 -0
  454. package/dist/tests/table.test.d.ts.map +1 -0
  455. package/dist/tests/table.test.js +1048 -0
  456. package/dist/tests/table.test.js.map +1 -0
  457. package/dist/tests/tenant.test.d.ts +2 -0
  458. package/dist/tests/tenant.test.d.ts.map +1 -0
  459. package/dist/tests/tenant.test.js +45 -0
  460. package/dist/tests/tenant.test.js.map +1 -0
  461. package/dist/tests/user.test.d.ts +2 -0
  462. package/dist/tests/user.test.d.ts.map +1 -0
  463. package/dist/tests/user.test.js +190 -0
  464. package/dist/tests/user.test.js.map +1 -0
  465. package/dist/tests/view.test.d.ts +2 -0
  466. package/dist/tests/view.test.d.ts.map +1 -0
  467. package/dist/tests/view.test.js +238 -0
  468. package/dist/tests/view.test.js.map +1 -0
  469. package/dist/tests/workflow.test.d.ts +2 -0
  470. package/dist/tests/workflow.test.d.ts.map +1 -0
  471. package/dist/tests/workflow.test.js +115 -0
  472. package/dist/tests/workflow.test.js.map +1 -0
  473. package/dist/tsconfig.ref.tsbuildinfo +1 -0
  474. package/dist/utils.d.ts +26 -0
  475. package/dist/utils.d.ts.map +1 -0
  476. package/dist/utils.js +124 -0
  477. package/dist/utils.js.map +1 -0
  478. package/package.json +32 -8
  479. package/base-plugin/actions.js +0 -629
  480. package/base-plugin/base.test.js +0 -15
  481. package/base-plugin/fieldviews.js +0 -197
  482. package/base-plugin/fileviews.js +0 -65
  483. package/base-plugin/types.js +0 -1154
  484. package/base-plugin/viewtemplates/edit.js +0 -672
  485. package/base-plugin/viewtemplates/feed.js +0 -434
  486. package/base-plugin/viewtemplates/filter.js +0 -358
  487. package/base-plugin/viewtemplates/list.js +0 -575
  488. package/base-plugin/viewtemplates/listshowlist.js +0 -292
  489. package/base-plugin/viewtemplates/room.js +0 -652
  490. package/base-plugin/viewtemplates/show.js +0 -689
  491. package/base-plugin/viewtemplates/viewable_fields.js +0 -714
  492. package/contracts.js +0 -311
  493. package/db/connect.js +0 -151
  494. package/db/db.test.js +0 -33
  495. package/db/fixtures.js +0 -303
  496. package/db/index.js +0 -63
  497. package/db/state.js +0 -674
  498. package/migrate.js +0 -99
  499. package/migrations/202008031500.js +0 -4
  500. package/migrations/202009181655.js +0 -6
  501. package/migrations/202009221105.js +0 -4
  502. package/migrations/202009301531.js +0 -7
  503. package/migrations/202010231444.js +0 -4
  504. package/migrations/202010251412.js +0 -9
  505. package/migrations/202101141128.js +0 -4
  506. package/migrations/202102091312.js +0 -19
  507. package/migrations/202102101624.js +0 -5
  508. package/migrations/202102261650.js +0 -6
  509. package/migrations/202106251126.js +0 -5
  510. package/models/config.js +0 -680
  511. package/models/crash.js +0 -126
  512. package/models/discovery.js +0 -195
  513. package/models/email.js +0 -92
  514. package/models/eventlog.js +0 -146
  515. package/models/expression.js +0 -276
  516. package/models/field.js +0 -746
  517. package/models/fieldrepeat.js +0 -96
  518. package/models/file.js +0 -234
  519. package/models/form.js +0 -169
  520. package/models/layout.js +0 -146
  521. package/models/library.js +0 -135
  522. package/models/pack.js +0 -466
  523. package/models/page.js +0 -255
  524. package/models/plugin.js +0 -219
  525. package/models/random.js +0 -206
  526. package/models/role.js +0 -94
  527. package/models/scheduler.js +0 -163
  528. package/models/table.js +0 -1211
  529. package/models/table_constraints.js +0 -133
  530. package/models/trigger.js +0 -327
  531. package/models/user.js +0 -503
  532. package/models/view.js +0 -622
  533. package/models/workflow.js +0 -205
  534. package/plugin-helper.js +0 -1311
  535. package/plugin-testing.js +0 -124
  536. package/tests/actions.test.js +0 -232
  537. package/tests/auxtest.test.js +0 -52
  538. package/tests/backup.test.js +0 -92
  539. package/tests/calc.test.js +0 -243
  540. package/tests/config.test.js +0 -91
  541. package/tests/discover.test.js +0 -114
  542. package/tests/exact_views.test.js +0 -526
  543. package/tests/field.test.js +0 -253
  544. package/tests/form.test.js +0 -198
  545. package/tests/mocks.js +0 -173
  546. package/tests/models.test.js +0 -221
  547. package/tests/pack.test.js +0 -350
  548. package/tests/plugin.test.js +0 -59
  549. package/tests/random.test.js +0 -154
  550. package/tests/table.test.js +0 -1091
  551. package/tests/tenant.test.js +0 -56
  552. package/tests/user.test.js +0 -196
  553. package/tests/view.test.js +0 -251
  554. package/tests/workflow.test.js +0 -119
  555. package/utils.js +0 -137
@@ -0,0 +1,1158 @@
1
+ "use strict";
2
+ /**
3
+ * Plugin-helper
4
+ * @category saltcorn-data
5
+ * @module plugin-helper
6
+ */
7
+ const View = require("./models/view");
8
+ const Field = require("./models/field");
9
+ const Table = require("./models/table");
10
+ const Trigger = require("./models/trigger");
11
+ const { getState } = require("./db/state");
12
+ const db = require("./db");
13
+ const { contract, is } = require("contractis");
14
+ const { fieldlike, is_table_query, is_column, is_tablely, } = require("./contracts");
15
+ const { link } = require("@saltcorn/markup");
16
+ const { button, a, label, text, i } = require("@saltcorn/markup/tags");
17
+ const { applyAsync, InvalidConfiguration } = require("./utils");
18
+ const { jsexprToSQL } = require("./models/expression");
19
+ /**
20
+ *
21
+ * @param {string} url
22
+ * @param {string} label
23
+ * @param {boolean} [popup]
24
+ * @param {string} [link_style = ""]
25
+ * @param {string} [link_size = ""]
26
+ * @param {string} [link_icon = ""]
27
+ * @param {string} [textStyle = ""]
28
+ * @param {string} [link_bgcol]
29
+ * @param {string} [link_bordercol]
30
+ * @param {string} [link_textcol]
31
+ * @returns {button|a}
32
+ */
33
+ const link_view = (url, label, popup, link_style = "", link_size = "", link_icon = "", textStyle = "", link_bgcol, link_bordercol, link_textcol) => {
34
+ let style = link_style === "btn btn-custom-color"
35
+ ? `background-color: ${link_bgcol || "#000000"};border-color: ${link_bordercol || "#000000"}; color: ${link_textcol || "#000000"}`
36
+ : null;
37
+ if (popup) {
38
+ return button({
39
+ class: [
40
+ textStyle,
41
+ link_style,
42
+ link_size,
43
+ !link_style && "btn btn-link",
44
+ ],
45
+ onClick: `ajax_modal('${url}')`,
46
+ style,
47
+ }, link_icon ? i({ class: link_icon }) + " " : "", label);
48
+ }
49
+ else
50
+ return a({
51
+ href: url,
52
+ class: [textStyle, link_style, link_size],
53
+ style,
54
+ }, link_icon ? i({ class: link_icon }) + " " : "", text(label));
55
+ };
56
+ /**
57
+ * @function
58
+ * @param {object} [state]
59
+ * @returns {string}
60
+ */
61
+ const stateToQueryString = contract(is.fun(is.maybe(is.obj()), is.str), (state) => {
62
+ if (!state || Object.keys(state).length === 0)
63
+ return "";
64
+ return ("?" +
65
+ Object.entries(state)
66
+ .map(([k, v]) => k === "id"
67
+ ? null
68
+ : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
69
+ .filter((s) => !!s)
70
+ .join("&"));
71
+ });
72
+ /**
73
+ * @function
74
+ * @param {Field[]} fields
75
+ * @param {boolean}
76
+ * @returns {object}
77
+ */
78
+ const calcfldViewOptions = contract(is.fun([is.array(is.class("Field")), is.str], is.obj({ field_view_options: is.objVals(is.array(is.str)) })), (fields, mode) => {
79
+ const isEdit = mode === "edit";
80
+ const isFilter = mode === "filter";
81
+ let fvs = {};
82
+ const handlesTextStyle = {};
83
+ fields.forEach((f) => {
84
+ handlesTextStyle[f.name] = [];
85
+ if (f.type === "File") {
86
+ if (!isEdit && !isFilter)
87
+ fvs[f.name] = Object.keys(getState().fileviews);
88
+ else
89
+ fvs[f.name] = ["upload"];
90
+ }
91
+ else if (f.type === "Key") {
92
+ if (isEdit)
93
+ fvs[f.name] = Object.keys(getState().keyFieldviews);
94
+ else {
95
+ if (f.reftable && f.reftable.fields) {
96
+ const { field_view_options } = calcfldViewOptions(f.reftable.fields, mode);
97
+ for (const jf of f.reftable.fields) {
98
+ fvs[`${f.name}.${jf.name}`] = field_view_options[jf.name];
99
+ }
100
+ }
101
+ fvs[f.name] = ["show"];
102
+ }
103
+ Object.entries(getState().keyFieldviews).forEach(([k, v]) => {
104
+ if (v && v.handlesTextStyle)
105
+ handlesTextStyle[f.name].push(k);
106
+ });
107
+ }
108
+ else if (f.type && f.type.fieldviews) {
109
+ const tfvs = Object.entries(f.type.fieldviews).filter(([k, fv]) => f.calculated ? !fv.isEdit : !fv.isEdit || isEdit || isFilter);
110
+ let tfvs_ordered = [];
111
+ if (isEdit) {
112
+ tfvs_ordered = [
113
+ ...tfvs.filter(([k, fv]) => fv.isEdit),
114
+ ...tfvs.filter(([k, fv]) => !fv.isEdit && !fv.isFilter),
115
+ ];
116
+ }
117
+ else if (isFilter) {
118
+ tfvs_ordered = [
119
+ ...tfvs.filter(([k, fv]) => fv.isFilter),
120
+ ...tfvs.filter(([k, fv]) => fv.isEdit),
121
+ ];
122
+ }
123
+ else
124
+ tfvs_ordered = tfvs.filter(([k, fv]) => !fv.isFilter);
125
+ fvs[f.name] = tfvs_ordered.map(([k, fv]) => {
126
+ if (fv && fv.handlesTextStyle)
127
+ handlesTextStyle[f.name].push(k);
128
+ return k;
129
+ });
130
+ }
131
+ });
132
+ return { field_view_options: fvs, handlesTextStyle };
133
+ });
134
+ /**
135
+ * @function
136
+ * @param {Field[]} fields
137
+ * @param {boolean}
138
+ * @returns {Promise<object>}
139
+ */
140
+ const calcfldViewConfig = contract(is.fun([is.array(is.class("Field")), is.bool], is.promise(is.obj())), async (fields, isEdit) => {
141
+ const fieldViewConfigForms = {};
142
+ for (const f of fields) {
143
+ fieldViewConfigForms[f.name] = {};
144
+ const fieldviews = f.type === "Key"
145
+ ? getState().keyFieldviews
146
+ : (f.type && f.type.fieldviews) || {};
147
+ for (const [nm, fv] of Object.entries(fieldviews)) {
148
+ if (fv.configFields)
149
+ fieldViewConfigForms[f.name][nm] = await applyAsync(fv.configFields, f);
150
+ }
151
+ }
152
+ return fieldViewConfigForms;
153
+ });
154
+ /**
155
+ * @function
156
+ * @param {Table|object} table
157
+ * @param {string} viewname
158
+ * @param {boolean}
159
+ * @returns {Promise<object[]>}
160
+ */
161
+ const get_link_view_opts = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({ label: is.str, name: is.str })))), async (table, viewname) => {
162
+ const own_link_views = await View.find_possible_links_to_table(table);
163
+ const link_view_opts = own_link_views
164
+ .filter((v) => v.name !== viewname)
165
+ .map((v) => ({
166
+ label: `${v.name} [${v.viewtemplate} ${table.name}]`,
167
+ name: `Own:${v.name}`,
168
+ }));
169
+ const link_view_names = new Set();
170
+ const child_views = await get_child_views(table, viewname);
171
+ for (const { relation, related_table, views } of child_views) {
172
+ for (const view of views) {
173
+ const name = `${view.name}.${related_table.name}.${relation.name}`;
174
+ link_view_names.add(name);
175
+ link_view_opts.push({
176
+ name: `ChildList:${view.name}.${related_table.name}.${relation.name}`,
177
+ label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.label}]`,
178
+ });
179
+ }
180
+ }
181
+ const parent_views = await get_parent_views(table, viewname);
182
+ for (const { relation, related_table, views } of parent_views) {
183
+ for (const view of views) {
184
+ link_view_opts.push({
185
+ name: `ParentShow:${view.name}.${related_table.name}.${relation.name}`,
186
+ label: `${view.name} [${view.viewtemplate} ${relation.name}.${related_table.name}]`,
187
+ });
188
+ }
189
+ }
190
+ const onetoone_views = await get_onetoone_views(table, viewname);
191
+ for (const { relation, related_table, views } of onetoone_views) {
192
+ for (const view of views) {
193
+ const name = `${view.name}.${related_table.name}.${relation.name}`;
194
+ if (!link_view_names.has(name))
195
+ link_view_opts.push({
196
+ name: `OneToOneShow:${view.name}.${related_table.name}.${relation.name}`,
197
+ label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.label}]`,
198
+ });
199
+ }
200
+ }
201
+ const independent_views = await View.find_all_views_where(({ state_fields }) => !state_fields.some((sf) => sf.required));
202
+ independent_views.forEach((view) => {
203
+ link_view_opts.push({
204
+ label: `${view.name} [${view.viewtemplate}]`,
205
+ name: `Independent:${view.name}`,
206
+ });
207
+ });
208
+ return link_view_opts;
209
+ });
210
+ /**
211
+ * Get Action configuration fields
212
+ * @param {object} action
213
+ * @param {object} table
214
+ * @returns {Promise<object[]>}
215
+ */
216
+ const getActionConfigFields = async (action, table) => typeof action.configFields === "function"
217
+ ? await action.configFields({ table })
218
+ : action.configFields || [];
219
+ /**
220
+ * @function
221
+ * @param {Table|object} table
222
+ * @param {string} viewname
223
+ * @param {object} req
224
+ * @returns {Promise<object[]>}
225
+ */
226
+ const field_picker_fields = contract(is.fun(is.obj({ table: is_tablely, viewname: is.str }), is.promise(is.array(fieldlike))), async ({ table, viewname, req }) => {
227
+ const __ = (...s) => (req ? req.__(...s) : s.join(""));
228
+ const fields = await table.getFields();
229
+ for (const field of fields) {
230
+ if (field.type === "Key") {
231
+ field.reftable = await Table.findOne({ name: field.reftable_name });
232
+ if (field.reftable)
233
+ await field.reftable.getFields();
234
+ }
235
+ }
236
+ const boolfields = fields.filter((f) => f.type && f.type.name === "Bool");
237
+ const stateActions = getState().actions;
238
+ const stateActionKeys = Object.entries(stateActions)
239
+ .filter(([k, v]) => !v.requireRow && !v.disableInList)
240
+ .map(([k, v]) => k);
241
+ const actions = [
242
+ "Delete",
243
+ ...boolfields.map((f) => `Toggle ${f.name}`),
244
+ ...stateActionKeys,
245
+ ];
246
+ const triggers = await Trigger.find({
247
+ when_trigger: { or: ["API call", "Never"] },
248
+ });
249
+ triggers.forEach((tr) => {
250
+ actions.push(tr.name);
251
+ });
252
+ const actionConfigFields = [];
253
+ for (const [name, action] of Object.entries(stateActions)) {
254
+ if (!stateActionKeys.includes(name))
255
+ continue;
256
+ const cfgFields = await getActionConfigFields(action, table);
257
+ for (const field of cfgFields) {
258
+ const cfgFld = {
259
+ ...field,
260
+ showIf: {
261
+ action_name: name,
262
+ type: "Action",
263
+ ...(field.showIf || {}),
264
+ },
265
+ };
266
+ if (cfgFld.input_type === "code")
267
+ cfgFld.input_type = "textarea";
268
+ actionConfigFields.push(cfgFld);
269
+ }
270
+ }
271
+ const fldOptions = fields.map((f) => f.name);
272
+ const { field_view_options } = calcfldViewOptions(fields, "show");
273
+ const fieldViewConfigForms = await calcfldViewConfig(fields, false);
274
+ const fvConfigFields = [];
275
+ for (const [field_name, fvOptFields] of Object.entries(fieldViewConfigForms)) {
276
+ for (const [fieldview, formFields] of Object.entries(fvOptFields)) {
277
+ for (const formField of formFields) {
278
+ fvConfigFields.push({
279
+ ...formField,
280
+ showIf: {
281
+ type: "Field",
282
+ field_name,
283
+ fieldview,
284
+ },
285
+ });
286
+ }
287
+ }
288
+ }
289
+ const link_view_opts = await get_link_view_opts(table, viewname);
290
+ const { parent_field_list } = await table.get_parent_relations(true);
291
+ const { child_field_list, child_relations, } = await table.get_child_relations();
292
+ const aggStatOptions = {};
293
+ const agg_field_opts = child_relations.map(({ table, key_field }) => {
294
+ aggStatOptions[`${table.name}.${key_field.name}`] = [
295
+ "Count",
296
+ "Avg",
297
+ "Sum",
298
+ "Max",
299
+ "Min",
300
+ ];
301
+ table.fields.forEach((f) => {
302
+ if (f.type && f.type.name === "Date") {
303
+ aggStatOptions[`${table.name}.${key_field.name}`].push(`Latest ${f.name}`);
304
+ }
305
+ });
306
+ return {
307
+ name: `agg_field`,
308
+ label: __("On Field"),
309
+ type: "String",
310
+ required: true,
311
+ attributes: {
312
+ options: table.fields
313
+ .filter((f) => !f.calculated || f.stored)
314
+ .map((f) => f.name),
315
+ },
316
+ showIf: {
317
+ agg_relation: `${table.name}.${key_field.name}`,
318
+ type: "Aggregation",
319
+ },
320
+ };
321
+ });
322
+ return [
323
+ {
324
+ name: "type",
325
+ label: __("Type"),
326
+ type: "String",
327
+ required: true,
328
+ attributes: {
329
+ //TODO omit when no options
330
+ options: [
331
+ {
332
+ name: "Field",
333
+ label: __(`Field in %s table`, table.name),
334
+ },
335
+ { name: "Action", label: __("Action on row") },
336
+ ...(link_view_opts.length > 0
337
+ ? [{ name: "ViewLink", label: __("Link to other view") }]
338
+ : []),
339
+ { name: "Link", label: __("Link to anywhere") },
340
+ ...(parent_field_list.length > 0
341
+ ? [{ name: "JoinField", label: __("Join Field") }]
342
+ : []),
343
+ ...(child_field_list.length > 0
344
+ ? [{ name: "Aggregation", label: __("Aggregation") }]
345
+ : []),
346
+ ],
347
+ },
348
+ },
349
+ {
350
+ name: "field_name",
351
+ label: __("Field"),
352
+ type: "String",
353
+ required: true,
354
+ attributes: {
355
+ options: fldOptions,
356
+ },
357
+ showIf: { type: "Field" },
358
+ },
359
+ {
360
+ name: "fieldview",
361
+ label: __("Field view"),
362
+ type: "String",
363
+ required: false,
364
+ attributes: {
365
+ calcOptions: ["field_name", field_view_options],
366
+ },
367
+ showIf: { type: "Field" },
368
+ },
369
+ ...fvConfigFields,
370
+ {
371
+ name: "action_name",
372
+ label: __("Action"),
373
+ type: "String",
374
+ required: true,
375
+ attributes: {
376
+ options: actions,
377
+ },
378
+ showIf: { type: "Action" },
379
+ },
380
+ {
381
+ name: "action_label",
382
+ label: __("Action Label"),
383
+ type: "String",
384
+ showIf: { type: "Action" },
385
+ },
386
+ {
387
+ name: "action_label_formula",
388
+ label: __("Action label is a formula?"),
389
+ type: "Bool",
390
+ required: false,
391
+ showIf: { type: "Action" },
392
+ },
393
+ {
394
+ name: "action_style",
395
+ label: __("Action Style"),
396
+ type: "String",
397
+ required: true,
398
+ attributes: {
399
+ options: [
400
+ { name: "btn-primary", label: "Primary button" },
401
+ { name: "btn-secondary", label: "Secondary button" },
402
+ { name: "btn-success", label: "Success button" },
403
+ { name: "btn-danger", label: "Danger button" },
404
+ { name: "btn-outline-primary", label: "Primary outline button" },
405
+ {
406
+ name: "btn-outline-secondary",
407
+ label: "Secondary outline button",
408
+ },
409
+ { name: "btn-link", label: "Link" },
410
+ ],
411
+ },
412
+ showIf: { type: "Action" },
413
+ },
414
+ {
415
+ name: "action_size",
416
+ label: __("Button size"),
417
+ type: "String",
418
+ required: true,
419
+ attributes: {
420
+ options: [
421
+ { name: "", label: "Standard" },
422
+ { name: "btn-lg", label: "Large" },
423
+ { name: "btn-sm", label: "Small" },
424
+ { name: "btn-block", label: "Block" },
425
+ { name: "btn-block btn-lg", label: "Large block" },
426
+ ],
427
+ },
428
+ showIf: { type: "Action" },
429
+ },
430
+ {
431
+ name: "confirm",
432
+ label: __("User confirmation?"),
433
+ type: "Bool",
434
+ showIf: { type: "Action" },
435
+ },
436
+ ...actionConfigFields,
437
+ {
438
+ name: "view",
439
+ label: __("View"),
440
+ type: "String",
441
+ required: true,
442
+ attributes: {
443
+ options: link_view_opts,
444
+ },
445
+ showIf: { type: "ViewLink" },
446
+ },
447
+ {
448
+ name: "view_label",
449
+ label: __("View label"),
450
+ sublabel: __("Leave blank for default label."),
451
+ type: "String",
452
+ required: false,
453
+ showIf: { type: "ViewLink" },
454
+ },
455
+ {
456
+ name: "view_label_formula",
457
+ label: __("View label is a formula?"),
458
+ type: "Bool",
459
+ required: false,
460
+ showIf: { type: "ViewLink" },
461
+ },
462
+ {
463
+ name: "in_modal",
464
+ label: __("Open in popup modal?"),
465
+ type: "Bool",
466
+ required: false,
467
+ showIf: { type: "ViewLink" },
468
+ },
469
+ {
470
+ name: "link_style",
471
+ label: __("Link Style"),
472
+ type: "String",
473
+ required: true,
474
+ attributes: {
475
+ options: [
476
+ { name: "", label: "Link" },
477
+ { name: "btn btn-primary", label: "Primary button" },
478
+ { name: "btn btn-secondary", label: "Secondary button" },
479
+ { name: "btn btn-success", label: "Success button" },
480
+ { name: "btn btn-danger", label: "Danger button" },
481
+ {
482
+ name: "btn btn-outline-primary",
483
+ label: "Primary outline button",
484
+ },
485
+ {
486
+ name: "btn btn-outline-secondary",
487
+ label: "Secondary outline button",
488
+ },
489
+ ],
490
+ },
491
+ showIf: { type: "ViewLink" },
492
+ },
493
+ {
494
+ name: "link_size",
495
+ label: __("Link size"),
496
+ type: "String",
497
+ required: true,
498
+ attributes: {
499
+ options: [
500
+ { name: "", label: "Standard" },
501
+ { name: "btn-lg", label: "Large" },
502
+ { name: "btn-sm", label: "Small" },
503
+ { name: "btn-block", label: "Block" },
504
+ { name: "btn-block btn-lg", label: "Large block" },
505
+ ],
506
+ },
507
+ showIf: { type: "ViewLink" },
508
+ },
509
+ {
510
+ name: "link_text",
511
+ label: __("Link text"),
512
+ type: "String",
513
+ required: true,
514
+ showIf: { type: "Link" },
515
+ },
516
+ {
517
+ name: "link_text_formula",
518
+ label: __("Link text is a formula?"),
519
+ type: "Bool",
520
+ required: false,
521
+ showIf: { type: "Link" },
522
+ },
523
+ {
524
+ name: "link_url",
525
+ label: __("Link URL"),
526
+ type: "String",
527
+ required: true,
528
+ showIf: { type: "Link" },
529
+ },
530
+ {
531
+ name: "link_url_formula",
532
+ label: __("Link URL is a formula?"),
533
+ type: "Bool",
534
+ required: false,
535
+ showIf: { type: "Link" },
536
+ },
537
+ {
538
+ name: "link_target_blank",
539
+ label: __("Open in new tab"),
540
+ type: "Bool",
541
+ required: false,
542
+ showIf: { type: "Link" },
543
+ },
544
+ {
545
+ name: "join_field",
546
+ label: __("Join Field"),
547
+ type: "String",
548
+ required: true,
549
+ attributes: {
550
+ options: parent_field_list,
551
+ },
552
+ showIf: { type: "JoinField" },
553
+ },
554
+ {
555
+ name: "agg_relation",
556
+ label: __("Relation"),
557
+ type: "String",
558
+ required: true,
559
+ attributes: {
560
+ options: child_field_list,
561
+ },
562
+ showIf: { type: "Aggregation" },
563
+ },
564
+ ...agg_field_opts,
565
+ {
566
+ name: "stat",
567
+ label: __("Statistic"),
568
+ type: "String",
569
+ required: true,
570
+ attributes: {
571
+ calcOptions: ["agg_relation", aggStatOptions],
572
+ },
573
+ showIf: { type: "Aggregation" },
574
+ },
575
+ {
576
+ name: "aggwhere",
577
+ label: __("Where"),
578
+ sublabel: __("Formula"),
579
+ type: "String",
580
+ required: false,
581
+ showIf: { type: "Aggregation" },
582
+ },
583
+ {
584
+ name: "state_field",
585
+ label: __("In search form"),
586
+ type: "Bool",
587
+ showIf: { type: "Field" },
588
+ },
589
+ {
590
+ name: "header_label",
591
+ label: __("Header label"),
592
+ type: "String",
593
+ },
594
+ {
595
+ name: "col_width",
596
+ label: __("Column width"),
597
+ type: "Integer",
598
+ },
599
+ {
600
+ name: "col_width_units",
601
+ label: __("Column width units"),
602
+ type: "String",
603
+ required: true,
604
+ fieldview: "radio_group",
605
+ attributes: {
606
+ inline: true,
607
+ options: ["px", "%", "vw", "em", "rem"],
608
+ },
609
+ },
610
+ ];
611
+ });
612
+ /**
613
+ * get_child_views Contract
614
+ * @function
615
+ * @param {Table|object} table
616
+ * @param {string} viewname
617
+ * @returns {Promise<object[]>}
618
+ */
619
+ const get_child_views = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({
620
+ relation: is.class("Field"),
621
+ related_table: is.class("Table"),
622
+ views: is.array(is.class("View")),
623
+ })))), async (table, viewname) => {
624
+ const rels = await Field.find({ reftable_name: table.name });
625
+ var child_views = [];
626
+ for (const relation of rels) {
627
+ const related_table = await Table.findOne({ id: relation.table_id });
628
+ const views = await View.find_table_views_where(related_table.id, ({ state_fields, viewrow }) => viewrow.name !== viewname && state_fields.every((sf) => !sf.required));
629
+ child_views.push({ relation, related_table, views });
630
+ }
631
+ return child_views;
632
+ });
633
+ /**
634
+ * get_parent_views Contract
635
+ * @function
636
+ * @param {Table|object} table
637
+ * @param {string} viewname
638
+ * @returns {Promise<object[]>}
639
+ */
640
+ const get_parent_views = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({
641
+ relation: is.class("Field"),
642
+ related_table: is.class("Table"),
643
+ views: is.array(is.class("View")),
644
+ })))), async (table, viewname) => {
645
+ var parent_views = [];
646
+ const parentrels = (await table.getFields()).filter((f) => f.is_fkey && f.type !== "File");
647
+ for (const relation of parentrels) {
648
+ const related_table = await Table.findOne({
649
+ name: relation.reftable_name,
650
+ });
651
+ const views = await View.find_table_views_where(related_table, ({ state_fields, viewrow }) => viewrow.name !== viewname &&
652
+ state_fields.some((sf) => sf.name === "id"));
653
+ parent_views.push({ relation, related_table, views });
654
+ }
655
+ return parent_views;
656
+ });
657
+ /**
658
+ * get_onetoone_views Contract
659
+ * @function
660
+ * @param {Table|is_tablely} table
661
+ * @param {string} viewname
662
+ * @returns {Promise<object[]>}
663
+ */
664
+ const get_onetoone_views = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({
665
+ relation: is.class("Field"),
666
+ related_table: is.class("Table"),
667
+ views: is.array(is.class("View")),
668
+ })))), async (table, viewname) => {
669
+ const rels = await Field.find({
670
+ reftable_name: table.name,
671
+ is_unique: true,
672
+ });
673
+ var child_views = [];
674
+ for (const relation of rels) {
675
+ const related_table = await Table.findOne({ id: relation.table_id });
676
+ const views = await View.find_table_views_where(related_table.id, ({ state_fields, viewrow }) => viewrow.name !== viewname &&
677
+ state_fields.some((sf) => sf.name === "id"));
678
+ child_views.push({ relation, related_table, views });
679
+ }
680
+ return child_views;
681
+ });
682
+ /**
683
+ * picked_fields_to_query Contract
684
+ * @function
685
+ * @param {object[]} columns
686
+ * @param {Field[]} fields
687
+ * @throws {InvalidConfiguration}
688
+ * @returns {object}
689
+ */
690
+ const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is.class("Field"))], is_table_query), (columns, fields) => {
691
+ var joinFields = {};
692
+ var aggregations = {};
693
+ (columns || []).forEach((column) => {
694
+ if (column.type === "JoinField") {
695
+ if (column.join_field && column.join_field.split) {
696
+ const kpath = column.join_field.split(".");
697
+ if (kpath.length === 2) {
698
+ const [refNm, targetNm] = kpath;
699
+ joinFields[`${refNm}_${targetNm}`] = {
700
+ ref: refNm,
701
+ target: targetNm,
702
+ };
703
+ }
704
+ else {
705
+ const [refNm, through, targetNm] = kpath;
706
+ joinFields[`${refNm}_${through}_${targetNm}`] = {
707
+ ref: refNm,
708
+ target: targetNm,
709
+ through,
710
+ };
711
+ }
712
+ }
713
+ else {
714
+ throw new InvalidConfiguration(`Join field is specified as column but no join field is chosen`);
715
+ }
716
+ }
717
+ else if (column.type === "ViewLink") {
718
+ if (column.view && column.view.split) {
719
+ const [vtype, vrest] = column.view.split(":");
720
+ if (vtype === "ParentShow") {
721
+ const [pviewnm, ptbl, pfld] = vrest.split(".");
722
+ const field = fields.find((f) => f.name === pfld);
723
+ if (field && field.attributes.summary_field)
724
+ joinFields[`summary_field_${ptbl.toLowerCase()}`] = {
725
+ ref: pfld,
726
+ target: field.attributes.summary_field,
727
+ };
728
+ }
729
+ }
730
+ }
731
+ else if (column.type === "Aggregation") {
732
+ //console.log(column)
733
+ if (column.agg_relation && column.agg_relation.split) {
734
+ const [table, fld] = column.agg_relation.split(".");
735
+ const field = column.agg_field;
736
+ const targetNm = (column.stat.replace(" ", "") +
737
+ "_" +
738
+ table +
739
+ "_" +
740
+ fld +
741
+ db.sqlsanitize(column.aggwhere || "")).toLowerCase();
742
+ aggregations[targetNm] = {
743
+ table,
744
+ ref: fld,
745
+ where: jsexprToSQL(column.aggwhere),
746
+ field,
747
+ aggregate: column.stat,
748
+ };
749
+ }
750
+ }
751
+ });
752
+ return { joinFields, aggregations };
753
+ });
754
+ /**
755
+ * @function
756
+ * @param {object}
757
+ * @param {object}
758
+ * @param {string} - missing in contract
759
+ * @returns {object}
760
+ */
761
+ const stateFieldsToQuery = contract(is.fun(is.obj(), is.obj()), ({ state, fields, prefix = "" }) => {
762
+ let q = {};
763
+ const stateKeys = Object.keys(state);
764
+ if (state._sortby) {
765
+ const field = fields.find((f) => f.name === state._sortby);
766
+ //this is ok because it has to match fieldname
767
+ if (field)
768
+ q.orderBy = state._sortby;
769
+ if (state._sortdesc)
770
+ q.orderDesc = true;
771
+ }
772
+ if (state._pagesize)
773
+ q.limit = parseInt(state._pagesize);
774
+ if (state._pagesize && state._page)
775
+ q.offset = (parseInt(state._page) - 1) * parseInt(state._pagesize);
776
+ const latNear = stateKeys.find((k) => k.startsWith("_near_lat_"));
777
+ const longNear = stateKeys.find((k) => k.startsWith("_near_long_"));
778
+ if (latNear && longNear) {
779
+ const latField = prefix + db.sqlsanitize(latNear.replace("_near_lat_", ""));
780
+ const longField = prefix + db.sqlsanitize(longNear.replace("_near_long_", ""));
781
+ const lat = parseFloat(state[latNear]);
782
+ const long = parseFloat(state[longNear]);
783
+ q.orderBy = { distance: { lat, long, latField, longField } };
784
+ }
785
+ return q;
786
+ });
787
+ /**
788
+ *
789
+ * @param {object} container
790
+ * @param {string} key
791
+ * @param {object} x
792
+ * @returns {void}
793
+ */
794
+ const addOrCreateList = (container, key, x) => {
795
+ if (container[key])
796
+ container[key].push(x);
797
+ else
798
+ container[key] = [x];
799
+ };
800
+ /**
801
+ * @function
802
+ * @param {object} opts
803
+ * @param {Field[]} opts.fields
804
+ * @param {object} opts.state missing in contract
805
+ * @param {boolean} [opts.approximate = true]
806
+ * @returns {object}
807
+ */
808
+ const stateFieldsToWhere = contract(is.fun(is.obj({
809
+ fields: is.array(is.class("Field")),
810
+ approximate: is.maybe(is.bool),
811
+ }), is.obj()), ({ fields, state, approximate = true }) => {
812
+ var qstate = {};
813
+ Object.entries(state).forEach(([k, v]) => {
814
+ if (k === "_fts") {
815
+ qstate[k] = { searchTerm: v.replace(/\0/g, ""), fields };
816
+ return;
817
+ }
818
+ const field = fields.find((fld) => fld.name == k);
819
+ if (k.startsWith("_fromdate_")) {
820
+ const datefield = db.sqlsanitize(k.replace("_fromdate_", ""));
821
+ const dfield = fields.find((fld) => fld.name == datefield);
822
+ if (dfield)
823
+ addOrCreateList(qstate, datefield, { gt: new Date(v), equal: true });
824
+ }
825
+ else if (k.startsWith("_todate_")) {
826
+ const datefield = db.sqlsanitize(k.replace("_todate_", ""));
827
+ const dfield = fields.find((fld) => fld.name == datefield);
828
+ if (dfield)
829
+ addOrCreateList(qstate, datefield, { lt: new Date(v), equal: true });
830
+ }
831
+ else if (k.startsWith("_gte_")) {
832
+ const datefield = db.sqlsanitize(k.replace("_gte_", ""));
833
+ const dfield = fields.find((fld) => fld.name == datefield);
834
+ if (dfield)
835
+ addOrCreateList(qstate, datefield, { gt: v, equal: true });
836
+ }
837
+ else if (k.startsWith("_lte_")) {
838
+ const datefield = db.sqlsanitize(k.replace("_lte_", ""));
839
+ const dfield = fields.find((fld) => fld.name == datefield);
840
+ if (dfield)
841
+ addOrCreateList(qstate, datefield, { lt: v, equal: true });
842
+ }
843
+ else if (field &&
844
+ field.type.name === "String" &&
845
+ !(field.attributes && field.attributes.options) &&
846
+ approximate) {
847
+ qstate[k] = { ilike: v };
848
+ }
849
+ else if (field && field.type.name === "Bool" && state[k] === "?") {
850
+ // omit
851
+ }
852
+ else if (field && field.type && field.type.read)
853
+ qstate[k] = Array.isArray(v)
854
+ ? { or: v.map(field.type.read) }
855
+ : field.type.read(v);
856
+ else if (field)
857
+ qstate[k] = v;
858
+ else if (k.includes(".")) {
859
+ const kpath = k.split(".");
860
+ if (kpath.length === 3) {
861
+ const [jtNm, jFieldNm, lblField] = kpath;
862
+ qstate.id = [
863
+ ...(qstate.id ? [qstate.id] : []),
864
+ {
865
+ // where id in (select jFieldNm from jtnm where lblField=v)
866
+ inSelect: {
867
+ table: `${db.getTenantSchemaPrefix()}"${db.sqlsanitize(jtNm)}"`,
868
+ field: db.sqlsanitize(jFieldNm),
869
+ where: { [db.sqlsanitize(lblField)]: v },
870
+ },
871
+ },
872
+ ];
873
+ }
874
+ }
875
+ });
876
+ return qstate;
877
+ });
878
+ /**
879
+ * initial_config_all_fields Contract
880
+ * @function
881
+ * @param {boolean}
882
+ * @returns {function}
883
+ */
884
+ const initial_config_all_fields = contract(is.fun(is.bool, is.fun(is.obj({ table_id: is.posint }), is.promise(is.obj({ columns: is.array(is.obj()), layout: is.obj() })))), (isEdit) => async ({ table_id, exttable_name }) => {
885
+ const table = await Table.findOne(table_id ? { id: table_id } : { name: exttable_name });
886
+ const fields = (await table.getFields()).filter((f) => !f.primary_key && (!isEdit || !f.calculated));
887
+ var cfg = { columns: [] };
888
+ var aboves = [null];
889
+ fields.forEach((f) => {
890
+ if (!f.type)
891
+ return;
892
+ const flabel = {
893
+ above: [
894
+ null,
895
+ {
896
+ type: "blank",
897
+ block: false,
898
+ contents: f.label,
899
+ textStyle: "",
900
+ ...(isEdit ? { labelFor: f.name } : {}),
901
+ },
902
+ ],
903
+ };
904
+ if (f.is_fkey &&
905
+ f.type !== "File" &&
906
+ f.reftable_name !== "users" &&
907
+ !isEdit) {
908
+ cfg.columns.push({
909
+ type: "JoinField",
910
+ join_field: `${f.name}.${f.attributes.summary_field}`,
911
+ });
912
+ aboves.push({
913
+ widths: [2, 10],
914
+ besides: [
915
+ flabel,
916
+ {
917
+ above: [
918
+ null,
919
+ {
920
+ type: "join_field",
921
+ block: false,
922
+ textStyle: "",
923
+ join_field: `${f.name}.${f.attributes.summary_field}`,
924
+ },
925
+ ],
926
+ },
927
+ ],
928
+ });
929
+ }
930
+ else if (f.reftable_name !== "users") {
931
+ const fvNm = f.type.fieldviews
932
+ ? Object.entries(f.type.fieldviews).find(([nm, fv]) => fv.isEdit === isEdit)[0]
933
+ : f.type === "File" && !isEdit
934
+ ? Object.keys(getState().fileviews)[0]
935
+ : f.type === "File" && isEdit
936
+ ? "upload"
937
+ : f.type === "Key"
938
+ ? "select"
939
+ : undefined;
940
+ cfg.columns.push({
941
+ field_name: f.name,
942
+ type: "Field",
943
+ fieldview: fvNm,
944
+ state_field: true,
945
+ });
946
+ aboves.push({
947
+ widths: [2, 10],
948
+ besides: [
949
+ flabel,
950
+ {
951
+ above: [
952
+ null,
953
+ {
954
+ type: "field",
955
+ block: false,
956
+ fieldview: fvNm,
957
+ textStyle: "",
958
+ field_name: f.name,
959
+ },
960
+ ],
961
+ },
962
+ ],
963
+ });
964
+ }
965
+ aboves.push({ type: "line_break" });
966
+ });
967
+ if (isEdit)
968
+ aboves.push({
969
+ type: "action",
970
+ block: false,
971
+ minRole: 10,
972
+ action_name: "Save",
973
+ });
974
+ cfg.layout = { above: aboves };
975
+ return cfg;
976
+ });
977
+ /**
978
+ *
979
+ * @param {string} x
980
+ * @returns {number|undefined}
981
+ */
982
+ const strictParseInt = (x) => {
983
+ const y = +x;
984
+ return !isNaN(y) && y ? y : undefined;
985
+ };
986
+ /**
987
+ *
988
+ * @param {object} state
989
+ * @param {object[]} fields
990
+ * @returns {object}
991
+ */
992
+ const readState = (state, fields, req) => {
993
+ fields.forEach((f) => {
994
+ const current = state[f.name];
995
+ if (typeof current !== "undefined") {
996
+ if (Array.isArray(current) && f.type.read) {
997
+ state[f.name] = current.map(f.type.read);
998
+ }
999
+ else if (f.type.read)
1000
+ state[f.name] = f.type.read(current);
1001
+ else if (typeof current === "string" && current.startsWith("Preset:")) {
1002
+ const preset = f.presets[current.replace("Preset:", "")];
1003
+ state[f.name] = preset(req);
1004
+ }
1005
+ else if (f.type === "Key" || f.type === "File")
1006
+ state[f.name] =
1007
+ current === "null" || current === "" || current === null
1008
+ ? null
1009
+ : getState().types[f.reftype].read(current);
1010
+ }
1011
+ });
1012
+ return state;
1013
+ };
1014
+ /**
1015
+ *
1016
+ * @param {object} state
1017
+ * @param {object[]} fields
1018
+ * @returns {boolean|*}
1019
+ */
1020
+ const readStateStrict = (state, fields) => {
1021
+ let hasErrors = false;
1022
+ fields.forEach((f) => {
1023
+ const current = state[f.name];
1024
+ //console.log(f.name, current, typeof current);
1025
+ if (typeof current !== "undefined") {
1026
+ if (f.type.read) {
1027
+ const readval = f.type.read(current);
1028
+ if (typeof readval === "undefined") {
1029
+ if (current === "" && !f.required)
1030
+ delete state[f.name];
1031
+ else
1032
+ hasErrors = true;
1033
+ }
1034
+ if (f.type && f.type.validate) {
1035
+ const vres = f.type.validate(f.attributes || {})(readval);
1036
+ if (vres.error)
1037
+ hasErrors = true;
1038
+ }
1039
+ state[f.name] = readval;
1040
+ }
1041
+ else if (f.type === "Key" || f.type === "File")
1042
+ state[f.name] =
1043
+ current === "null" || current === "" || current === null
1044
+ ? null
1045
+ : +current;
1046
+ }
1047
+ else if (f.required && !f.primary_key)
1048
+ hasErrors = true;
1049
+ });
1050
+ return hasErrors ? false : state;
1051
+ };
1052
+ /**
1053
+ *
1054
+ * @param {function} get_json_list
1055
+ * @param {object[]} fields0
1056
+ * @returns {object}
1057
+ */
1058
+ const json_list_to_external_table = (get_json_list, fields0) => {
1059
+ const fields = fields0.map((f) => f.constructor.name === Object.name ? new Field(f) : f);
1060
+ const getRows = async (where = {}, selopts = {}) => {
1061
+ let data_in = await get_json_list({ where, ...selopts });
1062
+ const restricts = Object.entries(where);
1063
+ const data_filtered = restricts.length === 0
1064
+ ? data_in
1065
+ : data_in.filter((x) => restricts.every(([k, v]) => x[k] === v));
1066
+ if (selopts.orderBy) {
1067
+ const cmp = selopts.orderDesc
1068
+ ? new Function("a,b", `return b.${selopts.orderBy}-a.${selopts.orderBy}`)
1069
+ : new Function("a,b", `return a.${selopts.orderBy}-b.${selopts.orderBy}`);
1070
+ data_filtered.sort(cmp);
1071
+ }
1072
+ if (selopts.limit)
1073
+ return data_filtered.slice(selopts.offset || 0, (selopts.offset || 0) + selopts.limit);
1074
+ else
1075
+ return data_filtered;
1076
+ };
1077
+ const tbl = {
1078
+ getFields() {
1079
+ return fields;
1080
+ },
1081
+ fields,
1082
+ getRows,
1083
+ get min_role_read() {
1084
+ const roles = getState().getConfig("exttables_min_role_read", {});
1085
+ return roles[tbl.name] || 10;
1086
+ },
1087
+ getJoinedRows(opts = {}) {
1088
+ const { where, ...rest } = opts;
1089
+ return getRows(where || {}, rest || {});
1090
+ },
1091
+ async countRows(where) {
1092
+ let data_in = await get_json_list({ where });
1093
+ return data_in.length;
1094
+ },
1095
+ get_child_relations() {
1096
+ return { child_relations: [], child_field_list: [] };
1097
+ },
1098
+ get_parent_relations() {
1099
+ return { parent_relations: [], parent_field_list: [] };
1100
+ },
1101
+ external: true,
1102
+ owner_fieldname() {
1103
+ return null;
1104
+ },
1105
+ async distinctValues(fldNm) {
1106
+ let data_in = await get_json_list({});
1107
+ const s = new Set(data_in.map((x) => x[fldNm]));
1108
+ return [...s];
1109
+ },
1110
+ };
1111
+ return tbl;
1112
+ };
1113
+ /**
1114
+ *
1115
+ * @param {object} col
1116
+ * @param {object} req
1117
+ * @param {...*} rest
1118
+ * @returns {Promise<*>}
1119
+ */
1120
+ const run_action_column = async ({ col, req, ...rest }) => {
1121
+ let state_action = getState().actions[col.action_name];
1122
+ let configuration;
1123
+ if (state_action)
1124
+ configuration = col.configuration;
1125
+ else {
1126
+ const trigger = await Trigger.findOne({ name: col.action_name });
1127
+ state_action = getState().actions[trigger.action];
1128
+ configuration = trigger.configuration;
1129
+ }
1130
+ return await state_action.run({
1131
+ configuration,
1132
+ user: req.user,
1133
+ req,
1134
+ ...rest,
1135
+ });
1136
+ };
1137
+ module.exports = {
1138
+ field_picker_fields,
1139
+ picked_fields_to_query,
1140
+ get_child_views,
1141
+ get_parent_views,
1142
+ stateFieldsToWhere,
1143
+ stateFieldsToQuery,
1144
+ initial_config_all_fields,
1145
+ calcfldViewOptions,
1146
+ get_link_view_opts,
1147
+ is_column,
1148
+ readState,
1149
+ readStateStrict,
1150
+ stateToQueryString,
1151
+ link_view,
1152
+ getActionConfigFields,
1153
+ calcfldViewConfig,
1154
+ strictParseInt,
1155
+ run_action_column,
1156
+ json_list_to_external_table,
1157
+ };
1158
+ //# sourceMappingURL=plugin-helper.js.map