@saltcorn/data 0.7.1-beta.3 → 0.7.2-beta.10

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 (261) hide show
  1. package/dist/base-plugin/actions.d.ts.map +1 -1
  2. package/dist/base-plugin/actions.js +5 -1
  3. package/dist/base-plugin/actions.js.map +1 -1
  4. package/dist/base-plugin/fieldviews.d.ts +29 -0
  5. package/dist/base-plugin/fieldviews.d.ts.map +1 -1
  6. package/dist/base-plugin/fieldviews.js +60 -5
  7. package/dist/base-plugin/fieldviews.js.map +1 -1
  8. package/dist/base-plugin/fileviews.d.ts.map +1 -1
  9. package/dist/base-plugin/fileviews.js +20 -5
  10. package/dist/base-plugin/fileviews.js.map +1 -1
  11. package/dist/base-plugin/index.d.ts +309 -84
  12. package/dist/base-plugin/index.d.ts.map +1 -1
  13. package/dist/base-plugin/types.d.ts +127 -65
  14. package/dist/base-plugin/types.d.ts.map +1 -1
  15. package/dist/base-plugin/types.js +152 -36
  16. package/dist/base-plugin/types.js.map +1 -1
  17. package/dist/base-plugin/viewtemplates/edit.d.ts +47 -9
  18. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  19. package/dist/base-plugin/viewtemplates/edit.js +266 -113
  20. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  21. package/dist/base-plugin/viewtemplates/feed.d.ts +14 -1
  22. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
  23. package/dist/base-plugin/viewtemplates/feed.js +20 -8
  24. package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
  25. package/dist/base-plugin/viewtemplates/filter.d.ts +17 -1
  26. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
  27. package/dist/base-plugin/viewtemplates/filter.js +66 -45
  28. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  29. package/dist/base-plugin/viewtemplates/list.d.ts +21 -1
  30. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  31. package/dist/base-plugin/viewtemplates/list.js +63 -40
  32. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  33. package/dist/base-plugin/viewtemplates/listshowlist.d.ts +14 -1
  34. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
  35. package/dist/base-plugin/viewtemplates/listshowlist.js +15 -4
  36. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
  37. package/dist/base-plugin/viewtemplates/room.d.ts +41 -1
  38. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
  39. package/dist/base-plugin/viewtemplates/room.js +107 -80
  40. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  41. package/dist/base-plugin/viewtemplates/show.d.ts +38 -4
  42. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  43. package/dist/base-plugin/viewtemplates/show.js +125 -76
  44. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  45. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +26 -7
  46. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  47. package/dist/base-plugin/viewtemplates/viewable_fields.js +60 -48
  48. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  49. package/dist/db/connect.d.ts.map +1 -1
  50. package/dist/db/connect.js +8 -1
  51. package/dist/db/connect.js.map +1 -1
  52. package/dist/db/connect_mobile.d.ts +9 -0
  53. package/dist/db/connect_mobile.d.ts.map +1 -0
  54. package/dist/db/connect_mobile.js +15 -0
  55. package/dist/db/connect_mobile.js.map +1 -0
  56. package/dist/db/fixtures.d.ts.map +1 -1
  57. package/dist/db/fixtures.js +6 -1
  58. package/dist/db/fixtures.js.map +1 -1
  59. package/dist/db/index.d.ts.map +1 -1
  60. package/dist/db/index.js +16 -2
  61. package/dist/db/index.js.map +1 -1
  62. package/dist/db/state.d.ts +214 -52
  63. package/dist/db/state.d.ts.map +1 -1
  64. package/dist/db/state.js +115 -104
  65. package/dist/db/state.js.map +1 -1
  66. package/dist/index.d.ts +8 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +32 -3
  69. package/dist/index.js.map +1 -1
  70. package/dist/migrate.d.ts.map +1 -1
  71. package/dist/migrate.js +54 -40
  72. package/dist/migrate.js.map +1 -1
  73. package/dist/mobile-mocks/db/postgres.d.ts +1 -0
  74. package/dist/mobile-mocks/db/postgres.d.ts.map +1 -0
  75. package/dist/mobile-mocks/db/postgres.js +2 -0
  76. package/dist/mobile-mocks/db/postgres.js.map +1 -0
  77. package/dist/mobile-mocks/db/sqlite.d.ts +1 -0
  78. package/dist/mobile-mocks/db/sqlite.d.ts.map +1 -0
  79. package/dist/mobile-mocks/db/sqlite.js +2 -0
  80. package/dist/mobile-mocks/db/sqlite.js.map +1 -0
  81. package/dist/mobile-mocks/models/email.d.ts +1 -0
  82. package/dist/mobile-mocks/models/email.d.ts.map +1 -0
  83. package/dist/mobile-mocks/models/email.js +2 -0
  84. package/dist/mobile-mocks/models/email.js.map +1 -0
  85. package/dist/mobile-mocks/node/async_hooks.d.ts +4 -0
  86. package/dist/mobile-mocks/node/async_hooks.d.ts.map +1 -0
  87. package/dist/mobile-mocks/node/async_hooks.js +8 -0
  88. package/dist/mobile-mocks/node/async_hooks.js.map +1 -0
  89. package/dist/mobile-mocks/node/child_process.d.ts +3 -0
  90. package/dist/mobile-mocks/node/child_process.d.ts.map +1 -0
  91. package/dist/mobile-mocks/node/child_process.js +6 -0
  92. package/dist/mobile-mocks/node/child_process.js.map +1 -0
  93. package/dist/mobile-mocks/node/fs/promises.d.ts +6 -0
  94. package/dist/mobile-mocks/node/fs/promises.d.ts.map +1 -0
  95. package/dist/mobile-mocks/node/fs/promises.js +16 -0
  96. package/dist/mobile-mocks/node/fs/promises.js.map +1 -0
  97. package/dist/mobile-mocks/node/fs.d.ts +4 -0
  98. package/dist/mobile-mocks/node/fs.d.ts.map +1 -0
  99. package/dist/mobile-mocks/node/fs.js +15 -0
  100. package/dist/mobile-mocks/node/fs.js.map +1 -0
  101. package/dist/mobile-mocks/node/latest-version.d.ts +2 -0
  102. package/dist/mobile-mocks/node/latest-version.d.ts.map +1 -0
  103. package/dist/mobile-mocks/node/latest-version.js +7 -0
  104. package/dist/mobile-mocks/node/latest-version.js.map +1 -0
  105. package/dist/mobile-mocks/node/v8.d.ts +3 -0
  106. package/dist/mobile-mocks/node/v8.d.ts.map +1 -0
  107. package/dist/mobile-mocks/node/v8.js +8 -0
  108. package/dist/mobile-mocks/node/v8.js.map +1 -0
  109. package/dist/mobile-mocks/npm/env-paths.d.ts +6 -0
  110. package/dist/mobile-mocks/npm/env-paths.d.ts.map +1 -0
  111. package/dist/mobile-mocks/npm/env-paths.js +9 -0
  112. package/dist/mobile-mocks/npm/env-paths.js.map +1 -0
  113. package/dist/mobile-mocks/saltcorn/plugin-testing.d.ts +1 -0
  114. package/dist/mobile-mocks/saltcorn/plugin-testing.d.ts.map +1 -0
  115. package/dist/mobile-mocks/saltcorn/plugin-testing.js +2 -0
  116. package/dist/mobile-mocks/saltcorn/plugin-testing.js.map +1 -0
  117. package/dist/models/config.d.ts +9 -10
  118. package/dist/models/config.d.ts.map +1 -1
  119. package/dist/models/config.js +35 -12
  120. package/dist/models/config.js.map +1 -1
  121. package/dist/models/crash.js +5 -1
  122. package/dist/models/crash.js.map +1 -1
  123. package/dist/models/discovery.d.ts.map +1 -1
  124. package/dist/models/discovery.js +5 -1
  125. package/dist/models/discovery.js.map +1 -1
  126. package/dist/models/email.d.ts +2 -0
  127. package/dist/models/email.d.ts.map +1 -1
  128. package/dist/models/email.js +2 -2
  129. package/dist/models/email.js.map +1 -1
  130. package/dist/models/field.d.ts +6 -4
  131. package/dist/models/field.d.ts.map +1 -1
  132. package/dist/models/field.js +41 -21
  133. package/dist/models/field.js.map +1 -1
  134. package/dist/models/fieldrepeat.d.ts +5 -0
  135. package/dist/models/fieldrepeat.d.ts.map +1 -1
  136. package/dist/models/fieldrepeat.js +2 -0
  137. package/dist/models/fieldrepeat.js.map +1 -1
  138. package/dist/models/file.d.ts +6 -0
  139. package/dist/models/file.d.ts.map +1 -1
  140. package/dist/models/file.js +25 -1
  141. package/dist/models/file.js.map +1 -1
  142. package/dist/models/form.d.ts +2 -0
  143. package/dist/models/form.d.ts.map +1 -1
  144. package/dist/models/form.js +1 -0
  145. package/dist/models/form.js.map +1 -1
  146. package/dist/models/index.d.ts +2 -13
  147. package/dist/models/index.d.ts.map +1 -1
  148. package/dist/models/layout.d.ts.map +1 -1
  149. package/dist/models/layout.js +12 -2
  150. package/dist/models/layout.js.map +1 -1
  151. package/dist/models/page.d.ts +1 -1
  152. package/dist/models/page.d.ts.map +1 -1
  153. package/dist/models/page.js +17 -9
  154. package/dist/models/page.js.map +1 -1
  155. package/dist/models/plugin.d.ts +1 -1
  156. package/dist/models/plugin.d.ts.map +1 -1
  157. package/dist/models/plugin.js +10 -6
  158. package/dist/models/plugin.js.map +1 -1
  159. package/dist/models/scheduler.d.ts.map +1 -1
  160. package/dist/models/scheduler.js +3 -1
  161. package/dist/models/scheduler.js.map +1 -1
  162. package/dist/models/table.d.ts +2 -1
  163. package/dist/models/table.d.ts.map +1 -1
  164. package/dist/models/table.js +48 -12
  165. package/dist/models/table.js.map +1 -1
  166. package/dist/models/trigger.d.ts +3 -3
  167. package/dist/models/trigger.d.ts.map +1 -1
  168. package/dist/models/trigger.js +6 -5
  169. package/dist/models/trigger.js.map +1 -1
  170. package/dist/models/user.d.ts +1 -1
  171. package/dist/models/user.d.ts.map +1 -1
  172. package/dist/models/user.js +7 -15
  173. package/dist/models/user.js.map +1 -1
  174. package/dist/models/view.d.ts +25 -14
  175. package/dist/models/view.d.ts.map +1 -1
  176. package/dist/models/view.js +84 -25
  177. package/dist/models/view.js.map +1 -1
  178. package/dist/models/workflow.d.ts +1 -0
  179. package/dist/models/workflow.d.ts.map +1 -1
  180. package/dist/models/workflow.js +58 -2
  181. package/dist/models/workflow.js.map +1 -1
  182. package/dist/package.json +127 -0
  183. package/dist/plugin-helper.d.ts +19 -14
  184. package/dist/plugin-helper.d.ts.map +1 -1
  185. package/dist/plugin-helper.js +158 -80
  186. package/dist/plugin-helper.js.map +1 -1
  187. package/dist/plugin-testing.d.ts +1 -0
  188. package/dist/plugin-testing.d.ts.map +1 -1
  189. package/dist/plugin-testing.js +84 -1
  190. package/dist/plugin-testing.js.map +1 -1
  191. package/dist/tests/actions.test.js +30 -5
  192. package/dist/tests/actions.test.js.map +1 -1
  193. package/dist/tests/auxtest.test.js +100 -3
  194. package/dist/tests/auxtest.test.js.map +1 -1
  195. package/dist/tests/db.test.d.ts +2 -0
  196. package/dist/tests/db.test.d.ts.map +1 -0
  197. package/dist/tests/db.test.js +32 -0
  198. package/dist/tests/db.test.js.map +1 -0
  199. package/dist/tests/exact_views.test.js +277 -22
  200. package/dist/tests/exact_views.test.js.map +1 -1
  201. package/dist/tests/field.test.js +36 -0
  202. package/dist/tests/field.test.js.map +1 -1
  203. package/dist/tests/mocks.d.ts +2 -0
  204. package/dist/tests/mocks.d.ts.map +1 -1
  205. package/dist/tests/mocks.js +2 -0
  206. package/dist/tests/mocks.js.map +1 -1
  207. package/dist/tests/models.test.js +46 -1
  208. package/dist/tests/models.test.js.map +1 -1
  209. package/dist/tests/remote_query_helper.d.ts +341 -0
  210. package/dist/tests/remote_query_helper.d.ts.map +1 -0
  211. package/dist/tests/remote_query_helper.js +446 -0
  212. package/dist/tests/remote_query_helper.js.map +1 -0
  213. package/dist/tests/state.test.d.ts +2 -0
  214. package/dist/tests/state.test.d.ts.map +1 -0
  215. package/dist/tests/state.test.js +78 -0
  216. package/dist/tests/state.test.js.map +1 -0
  217. package/dist/tests/table.test.js +19 -0
  218. package/dist/tests/table.test.js.map +1 -1
  219. package/dist/tests/view.test.js +29 -0
  220. package/dist/tests/view.test.js.map +1 -1
  221. package/dist/tsconfig.json +24 -0
  222. package/dist/tsconfig.ref.json +9 -0
  223. package/dist/tsconfig.ref.tsbuildinfo +1 -1
  224. package/dist/utils.d.ts +3 -1
  225. package/dist/utils.d.ts.map +1 -1
  226. package/dist/utils.js +14 -23
  227. package/dist/utils.js.map +1 -1
  228. package/dist/webpack.config.d.ts +57 -0
  229. package/dist/webpack.config.d.ts.map +1 -0
  230. package/dist/webpack.config.js +75 -0
  231. package/dist/webpack.config.js.map +1 -0
  232. package/package.json +39 -15
  233. package/CHANGELOG.md +0 -8
  234. package/dist/models/backup.d.ts +0 -9
  235. package/dist/models/backup.d.ts.map +0 -1
  236. package/dist/models/backup.js +0 -278
  237. package/dist/models/backup.js.map +0 -1
  238. package/dist/models/pack.d.ts +0 -42
  239. package/dist/models/pack.d.ts.map +0 -1
  240. package/dist/models/pack.js +0 -419
  241. package/dist/models/pack.js.map +0 -1
  242. package/dist/models/tenant.d.ts +0 -17
  243. package/dist/models/tenant.d.ts.map +0 -1
  244. package/dist/models/tenant.js +0 -152
  245. package/dist/models/tenant.js.map +0 -1
  246. package/dist/tests/backup.test.d.ts +0 -2
  247. package/dist/tests/backup.test.d.ts.map +0 -1
  248. package/dist/tests/backup.test.js +0 -101
  249. package/dist/tests/backup.test.js.map +0 -1
  250. package/dist/tests/pack.test.d.ts +0 -2
  251. package/dist/tests/pack.test.d.ts.map +0 -1
  252. package/dist/tests/pack.test.js +0 -338
  253. package/dist/tests/pack.test.js.map +0 -1
  254. package/dist/tests/random.test.d.ts +0 -2
  255. package/dist/tests/random.test.d.ts.map +0 -1
  256. package/dist/tests/random.test.js +0 -149
  257. package/dist/tests/random.test.js.map +0 -1
  258. package/dist/tests/tenant.test.d.ts +0 -2
  259. package/dist/tests/tenant.test.d.ts.map +0 -1
  260. package/dist/tests/tenant.test.js +0 -52
  261. package/dist/tests/tenant.test.js.map +0 -1
@@ -5,7 +5,7 @@
5
5
  * @param {object} req
6
6
  * @returns {Promise<object[]>}
7
7
  */
8
- export const field_picker_fields: any;
8
+ export function field_picker_fields({ table, viewname, req }: Table | object): Promise<object[]>;
9
9
  /**
10
10
  * picked_fields_to_query Contract
11
11
  * @function
@@ -14,7 +14,7 @@ export const field_picker_fields: any;
14
14
  * @throws {InvalidConfiguration}
15
15
  * @returns {object}
16
16
  */
17
- export const picked_fields_to_query: any;
17
+ export function picked_fields_to_query(columns: object[], fields: Field[], layout: any): object;
18
18
  /**
19
19
  * get_child_views Contract
20
20
  * @function
@@ -22,7 +22,7 @@ export const picked_fields_to_query: any;
22
22
  * @param {string} viewname
23
23
  * @returns {Promise<object[]>}
24
24
  */
25
- export const get_child_views: any;
25
+ export function get_child_views(table: Table | object, viewname: string, nrecurse?: number): Promise<object[]>;
26
26
  /**
27
27
  * get_parent_views Contract
28
28
  * @function
@@ -30,7 +30,7 @@ export const get_child_views: any;
30
30
  * @param {string} viewname
31
31
  * @returns {Promise<object[]>}
32
32
  */
33
- export const get_parent_views: any;
33
+ export function get_parent_views(table: Table | object, viewname: string): Promise<object[]>;
34
34
  /**
35
35
  * @function
36
36
  * @param {object} opts
@@ -39,7 +39,11 @@ export const get_parent_views: any;
39
39
  * @param {boolean} [opts.approximate = true]
40
40
  * @returns {object}
41
41
  */
42
- export const stateFieldsToWhere: any;
42
+ export function stateFieldsToWhere({ fields, state, approximate }: {
43
+ fields: Field[];
44
+ state: object;
45
+ approximate?: boolean | undefined;
46
+ }): object;
43
47
  /**
44
48
  * @function
45
49
  * @param {object}
@@ -47,21 +51,21 @@ export const stateFieldsToWhere: any;
47
51
  * @param {string} - missing in contract
48
52
  * @returns {object}
49
53
  */
50
- export const stateFieldsToQuery: any;
54
+ export function stateFieldsToQuery({ state, fields, prefix }: object): object;
51
55
  /**
52
56
  * initial_config_all_fields Contract
53
57
  * @function
54
58
  * @param {boolean}
55
59
  * @returns {function}
56
60
  */
57
- export const initial_config_all_fields: any;
61
+ export function initial_config_all_fields(isEdit: any): Function;
58
62
  /**
59
63
  * @function
60
64
  * @param {Field[]} fields
61
65
  * @param {boolean}
62
66
  * @returns {object}
63
67
  */
64
- export const calcfldViewOptions: any;
68
+ export function calcfldViewOptions(fields: Field[], mode: any): object;
65
69
  /**
66
70
  * @function
67
71
  * @param {Table|object} table
@@ -69,8 +73,7 @@ export const calcfldViewOptions: any;
69
73
  * @param {boolean}
70
74
  * @returns {Promise<object[]>}
71
75
  */
72
- export const get_link_view_opts: any;
73
- import { is_column } from "./contracts";
76
+ export function get_link_view_opts(table: Table | object, viewname: string): Promise<object[]>;
74
77
  /**
75
78
  *
76
79
  * @param {object} state
@@ -90,7 +93,7 @@ export function readStateStrict(state: object, fields: object[]): boolean | any;
90
93
  * @param {object} [state]
91
94
  * @returns {string}
92
95
  */
93
- export const stateToQueryString: any;
96
+ export function stateToQueryString(state?: object | undefined): string;
94
97
  /**
95
98
  *
96
99
  * @param {string} url
@@ -105,7 +108,7 @@ export const stateToQueryString: any;
105
108
  * @param {string} [link_textcol]
106
109
  * @returns {button|a}
107
110
  */
108
- export function link_view(url0: any, label: string, popup?: boolean | undefined, link_style?: string | undefined, link_size?: string | undefined, link_icon?: string | undefined, textStyle?: string | undefined, link_bgcol?: string | undefined, link_bordercol?: string | undefined, link_textcol?: string | undefined, extraClass: any, extraState: any): button | a;
111
+ export function link_view(url0: any, label: string, popup?: boolean | undefined, link_style?: string | undefined, link_size?: string | undefined, link_icon?: string | undefined, textStyle?: string | undefined, link_bgcol?: string | undefined, link_bordercol?: string | undefined, link_textcol?: string | undefined, extraClass: any, extraState: any, link_target_blank: any): button | a;
109
112
  /**
110
113
  * Get Action configuration fields
111
114
  * @param {object} action
@@ -119,7 +122,7 @@ export function getActionConfigFields(action: object, table: object): Promise<ob
119
122
  * @param {boolean}
120
123
  * @returns {Promise<object>}
121
124
  */
122
- export const calcfldViewConfig: any;
125
+ export function calcfldViewConfig(fields: Field[], isEdit: any, nrecurse?: number): Promise<object>;
123
126
  /**
124
127
  *
125
128
  * @param {string} x
@@ -141,5 +144,7 @@ export function run_action_column({ col, req, ...rest }: object): Promise<any>;
141
144
  * @returns {object}
142
145
  */
143
146
  export function json_list_to_external_table(get_json_list: Function, fields0: object[]): object;
144
- export { is_column };
147
+ export function add_free_variables_to_joinfields(freeVars: any, joinFields: any, fields: any): void;
148
+ import Table = require("./models/table");
149
+ import Field = require("./models/field");
145
150
  //# sourceMappingURL=plugin-helper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-helper.d.ts","sourceRoot":"","sources":["../plugin-helper.js"],"names":[],"mappings":"AA2VA;;;;;;GAMG;AACH,sCAqbE;AA0IF;;;;;;;GAOG;AACH,yCAqIE;AArRF;;;;;;GAMG;AACH,kCA6CE;AAEF;;;;;;GAMG;AACH,mCAiCE;AAyOF;;;;;;;GAOG;AACH,qCAsEE;AA9HF;;;;;;GAMG;AACH,qCA2BE;AA8FF;;;;;GAKG;AACH,4CA6GE;AAhrCF;;;;;GAKG;AACH,qCAwFE;AA8CF;;;;;;GAMG;AACH,qCAwEE;;AAi+BF;;;;;GAKG;AACH,iCAJW,MAAM,UACN,MAAM,EAAE,aACN,MAAM,CAwBlB;AAED;;;;;GAKG;AACH,uCAJW,MAAM,UACN,MAAM,EAAE,GACN,OAAO,MAAE,CA4BrB;AAlxCD;;;;GAIG;AACH,qCAiBE;AA1FF;;;;;;;;;;;;;GAaG;AACH,4CAXW,MAAM,4SASJ,UAAQ,CAsDpB;AAuPD;;;;;GAKG;AACH,8CAJW,MAAM,SACN,MAAM,GACJ,QAAQ,MAAM,EAAE,CAAC,CAKC;AAtI/B;;;;;GAKG;AACH,oCAoCE;AAwiCF;;;;GAIG;AACH,kCAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAK5B;AA0ID;;;;;;GAMG;AACH,yDALW,MAAM,GAGJ,YAAU,CAiBtB;AA/FD;;;;;GAKG;AACH,8EAHW,MAAM,EAAE,GACN,MAAM,CAmElB"}
1
+ {"version":3,"file":"plugin-helper.d.ts","sourceRoot":"","sources":["../plugin-helper.js"],"names":[],"mappings":"AAiUA;;;;;;GAMG;AACH,8DALW,KAAK,GAAC,MAAM,GAGV,QAAQ,MAAM,EAAE,CAAC,CAib7B;AA8FD;;;;;;;GAOG;AACH,gDALW,MAAM,EAAE,UACR,KAAK,EAAE,gBAEL,MAAM,CA+GlB;AAjND;;;;;;GAMG;AACH,uCAJW,KAAK,GAAC,MAAM,YACZ,MAAM,sBACJ,QAAQ,MAAM,EAAE,CAAC,CAiC7B;AAED;;;;;;GAMG;AACH,wCAJW,KAAK,GAAC,MAAM,YACZ,MAAM,GACJ,QAAQ,MAAM,EAAE,CAAC,CAoB7B;AAkOD;;;;;;;GAOG;AACH;IALyB,MAAM,EAApB,KAAK,EAAE;IACM,KAAK,EAAlB,MAAM;IACS,WAAW;IACxB,MAAM,CAiJlB;AAnMD;;;;;;GAMG;AACH,8DALW,MAAM,GAGJ,MAAM,CAyBlB;AAuKD;;;;;GAKG;AACH,iEAqGG;AArrCH;;;;;GAKG;AACH,2CAJW,KAAK,EAAE,cAEL,MAAM,CAuFlB;AAwCD;;;;;;GAMG;AACH,0CALW,KAAK,GAAC,MAAM,YACZ,MAAM,GAEJ,QAAQ,MAAM,EAAE,CAAC,CAiE7B;AAw/BD;;;;;GAKG;AACH,iCAJW,MAAM,UACN,MAAM,EAAE,aACN,MAAM,CAwBlB;AAED;;;;;GAKG;AACH,uCAJW,MAAM,UACN,MAAM,EAAE,GACN,OAAO,MAAE,CA4BrB;AAlxCD;;;;GAIG;AACH,gEAFa,MAAM,CAclB;AAvFD;;;;;;;;;;;;;GAaG;AACH,4CAXW,MAAM,oUASJ,UAAQ,CAwDpB;AAgOD;;;;;GAKG;AACH,8CAJW,MAAM,SACN,MAAM,GACJ,QAAQ,MAAM,EAAE,CAAC,CAKC;AAvH/B;;;;;GAKG;AACH,0CAJW,KAAK,EAAE,mCAEL,QAAQ,MAAM,CAAC,CAgC3B;AAsjCD;;;;GAIG;AACH,kCAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAK5B;AA0ID;;;;;;GAMG;AACH,yDALW,MAAM,GAGJ,YAAU,CAiBtB;AA/FD;;;;;GAKG;AACH,8EAHW,MAAM,EAAE,GACN,MAAM,CAmElB;AAteD,oGAkCC"}
@@ -10,12 +10,12 @@ const Table = require("./models/table");
10
10
  const Trigger = require("./models/trigger");
11
11
  const { getState } = require("./db/state");
12
12
  const db = require("./db");
13
- const { contract, is } = require("contractis");
14
- const { fieldlike, is_table_query, is_column, is_tablely, } = require("./contracts");
15
13
  const { link } = require("@saltcorn/markup");
16
14
  const { button, a, label, text, i } = require("@saltcorn/markup/tags");
17
15
  const { applyAsync, InvalidConfiguration } = require("./utils");
18
16
  const { jsexprToWhere, freeVariables } = require("./models/expression");
17
+ const { traverse } = require("./models/layout");
18
+ const { isNode } = require("./utils");
19
19
  /**
20
20
  *
21
21
  * @param {string} url
@@ -30,7 +30,7 @@ const { jsexprToWhere, freeVariables } = require("./models/expression");
30
30
  * @param {string} [link_textcol]
31
31
  * @returns {button|a}
32
32
  */
33
- const link_view = (url0, label, popup, link_style = "", link_size = "", link_icon = "", textStyle = "", link_bgcol, link_bordercol, link_textcol, extraClass, extraState) => {
33
+ const link_view = (url0, label, popup, link_style = "", link_size = "", link_icon = "", textStyle = "", link_bgcol, link_bordercol, link_textcol, extraClass, extraState, link_target_blank) => {
34
34
  let style = link_style === "btn btn-custom-color"
35
35
  ? `background-color: ${link_bgcol || "#000000"};border-color: ${link_bordercol || "#000000"}; color: ${link_textcol || "#000000"}`
36
36
  : null;
@@ -51,7 +51,7 @@ const link_view = (url0, label, popup, link_style = "", link_size = "", link_ico
51
51
  extraClass,
52
52
  ],
53
53
  type: "button",
54
- onClick: `ajax_modal('${url}')`,
54
+ onClick: isNode() ? `ajax_modal('${url}')` : `mobile_modal('${url}')`,
55
55
  style,
56
56
  }, link_icon ? i({ class: link_icon }) + "&nbsp;" : "", label);
57
57
  }
@@ -60,6 +60,7 @@ const link_view = (url0, label, popup, link_style = "", link_size = "", link_ico
60
60
  href: url,
61
61
  class: [textStyle, link_style, link_size, extraClass],
62
62
  style,
63
+ target: link_target_blank ? "_blank" : undefined,
63
64
  }, link_icon ? i({ class: link_icon }) + "&nbsp;" : "", text(label));
64
65
  };
65
66
  /**
@@ -67,30 +68,30 @@ const link_view = (url0, label, popup, link_style = "", link_size = "", link_ico
67
68
  * @param {object} [state]
68
69
  * @returns {string}
69
70
  */
70
- const stateToQueryString = contract(is.fun(is.maybe(is.obj()), is.str), (state) => {
71
+ const stateToQueryString = (state) => {
71
72
  if (!state || Object.keys(state).length === 0)
72
73
  return "";
73
74
  return ("?" +
74
75
  Object.entries(state)
75
- .map(([k, v]) => k === "id"
76
- ? null
77
- : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
76
+ .map(([k, v]) => k === "id" ? null : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
78
77
  .filter((s) => !!s)
79
78
  .join("&"));
80
- });
79
+ };
81
80
  /**
82
81
  * @function
83
82
  * @param {Field[]} fields
84
83
  * @param {boolean}
85
84
  * @returns {object}
86
85
  */
87
- 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) => {
86
+ const calcfldViewOptions = (fields, mode) => {
88
87
  const isEdit = mode === "edit";
89
88
  const isFilter = mode === "filter";
90
89
  let fvs = {};
91
90
  const handlesTextStyle = {};
91
+ const blockDisplay = {};
92
92
  fields.forEach((f) => {
93
93
  handlesTextStyle[f.name] = [];
94
+ blockDisplay[f.name] = [];
94
95
  if (f.type === "File") {
95
96
  if (!isEdit && !isFilter)
96
97
  fvs[f.name] = Object.keys(getState().fileviews);
@@ -135,6 +136,8 @@ const calcfldViewOptions = contract(is.fun([is.array(is.class("Field")), is.str]
135
136
  Object.entries(getState().keyFieldviews).forEach(([k, v]) => {
136
137
  if (v && v.handlesTextStyle)
137
138
  handlesTextStyle[f.name].push(k);
139
+ if (v && v.blockDisplay)
140
+ blockDisplay[f.name].push(k);
138
141
  });
139
142
  }
140
143
  else if (f.type && f.type.fieldviews) {
@@ -158,19 +161,21 @@ const calcfldViewOptions = contract(is.fun([is.array(is.class("Field")), is.str]
158
161
  fvs[f.name] = tfvs_ordered.map(([k, fv]) => {
159
162
  if (fv && fv.handlesTextStyle)
160
163
  handlesTextStyle[f.name].push(k);
164
+ if (fv && fv.blockDisplay)
165
+ blockDisplay[f.name].push(k);
161
166
  return k;
162
167
  });
163
168
  }
164
169
  });
165
- return { field_view_options: fvs, handlesTextStyle };
166
- });
170
+ return { field_view_options: fvs, handlesTextStyle, blockDisplay };
171
+ };
167
172
  /**
168
173
  * @function
169
174
  * @param {Field[]} fields
170
175
  * @param {boolean}
171
176
  * @returns {Promise<object>}
172
177
  */
173
- const calcfldViewConfig = contract(is.fun([is.array(is.class("Field")), is.bool], is.promise(is.obj())), async (fields, isEdit, nrecurse = 2) => {
178
+ const calcfldViewConfig = async (fields, isEdit, nrecurse = 2) => {
174
179
  const fieldViewConfigForms = {};
175
180
  for (const f of fields) {
176
181
  f.fill_table();
@@ -195,7 +200,7 @@ const calcfldViewConfig = contract(is.fun([is.array(is.class("Field")), is.bool]
195
200
  }
196
201
  }
197
202
  return fieldViewConfigForms;
198
- });
203
+ };
199
204
  /**
200
205
  * @function
201
206
  * @param {Table|object} table
@@ -203,7 +208,7 @@ const calcfldViewConfig = contract(is.fun([is.array(is.class("Field")), is.bool]
203
208
  * @param {boolean}
204
209
  * @returns {Promise<object[]>}
205
210
  */
206
- 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) => {
211
+ const get_link_view_opts = async (table, viewname) => {
207
212
  const own_link_views = await View.find_possible_links_to_table(table);
208
213
  const link_view_opts = own_link_views
209
214
  .filter((v) => v.name !== viewname)
@@ -211,22 +216,21 @@ const get_link_view_opts = contract(is.fun([is_tablely, is.str], is.promise(is.a
211
216
  label: `${v.name} [${v.viewtemplate} ${table.name}]`,
212
217
  name: `Own:${v.name}`,
213
218
  }));
214
- const link_view_names = new Set();
219
+ const link_view_opts_push = (o) => {
220
+ if (!link_view_opts.map((v) => v.name).includes(o.name))
221
+ link_view_opts.push(o);
222
+ };
215
223
  const child_views = await get_child_views(table, viewname);
216
224
  for (const { relation, related_table, through, throughTable, views, } of child_views) {
217
225
  for (const view of views) {
218
226
  if (through && throughTable) {
219
- const name = `${view.name}.${related_table.name}.${relation.name}.${throughTable.name}.${through.name}`;
220
- link_view_names.add(name);
221
- link_view_opts.push({
222
- name: `ChildList:${view.name}.${related_table.name}.${relation.name}.${throughTable.name}.${through.name}`,
227
+ link_view_opts_push({
228
+ name: `ChildList:${view.name}.${throughTable.name}.${through.name}.${related_table.name}.${relation.name}`,
223
229
  label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.name}.${through.name}]`,
224
230
  });
225
231
  }
226
232
  else {
227
- const name = `${view.name}.${related_table.name}.${relation.name}`;
228
- link_view_names.add(name);
229
- link_view_opts.push({
233
+ link_view_opts_push({
230
234
  name: `ChildList:${view.name}.${related_table.name}.${relation.name}`,
231
235
  label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.name}]`,
232
236
  });
@@ -236,7 +240,7 @@ const get_link_view_opts = contract(is.fun([is_tablely, is.str], is.promise(is.a
236
240
  const parent_views = await get_parent_views(table, viewname);
237
241
  for (const { relation, related_table, views } of parent_views) {
238
242
  for (const view of views) {
239
- link_view_opts.push({
243
+ link_view_opts_push({
240
244
  name: `ParentShow:${view.name}.${related_table.name}.${relation.name}`,
241
245
  label: `${view.name} [${view.viewtemplate} ${relation.name}.${related_table.name}]`,
242
246
  });
@@ -245,23 +249,21 @@ const get_link_view_opts = contract(is.fun([is_tablely, is.str], is.promise(is.a
245
249
  const onetoone_views = await get_onetoone_views(table, viewname);
246
250
  for (const { relation, related_table, views } of onetoone_views) {
247
251
  for (const view of views) {
248
- const name = `${view.name}.${related_table.name}.${relation.name}`;
249
- if (!link_view_names.has(name))
250
- link_view_opts.push({
251
- name: `OneToOneShow:${view.name}.${related_table.name}.${relation.name}`,
252
- label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.label}]`,
253
- });
252
+ link_view_opts_push({
253
+ name: `OneToOneShow:${view.name}.${related_table.name}.${relation.name}`,
254
+ label: `${view.name} [${view.viewtemplate} ${related_table.name}.${relation.label}]`,
255
+ });
254
256
  }
255
257
  }
256
258
  const independent_views = await View.find_all_views_where(({ state_fields }) => !state_fields.some((sf) => sf.required));
257
259
  independent_views.forEach((view) => {
258
- link_view_opts.push({
260
+ link_view_opts_push({
259
261
  label: `${view.name} [${view.viewtemplate}]`,
260
262
  name: `Independent:${view.name}`,
261
263
  });
262
264
  });
263
265
  return link_view_opts;
264
- });
266
+ };
265
267
  /**
266
268
  * Get Action configuration fields
267
269
  * @param {object} action
@@ -278,7 +280,7 @@ const getActionConfigFields = async (action, table) => typeof action.configField
278
280
  * @param {object} req
279
281
  * @returns {Promise<object[]>}
280
282
  */
281
- const field_picker_fields = contract(is.fun(is.obj({ table: is_tablely, viewname: is.str }), is.promise(is.array(fieldlike))), async ({ table, viewname, req }) => {
283
+ const field_picker_fields = async ({ table, viewname, req }) => {
282
284
  const __ = (...s) => (req ? req.__(...s) : s.join(""));
283
285
  const fields = await table.getFields();
284
286
  for (const field of fields) {
@@ -625,7 +627,7 @@ const field_picker_fields = contract(is.fun(is.obj({ table: is_tablely, viewname
625
627
  label: __("Open in new tab"),
626
628
  type: "Bool",
627
629
  required: false,
628
- showIf: { type: "Link" },
630
+ showIf: { type: ["ViewLink", "Link"] },
629
631
  },
630
632
  {
631
633
  name: "in_modal",
@@ -697,7 +699,7 @@ const field_picker_fields = contract(is.fun(is.obj({ table: is_tablely, viewname
697
699
  },
698
700
  },
699
701
  ];
700
- });
702
+ };
701
703
  /**
702
704
  * get_child_views Contract
703
705
  * @function
@@ -705,11 +707,7 @@ const field_picker_fields = contract(is.fun(is.obj({ table: is_tablely, viewname
705
707
  * @param {string} viewname
706
708
  * @returns {Promise<object[]>}
707
709
  */
708
- const get_child_views = contract(is.fun([is_tablely, is.maybe(is.str)], is.promise(is.array(is.obj({
709
- relation: is.class("Field"),
710
- related_table: is.class("Table"),
711
- views: is.array(is.class("View")),
712
- })))), async (table, viewname, nrecurse = 2) => {
710
+ const get_child_views = async (table, viewname, nrecurse = 2) => {
713
711
  const rels = await Field.find({ reftable_name: table.name });
714
712
  const possibleThroughTables = new Set();
715
713
  var child_views = [];
@@ -736,7 +734,7 @@ const get_child_views = contract(is.fun([is_tablely, is.maybe(is.str)], is.promi
736
734
  });
737
735
  }
738
736
  return child_views;
739
- });
737
+ };
740
738
  /**
741
739
  * get_parent_views Contract
742
740
  * @function
@@ -744,35 +742,26 @@ const get_child_views = contract(is.fun([is_tablely, is.maybe(is.str)], is.promi
744
742
  * @param {string} viewname
745
743
  * @returns {Promise<object[]>}
746
744
  */
747
- const get_parent_views = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({
748
- relation: is.class("Field"),
749
- related_table: is.class("Table"),
750
- views: is.array(is.class("View")),
751
- })))), async (table, viewname) => {
745
+ const get_parent_views = async (table, viewname) => {
752
746
  var parent_views = [];
753
747
  const parentrels = (await table.getFields()).filter((f) => f.is_fkey && f.type !== "File");
754
748
  for (const relation of parentrels) {
755
749
  const related_table = await Table.findOne({
756
750
  name: relation.reftable_name,
757
751
  });
758
- const views = await View.find_table_views_where(related_table, ({ state_fields, viewrow }) => viewrow.name !== viewname &&
759
- state_fields.some((sf) => sf.name === "id"));
752
+ const views = await View.find_table_views_where(related_table, ({ state_fields, viewrow }) => viewrow.name !== viewname && state_fields.some((sf) => sf.name === "id"));
760
753
  parent_views.push({ relation, related_table, views });
761
754
  }
762
755
  return parent_views;
763
- });
756
+ };
764
757
  /**
765
758
  * get_onetoone_views Contract
766
759
  * @function
767
- * @param {Table|is_tablely} table
760
+ * @param {Table} table
768
761
  * @param {string} viewname
769
762
  * @returns {Promise<object[]>}
770
763
  */
771
- const get_onetoone_views = contract(is.fun([is_tablely, is.str], is.promise(is.array(is.obj({
772
- relation: is.class("Field"),
773
- related_table: is.class("Table"),
774
- views: is.array(is.class("View")),
775
- })))), async (table, viewname) => {
764
+ const get_onetoone_views = async (table, viewname) => {
776
765
  const rels = await Field.find({
777
766
  reftable_name: table.name,
778
767
  is_unique: true,
@@ -780,12 +769,11 @@ const get_onetoone_views = contract(is.fun([is_tablely, is.str], is.promise(is.a
780
769
  var child_views = [];
781
770
  for (const relation of rels) {
782
771
  const related_table = await Table.findOne({ id: relation.table_id });
783
- const views = await View.find_table_views_where(related_table.id, ({ state_fields, viewrow }) => viewrow.name !== viewname &&
784
- state_fields.some((sf) => sf.name === "id"));
772
+ const views = await View.find_table_views_where(related_table.id, ({ state_fields, viewrow }) => viewrow.name !== viewname && state_fields.some((sf) => sf.name === "id"));
785
773
  child_views.push({ relation, related_table, views });
786
774
  }
787
775
  return child_views;
788
- });
776
+ };
789
777
  /**
790
778
  * picked_fields_to_query Contract
791
779
  * @function
@@ -794,11 +782,10 @@ const get_onetoone_views = contract(is.fun([is_tablely, is.str], is.promise(is.a
794
782
  * @throws {InvalidConfiguration}
795
783
  * @returns {object}
796
784
  */
797
- const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is.class("Field"))], is_table_query), (columns, fields) => {
785
+ const picked_fields_to_query = (columns, fields, layout) => {
798
786
  var joinFields = {};
799
787
  var aggregations = {};
800
788
  let freeVars = new Set(); // for join fields
801
- const joinFieldNames = new Set(fields.filter((f) => f.is_fkey).map((f) => f.name));
802
789
  (columns || []).forEach((column) => {
803
790
  if (column.type === "JoinField") {
804
791
  if (column.join_field && column.join_field.split) {
@@ -844,9 +831,11 @@ const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is
844
831
  }
845
832
  else if (column.type === "ViewLink") {
846
833
  if (column.view_label_formula)
834
+ freeVars = new Set([...freeVars, ...freeVariables(column.view_label)]);
835
+ if (column.extra_state_fml)
847
836
  freeVars = new Set([
848
837
  ...freeVars,
849
- ...freeVariables(column.view_label),
838
+ ...freeVariables(column.extra_state_fml),
850
839
  ]);
851
840
  if (column.view && column.view.split) {
852
841
  const [vtype, vrest] = column.view.split(":");
@@ -888,15 +877,28 @@ const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is
888
877
  freeVars = new Set([...freeVars, ...freeVariables(column.link_url)]);
889
878
  }
890
879
  else if (column.type === "Action" && column.action_label_formula) {
891
- freeVars = new Set([
892
- ...freeVars,
893
- ...freeVariables(column.action_label),
894
- ]);
880
+ freeVars = new Set([...freeVars, ...freeVariables(column.action_label)]);
895
881
  }
896
882
  });
883
+ if (layout) {
884
+ traverse(layout, {
885
+ view(v) {
886
+ if (v.extra_state_fml)
887
+ freeVars = new Set([
888
+ ...freeVars,
889
+ ...freeVariables(v.extra_state_fml),
890
+ ]);
891
+ },
892
+ });
893
+ }
894
+ add_free_variables_to_joinfields(freeVars, joinFields, fields);
895
+ return { joinFields, aggregations };
896
+ };
897
+ const add_free_variables_to_joinfields = (freeVars, joinFields, fields) => {
898
+ const joinFieldNames = new Set(fields.filter((f) => f.is_fkey).map((f) => f.name));
897
899
  [...freeVars]
898
900
  .filter((v) => v.includes("."))
899
- .map((v) => {
901
+ .forEach((v) => {
900
902
  const kpath = v.split(".");
901
903
  if (joinFieldNames.has(kpath[0]))
902
904
  if (kpath.length === 2) {
@@ -926,8 +928,7 @@ const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is
926
928
  };
927
929
  }
928
930
  });
929
- return { joinFields, aggregations };
930
- });
931
+ };
931
932
  /**
932
933
  * @function
933
934
  * @param {object}
@@ -935,7 +936,7 @@ const picked_fields_to_query = contract(is.fun([is.array(is_column), is.array(is
935
936
  * @param {string} - missing in contract
936
937
  * @returns {object}
937
938
  */
938
- const stateFieldsToQuery = contract(is.fun(is.obj(), is.obj()), ({ state, fields, prefix = "" }) => {
939
+ const stateFieldsToQuery = ({ state, fields, prefix = "" }) => {
939
940
  let q = {};
940
941
  const stateKeys = Object.keys(state);
941
942
  if (state._sortby) {
@@ -960,7 +961,7 @@ const stateFieldsToQuery = contract(is.fun(is.obj(), is.obj()), ({ state, fields
960
961
  q.orderBy = { distance: { lat, long, latField, longField } };
961
962
  }
962
963
  return q;
963
- });
964
+ };
964
965
  /**
965
966
  *
966
967
  * @param {object} container
@@ -982,14 +983,15 @@ const addOrCreateList = (container, key, x) => {
982
983
  * @param {boolean} [opts.approximate = true]
983
984
  * @returns {object}
984
985
  */
985
- const stateFieldsToWhere = contract(is.fun(is.obj({
986
- fields: is.array(is.class("Field")),
987
- approximate: is.maybe(is.bool),
988
- }), is.obj()), ({ fields, state, approximate = true }) => {
986
+ const stateFieldsToWhere = ({ fields, state, approximate = true }) => {
989
987
  var qstate = {};
990
- Object.entries(state).forEach(([k, v]) => {
988
+ Object.entries(state || {}).forEach(([k, v]) => {
991
989
  if (k === "_fts") {
992
- qstate[k] = { searchTerm: v.replace(/\0/g, ""), fields };
990
+ qstate[k] = {
991
+ searchTerm: v.replace(/\0/g, ""),
992
+ fields,
993
+ schema: db.getTenantSchema(),
994
+ };
993
995
  return;
994
996
  }
995
997
  const field = fields.find((fld) => fld.name == k);
@@ -1029,12 +1031,72 @@ const stateFieldsToWhere = contract(is.fun(is.obj({
1029
1031
  else if (field && field.type.name === "Bool" && state[k] === "?") {
1030
1032
  // omit
1031
1033
  }
1034
+ else if (typeof v === "object" && v && field?.type?.name === "JSON") {
1035
+ let json = {};
1036
+ if (Object.values(v).length === 1 && Object.values(v)[0] === "")
1037
+ return;
1038
+ Object.entries(v).forEach(([kj, vj]) => {
1039
+ if (vj === "")
1040
+ return;
1041
+ if (kj.endsWith("__lte")) {
1042
+ json[kj.replace("__lte", "")] = {
1043
+ lte: +vj,
1044
+ ...(json[kj.replace("__lte", "")] || {}),
1045
+ };
1046
+ }
1047
+ else if (kj.endsWith("__gte")) {
1048
+ json[kj.replace("__gte", "")] = {
1049
+ gte: +vj,
1050
+ ...(json[kj.replace("__gte", "")] || {}),
1051
+ };
1052
+ }
1053
+ else {
1054
+ json[kj] = vj;
1055
+ if (field.attributes?.hasSchema) {
1056
+ const s = field.attributes.schema.find((f) => f.key === Object.keys(v)[0]);
1057
+ if (s?.type === "String") {
1058
+ json[kj] = { ilike: vj };
1059
+ }
1060
+ }
1061
+ }
1062
+ });
1063
+ qstate[k] = [
1064
+ ...(qstate[k] ? [qstate[k]] : []),
1065
+ {
1066
+ json,
1067
+ },
1068
+ ];
1069
+ }
1032
1070
  else if (field && field.type && field.type.read)
1033
1071
  qstate[k] = Array.isArray(v)
1034
1072
  ? { or: v.map(field.type.read) }
1035
1073
  : field.type.read(v);
1036
1074
  else if (field)
1037
1075
  qstate[k] = v;
1076
+ else if (k.includes("->")) {
1077
+ // jFieldNm.jtnm->lblField
1078
+ // where jFieldNm in (select id from jtnm where lblField=v)
1079
+ const [jFieldNm, krest] = k.split(".");
1080
+ const [jtNm, lblField] = krest.split("->");
1081
+ let where = { [db.sqlsanitize(lblField)]: v };
1082
+ const jTable = Table.findOne({ name: jtNm });
1083
+ const lblFld = (jTable.fields || []).find((f) => f.name === lblField);
1084
+ if (lblFld &&
1085
+ lblFld.type?.name === "String" &&
1086
+ !lblFld.attributes?.options)
1087
+ where = { [db.sqlsanitize(lblField)]: { ilike: v } };
1088
+ qstate[jFieldNm] = [
1089
+ ...(qstate[jFieldNm] ? [qstate[jFieldNm]] : []),
1090
+ {
1091
+ // where jFieldNm in (select id from jtnm where lblField=v)
1092
+ inSelect: {
1093
+ table: `${db.getTenantSchemaPrefix()}"${db.sqlsanitize(jtNm)}"`,
1094
+ field: "id",
1095
+ where,
1096
+ },
1097
+ },
1098
+ ];
1099
+ }
1038
1100
  else if (k.includes(".")) {
1039
1101
  const kpath = k.split(".");
1040
1102
  if (kpath.length === 3) {
@@ -1051,17 +1113,33 @@ const stateFieldsToWhere = contract(is.fun(is.obj({
1051
1113
  },
1052
1114
  ];
1053
1115
  }
1116
+ else if (kpath.length === 4) {
1117
+ const [jtNm, jFieldNm, tblName, lblField] = kpath;
1118
+ qstate.id = [
1119
+ ...(qstate.id ? [qstate.id] : []),
1120
+ {
1121
+ // where id in (select jFieldNm from jtnm where lblField=v)
1122
+ inSelect: {
1123
+ table: `${db.getTenantSchemaPrefix()}"${db.sqlsanitize(jtNm)}"`,
1124
+ field: db.sqlsanitize(jFieldNm),
1125
+ valField: "id",
1126
+ through: `${db.getTenantSchemaPrefix()}"${db.sqlsanitize(tblName)}"`,
1127
+ where: { [db.sqlsanitize(lblField)]: v },
1128
+ },
1129
+ },
1130
+ ];
1131
+ }
1054
1132
  }
1055
1133
  });
1056
1134
  return qstate;
1057
- });
1135
+ };
1058
1136
  /**
1059
1137
  * initial_config_all_fields Contract
1060
1138
  * @function
1061
1139
  * @param {boolean}
1062
1140
  * @returns {function}
1063
1141
  */
1064
- 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 }) => {
1142
+ const initial_config_all_fields = (isEdit) => async ({ table_id, exttable_name }) => {
1065
1143
  const table = await Table.findOne(table_id ? { id: table_id } : { name: exttable_name });
1066
1144
  const fields = (await table.getFields()).filter((f) => !f.primary_key && (!isEdit || !f.calculated));
1067
1145
  var cfg = { columns: [] };
@@ -1153,7 +1231,7 @@ const initial_config_all_fields = contract(is.fun(is.bool, is.fun(is.obj({ table
1153
1231
  });
1154
1232
  cfg.layout = { above: aboves };
1155
1233
  return cfg;
1156
- });
1234
+ };
1157
1235
  /**
1158
1236
  *
1159
1237
  * @param {string} x
@@ -1328,7 +1406,6 @@ module.exports = {
1328
1406
  initial_config_all_fields,
1329
1407
  calcfldViewOptions,
1330
1408
  get_link_view_opts,
1331
- is_column,
1332
1409
  readState,
1333
1410
  readStateStrict,
1334
1411
  stateToQueryString,
@@ -1338,5 +1415,6 @@ module.exports = {
1338
1415
  strictParseInt,
1339
1416
  run_action_column,
1340
1417
  json_list_to_external_table,
1418
+ add_free_variables_to_joinfields,
1341
1419
  };
1342
1420
  //# sourceMappingURL=plugin-helper.js.map