@saltcorn/data 1.3.1-beta.8 → 1.3.1

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 (234) hide show
  1. package/dist/base-plugin/actions.d.ts +5 -5
  2. package/dist/base-plugin/actions.d.ts.map +1 -1
  3. package/dist/base-plugin/actions.js +1 -1
  4. package/dist/base-plugin/actions.js.map +1 -1
  5. package/dist/base-plugin/fieldviews.d.ts.map +1 -1
  6. package/dist/base-plugin/fieldviews.js.map +1 -1
  7. package/dist/base-plugin/fileviews.js.map +1 -1
  8. package/dist/base-plugin/index.d.ts +26 -24
  9. package/dist/base-plugin/index.d.ts.map +1 -1
  10. package/dist/base-plugin/types.d.ts +5 -4
  11. package/dist/base-plugin/types.d.ts.map +1 -1
  12. package/dist/base-plugin/types.js +10 -2
  13. package/dist/base-plugin/types.js.map +1 -1
  14. package/dist/base-plugin/viewtemplates/edit.d.ts +6 -4
  15. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  16. package/dist/base-plugin/viewtemplates/edit.js +70 -23
  17. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  18. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
  19. package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
  20. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
  21. package/dist/base-plugin/viewtemplates/filter.js +2 -2
  22. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  23. package/dist/base-plugin/viewtemplates/list.d.ts +1 -1
  24. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  25. package/dist/base-plugin/viewtemplates/list.js +42 -4
  26. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  27. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
  28. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
  29. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
  30. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  31. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  32. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  33. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +4 -4
  34. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  35. package/dist/base-plugin/viewtemplates/viewable_fields.js +75 -11
  36. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  37. package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
  38. package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
  39. package/dist/db/connect.d.ts.map +1 -1
  40. package/dist/db/connect.js.map +1 -1
  41. package/dist/db/fixtures.d.ts.map +1 -1
  42. package/dist/db/fixtures.js +14 -1
  43. package/dist/db/fixtures.js.map +1 -1
  44. package/dist/db/index.js.map +1 -1
  45. package/dist/db/reset_schema.d.ts.map +1 -1
  46. package/dist/db/reset_schema.js.map +1 -1
  47. package/dist/db/state.d.ts +13 -4
  48. package/dist/db/state.d.ts.map +1 -1
  49. package/dist/db/state.js +155 -17
  50. package/dist/db/state.js.map +1 -1
  51. package/dist/diagram/cy_generate_utils.js +2 -3
  52. package/dist/diagram/cy_generate_utils.js.map +1 -1
  53. package/dist/diagram/cy_raster.js.map +1 -1
  54. package/dist/diagram/node_extract_utils.js +4 -5
  55. package/dist/diagram/node_extract_utils.js.map +1 -1
  56. package/dist/diagram/nodes/table_node.js.map +1 -1
  57. package/dist/index.js +17 -7
  58. package/dist/index.js.map +1 -1
  59. package/dist/migrate.d.ts.map +1 -1
  60. package/dist/migrate.js.map +1 -1
  61. package/dist/migrations/202007091707.d.ts.map +1 -1
  62. package/dist/migrations/202007202144.d.ts.map +1 -1
  63. package/dist/migrations/202008031500.d.ts.map +1 -1
  64. package/dist/migrations/202009221105.d.ts.map +1 -1
  65. package/dist/migrations/202009231331.d.ts.map +1 -1
  66. package/dist/migrations/202010231444.d.ts.map +1 -1
  67. package/dist/migrations/202011021749.d.ts.map +1 -1
  68. package/dist/migrations/202012011203.d.ts.map +1 -1
  69. package/dist/migrations/202012100841.d.ts.map +1 -1
  70. package/dist/migrations/202012281835.d.ts.map +1 -1
  71. package/dist/migrations/202101061051.d.ts.map +1 -1
  72. package/dist/migrations/202101141128.d.ts.map +1 -1
  73. package/dist/migrations/202102091312.d.ts.map +1 -1
  74. package/dist/migrations/202102091312.js.map +1 -1
  75. package/dist/migrations/202102172148.d.ts.map +1 -1
  76. package/dist/migrations/202106102347.d.ts.map +1 -1
  77. package/dist/migrations/202106112120.d.ts.map +1 -1
  78. package/dist/migrations/202106120012.d.ts.map +1 -1
  79. package/dist/migrations/202106120220.d.ts.map +1 -1
  80. package/dist/migrations/202106121701.d.ts.map +1 -1
  81. package/dist/migrations/202107281619.d.ts.map +1 -1
  82. package/dist/migrations/202109201624.d.ts.map +1 -1
  83. package/dist/migrations/202207022002.d.ts.map +1 -1
  84. package/dist/migrations/202210051058.js.map +1 -1
  85. package/dist/migrations/202210101540.js.map +1 -1
  86. package/dist/migrations/202301130917.d.ts.map +1 -1
  87. package/dist/migrations/202304281224.js.map +1 -1
  88. package/dist/migrations/202307211459.js.map +1 -1
  89. package/dist/migrations/202308211648.d.ts.map +1 -1
  90. package/dist/migrations/202402071125.d.ts.map +1 -1
  91. package/dist/migrations/202501081226.d.ts.map +1 -1
  92. package/dist/migrations/202502131103.js.map +1 -1
  93. package/dist/migrations/202503071353.d.ts.map +1 -1
  94. package/dist/mobile-mocks/node/child_process.d.ts.map +1 -1
  95. package/dist/mobile-mocks/node/fs/promises.js +5 -6
  96. package/dist/mobile-mocks/node/fs/promises.js.map +1 -1
  97. package/dist/mobile-mocks/node/fs.js +3 -4
  98. package/dist/mobile-mocks/node/fs.js.map +1 -1
  99. package/dist/mobile-mocks/node/latest-version.js +1 -1
  100. package/dist/mobile-mocks/node/latest-version.js.map +1 -1
  101. package/dist/mobile-mocks/node/v8.js +2 -3
  102. package/dist/mobile-mocks/node/v8.js.map +1 -1
  103. package/dist/model-helper.d.ts +2 -2
  104. package/dist/model-helper.js.map +1 -1
  105. package/dist/models/config.d.ts.map +1 -1
  106. package/dist/models/config.js +28 -16
  107. package/dist/models/config.js.map +1 -1
  108. package/dist/models/crash.js +17 -7
  109. package/dist/models/crash.js.map +1 -1
  110. package/dist/models/discovery.d.ts +6 -5
  111. package/dist/models/discovery.d.ts.map +1 -1
  112. package/dist/models/discovery.js +14 -12
  113. package/dist/models/discovery.js.map +1 -1
  114. package/dist/models/email.d.ts +5 -5
  115. package/dist/models/email.d.ts.map +1 -1
  116. package/dist/models/email.js +17 -7
  117. package/dist/models/email.js.map +1 -1
  118. package/dist/models/eventlog.js.map +1 -1
  119. package/dist/models/expression.d.ts +8 -2
  120. package/dist/models/expression.d.ts.map +1 -1
  121. package/dist/models/expression.js +21 -20
  122. package/dist/models/expression.js.map +1 -1
  123. package/dist/models/field.d.ts.map +1 -1
  124. package/dist/models/field.js +5 -1
  125. package/dist/models/field.js.map +1 -1
  126. package/dist/models/fieldrepeat.js.map +1 -1
  127. package/dist/models/file.d.ts +0 -1
  128. package/dist/models/file.d.ts.map +1 -1
  129. package/dist/models/file.js.map +1 -1
  130. package/dist/models/form.js.map +1 -1
  131. package/dist/models/index.d.ts +26 -19
  132. package/dist/models/index.d.ts.map +1 -1
  133. package/dist/models/internal/async_json_stream.js +1 -1
  134. package/dist/models/internal/async_json_stream.js.map +1 -1
  135. package/dist/models/internal/push_message_helper.js.map +1 -1
  136. package/dist/models/internal/query.d.ts +21 -2
  137. package/dist/models/internal/query.d.ts.map +1 -1
  138. package/dist/models/internal/query.js +44 -1
  139. package/dist/models/internal/query.js.map +1 -1
  140. package/dist/models/internal/table_helper.d.ts.map +1 -1
  141. package/dist/models/internal/table_helper.js.map +1 -1
  142. package/dist/models/layout.d.ts +2 -2
  143. package/dist/models/layout.d.ts.map +1 -1
  144. package/dist/models/layout.js.map +1 -1
  145. package/dist/models/model.d.ts.map +1 -1
  146. package/dist/models/model.js.map +1 -1
  147. package/dist/models/model_instance.d.ts +0 -1
  148. package/dist/models/model_instance.d.ts.map +1 -1
  149. package/dist/models/model_instance.js +17 -7
  150. package/dist/models/model_instance.js.map +1 -1
  151. package/dist/models/notification.js.map +1 -1
  152. package/dist/models/page.d.ts.map +1 -1
  153. package/dist/models/page.js +60 -23
  154. package/dist/models/page.js.map +1 -1
  155. package/dist/models/page_group.js +17 -7
  156. package/dist/models/page_group.js.map +1 -1
  157. package/dist/models/page_group_member.js.map +1 -1
  158. package/dist/models/plugin.js.map +1 -1
  159. package/dist/models/random.d.ts.map +1 -1
  160. package/dist/models/random.js.map +1 -1
  161. package/dist/models/scheduler.d.ts +10 -3
  162. package/dist/models/scheduler.d.ts.map +1 -1
  163. package/dist/models/scheduler.js.map +1 -1
  164. package/dist/models/table.d.ts.map +1 -1
  165. package/dist/models/table.js +23 -51
  166. package/dist/models/table.js.map +1 -1
  167. package/dist/models/table_constraints.js.map +1 -1
  168. package/dist/models/tag.js.map +1 -1
  169. package/dist/models/trigger.d.ts.map +1 -1
  170. package/dist/models/trigger.js +23 -9
  171. package/dist/models/trigger.js.map +1 -1
  172. package/dist/models/user.js.map +1 -1
  173. package/dist/models/view.d.ts +5 -0
  174. package/dist/models/view.d.ts.map +1 -1
  175. package/dist/models/view.js +26 -7
  176. package/dist/models/view.js.map +1 -1
  177. package/dist/models/workflow.d.ts.map +1 -1
  178. package/dist/models/workflow.js +18 -7
  179. package/dist/models/workflow.js.map +1 -1
  180. package/dist/models/workflow_run.js +17 -7
  181. package/dist/models/workflow_run.js.map +1 -1
  182. package/dist/models/workflow_step.js.map +1 -1
  183. package/dist/plugin-helper.d.ts +10 -2
  184. package/dist/plugin-helper.d.ts.map +1 -1
  185. package/dist/plugin-helper.js +100 -6
  186. package/dist/plugin-helper.js.map +1 -1
  187. package/dist/plugin-testing.d.ts +1 -1
  188. package/dist/plugin-testing.d.ts.map +1 -1
  189. package/dist/plugin-testing.js.map +1 -1
  190. package/dist/standard-menu.d.ts.map +1 -1
  191. package/dist/standard-menu.js +12 -12
  192. package/dist/standard-menu.js.map +1 -1
  193. package/dist/tests/actions.test.js +19 -7
  194. package/dist/tests/actions.test.js.map +1 -1
  195. package/dist/tests/assertions.js +6 -7
  196. package/dist/tests/assertions.js.map +1 -1
  197. package/dist/tests/auth.test.js.map +1 -1
  198. package/dist/tests/auxtest.test.js +19 -1
  199. package/dist/tests/auxtest.test.js.map +1 -1
  200. package/dist/tests/calc.test.js +11 -1
  201. package/dist/tests/calc.test.js.map +1 -1
  202. package/dist/tests/common_helpers.js +7 -8
  203. package/dist/tests/common_helpers.js.map +1 -1
  204. package/dist/tests/db.test.js.map +1 -1
  205. package/dist/tests/discover.test.js.map +1 -1
  206. package/dist/tests/exact_views.test.js +185 -17
  207. package/dist/tests/exact_views.test.js.map +1 -1
  208. package/dist/tests/field.test.js +11 -9
  209. package/dist/tests/field.test.js.map +1 -1
  210. package/dist/tests/fieldviews.test.js.map +1 -1
  211. package/dist/tests/file.test.js.map +1 -1
  212. package/dist/tests/mocks.d.ts.map +1 -1
  213. package/dist/tests/mocks.js.map +1 -1
  214. package/dist/tests/page_group.test.js.map +1 -1
  215. package/dist/tests/remote_query_helper.d.ts.map +1 -1
  216. package/dist/tests/table.test.js +23 -0
  217. package/dist/tests/table.test.js.map +1 -1
  218. package/dist/tests/table_history.test.js.map +1 -1
  219. package/dist/tests/tag.test.js.map +1 -1
  220. package/dist/tests/user.test.js.map +1 -1
  221. package/dist/tests/view.test.js +1 -1
  222. package/dist/tests/view.test.js.map +1 -1
  223. package/dist/tests/workflow.test.js +3 -0
  224. package/dist/tests/workflow.test.js.map +1 -1
  225. package/dist/translate.d.ts.map +1 -1
  226. package/dist/utils.d.ts +8 -8
  227. package/dist/utils.d.ts.map +1 -1
  228. package/dist/utils.js +1 -1
  229. package/dist/utils.js.map +1 -1
  230. package/dist/web-mobile-commons.d.ts +1 -1
  231. package/dist/web-mobile-commons.d.ts.map +1 -1
  232. package/dist/web-mobile-commons.js +18 -2
  233. package/dist/web-mobile-commons.js.map +1 -1
  234. package/package.json +11 -11
@@ -31,7 +31,7 @@ export function run(table_id: number, viewname: string, cfg: any, state: string,
31
31
  * @param {object} extra
32
32
  * @returns {Promise<Form[]>}
33
33
  */
34
- export function runMany(table_id: number, viewname: string, { columns, layout, auto_save, split_paste, confirm_leave }: {
34
+ export function runMany(table_id: number, viewname: string, { columns, layout, auto_save, split_paste, confirm_leave, enable_realtime, update_events, }: {
35
35
  columns: any;
36
36
  layout: any;
37
37
  }, state: State, extra: object, { editManyQuery, getRowQuery, optionsQuery }: {
@@ -110,8 +110,9 @@ export function authorise_post({ body, table_id, req }: {
110
110
  }, { authorizePostQuery }: {
111
111
  authorizePostQuery: any;
112
112
  }): Promise<boolean>;
113
- export function virtual_triggers(table_id: any, viewname: any, { enable_realtime }: {
113
+ export function virtual_triggers(table_id: any, viewname: any, { enable_realtime, update_events }: {
114
114
  enable_realtime: any;
115
+ update_events: any;
115
116
  }): {
116
117
  when_trigger: string;
117
118
  table_id: any;
@@ -172,7 +173,7 @@ export declare let name: string;
172
173
  export declare let description: string;
173
174
  export declare function authorise_get({ query, table_id, req }: {
174
175
  query: object;
175
- rest: any;
176
+ rest: any[];
176
177
  }, { authorizeGetQuery }: {
177
178
  authorizeGetQuery: any;
178
179
  }): Promise<boolean>;
@@ -184,7 +185,7 @@ export declare function authorise_get({ query, table_id, req }: {
184
185
  export declare function getStringsForI18n({ layout }: {
185
186
  layout: Layout;
186
187
  }): string[];
187
- export declare function queries({ table_id, name, configuration: { columns, default_state, layout, auto_save, split_paste, destination_type, fixed, confirm_leave, auto_create, delete_unchanged_auto_create, enable_realtime, }, req, res, }: {
188
+ export declare function queries({ table_id, name, configuration: { columns, default_state, layout, auto_save, split_paste, destination_type, fixed, confirm_leave, auto_create, delete_unchanged_auto_create, enable_realtime, update_events, }, req, res, }: {
188
189
  table_id: any;
189
190
  name: any;
190
191
  configuration: {
@@ -199,6 +200,7 @@ export declare function queries({ table_id, name, configuration: { columns, defa
199
200
  auto_create: any;
200
201
  delete_unchanged_auto_create: any;
201
202
  enable_realtime: any;
203
+ update_events: any;
202
204
  };
203
205
  req: any;
204
206
  res: any;
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../base-plugin/viewtemplates/edit.js"],"names":[],"mappings":"AA8FA;;;GAGG;AAEH,4CAJW,MAAM,GACJ,QAAQ,CAwXjB;AA+CJ;;;;;;;;;;;GAWG;AACH,8BAXW,MAAM,YACN,MAAM,mBAIN,MAAM;IAEU,GAAG,EAAnB,MAAM;IACU,GAAG,EAAnB,MAAM;;;IACJ,QAAQ,IAAI,CAAC,CAYzB;AAED;;;;;;;;;GASG;AACH,kCATW,MAAM,YACN,MAAM;IAEE,OAAO;IACP,MAAM;wBAEd,MAAM;;;;IACJ,QAAQ,IAAI,EAAE,CAAC,CA0C3B;AA4qBD;;;;;;;;;;;;;;;;GAgBG;AACH,kCAhBW,MAAM,YACN,MAAM;IAEY,OAAO,EAAzB,MAAM,EAAE;IACQ,MAAM;IACN,KAAK,EAArB,MAAM;IACW,cAAc,EAA/B,OAAO;IACW,oBAAoB,EAAtC,MAAM,EAAE;UACR,MAAM;IAGU,GAAG,EAAnB,MAAM;IACU,GAAG,EAAnB,MAAM;IACU,QAAQ,EAAxB,MAAM;;;;;;;;;iBACJ,QAAQ,IAAI,CAAC,CAmUzB;AA0FD,mKA6BC;AAGD,sHA6BC;AA5wCD;;;;;;GAMG;AACH;IAHmB,OAAO;IACb,QAAQ,MAAM,EAAE,CAAC,CAQ7B;AA6BD,uBAAuB;AACvB,sCAAuD;AAwsDvD;;;;;;iBAwGC;AA1pBD;;;;;;GAMG;AACH;IALwB,IAAI,EAAjB,MAAM;IACO,QAAQ,EAArB,MAAM;IACO,GAAG,EAAhB,MAAM;;;IACJ,QAAQ,OAAO,CAAC,CAO5B;AAgpBD;;;;;;;;;IAyDC;;;;AAxoBD;;;;;;;;;;;GAWG;AACH,sCAXW,MAAM;IAGS,OAAO,EAAtB,MAAM,EAAE;IACA,MAAM;;IAGE,GAAG,EAAnB,MAAM;IACK,GAAG;;;IACZ,QAAQ,MAAM,CAAC,CAe3B;AAED;;;;;;;;;;;;;;;;;;;;;;kBA0GC;;yBAsgBY,MAAM;gCAEN,MAAM;AAmBF;;;;;qBAEd;AACD;;;;GAIG;AACH;;aAEC;AACQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmcP;;;;;AAEF,yGAkBC;AACY;;;GA2DZ;AACiB,6HAEjB"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../base-plugin/viewtemplates/edit.js"],"names":[],"mappings":"AA+FA;;;GAGG;AAEH,4CAJW,MAAM,GACJ,QAAQ,CA4YjB;AA+CJ;;;;;;;;;;;GAWG;AACH,8BAXW,MAAM,YACN,MAAM,mBAIN,MAAM,4CAEd;IAAwB,GAAG,EAAnB,MAAM;IACU,GAAG,EAAnB,MAAM;CACd;;IAAU,OAAO,CAAC,IAAI,CAAC,CAYzB;AAED;;;;;;;;;GASG;AACH,kCATW,MAAM,YACN,MAAM,+FAEd;IAAgB,OAAO,EAAf,GAAC;IACO,MAAM,EAAd,GAAC;CACT,SAAQ,KAAK,SACL,MAAM;;;;IACJ,OAAO,CAAC,IAAI,EAAE,CAAC,CAoD3B;AAwsBD;;;;;;;;;;;;;;;;GAgBG;AACH,kCAhBW,MAAM,YACN,MAAM,0JAEd;IAA0B,OAAO,EAAzB,MAAM,EAAE;IACQ,MAAM,EAAtB,MAAM;IACU,KAAK,EAArB,MAAM;IACW,cAAc,EAA/B,OAAO;IACW,oBAAoB,EAAtC,MAAM,EAAE;CAChB,SAAQ,MAAM,QACN,GAAC,0BAET;IAAwB,GAAG,EAAnB,MAAM;IACU,GAAG,EAAnB,MAAM;IACU,QAAQ,EAAxB,MAAM;CACd;;;;;;;;iBAAU,OAAO,CAAC,IAAI,CAAC,CAmUzB;AA0FD,mKA6BC;AAGD,sHA6BC;AAlzCD;;;;;;GAMG;AACH,2CANW,GAAC,YACD,GAAC,eAET;IAAgB,OAAO,EAAf,GAAC;CACT,GAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ7B;AA6BD,uBAAuB;AACvB,sCAAuD;AA8uDvD;;;;;;iBAwGC;AA1pBD;;;;;;GAMG;AACH,wDALG;IAAqB,IAAI,EAAjB,MAAM;IACO,QAAQ,EAArB,MAAM;IACO,GAAG,EAAhB,MAAM;CACd;;IAAU,OAAO,CAAC,OAAO,CAAC,CAO5B;AAgpBD;;;;;;;;;;IAmEC;;;;AAlpBD;;;;;;;;;;;GAWG;AACH,sCAXW,MAAM,YACN,GAAC,uBAET;IAAuB,OAAO,EAAtB,MAAM,EAAE;IACA,MAAM,EAAd,GAAC;CACT,QAAQ,GAAC,gBAET;IAAwB,GAAG,EAAnB,MAAM;IACK,GAAG,EAAd,GAAC;CACT;;IAAU,OAAO,CAAC,MAAM,CAAC,CAe3B;AAED;;;;;;;;;;;;;;;;;;;;;;kBA0GC;;yBAghBY,MAAM;gCAEN,MAAM;AAmBF,gEAJZ;IAAqB,KAAK,EAAlB,MAAM;IACK,IAAI,EAAZ,GAAC,EAAA;CACZ;;IAAU,OAAO,CAAC,OAAO,CAAC,CAI5B;AACD;;;;GAIG;AACH,sDAHG;IAAqB,MAAM,EAAnB,MAAM;CACd,GAAU,MAAM,EAAE,CAIpB;AACQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqcP;;;;;AAEF,yGAkBC;AACY;;;GA2DZ;AACiB,6HAEjB"}
@@ -23,7 +23,7 @@ const { get_expression_function, expressionChecker, eval_expression, freeVariabl
23
23
  const { InvalidConfiguration, isNode, isWeb, isTest, mergeIntoWhere, dollarizeObject, getSessionId, interpolate, asyncMap, removeEmptyStrings, } = require("../../utils");
24
24
  const Library = require("../../models/library");
25
25
  const { check_view_columns } = require("../../plugin-testing");
26
- const { initial_config_all_fields, calcfldViewOptions, calcfldViewConfig, get_parent_views, picked_fields_to_query, stateFieldsToWhere, stateFieldsToQuery, getActionConfigFields, run_action_column, add_free_variables_to_joinfields, readState, stateToQueryString, pathToState, displayType, } = require("../../plugin-helper");
26
+ const { initial_config_all_fields, calcfldViewOptions, calcfldViewConfig, get_parent_views, picked_fields_to_query, stateFieldsToWhere, stateFieldsToQuery, getActionConfigFields, run_action_column, add_free_variables_to_joinfields, readState, stateToQueryString, pathToState, displayType, runCollabEvents, } = require("../../plugin-helper");
27
27
  const { splitUniques, getForm, fill_presets, parse_view_select, get_view_link_query, objToQueryString, action_url, action_link, view_linker, edit_build_in_actions, } = require("./viewable_fields");
28
28
  const { traverse, getStringsForI18n, translateLayout, traverseSync, splitLayoutContainerFields, findLayoutBranchWith, } = require("../../models/layout");
29
29
  const { extractFromLayout } = require("../../diagram/node_extract_utils");
@@ -239,6 +239,7 @@ const configuration_workflow = (req) => new Workflow({
239
239
  }));
240
240
  const pages = await Page.find();
241
241
  const groups = await PageGroup.find();
242
+ const triggers = Trigger.find();
242
243
  return new Form({
243
244
  fields: [
244
245
  {
@@ -280,6 +281,21 @@ const configuration_workflow = (req) => new Workflow({
280
281
  type: "Bool",
281
282
  default: false,
282
283
  },
284
+ new FieldRepeat({
285
+ name: "update_events",
286
+ showIf: { enable_realtime: true },
287
+ fields: [
288
+ {
289
+ type: "String",
290
+ name: "event",
291
+ label: req.__("Update event"),
292
+ sublabel: req.__("Custom event for real-time updates"),
293
+ attributes: {
294
+ options: triggers.map((t) => t.name),
295
+ },
296
+ },
297
+ ],
298
+ }),
283
299
  {
284
300
  name: "destination_type",
285
301
  label: "Destination type",
@@ -432,7 +448,7 @@ const run = async (table_id, viewname, cfg, state, { res, req, isPreview, hidden
432
448
  * @param {object} extra
433
449
  * @returns {Promise<Form[]>}
434
450
  */
435
- const runMany = async (table_id, viewname, { columns, layout, auto_save, split_paste, confirm_leave }, state, extra, { editManyQuery, getRowQuery, optionsQuery }) => {
451
+ const runMany = async (table_id, viewname, { columns, layout, auto_save, split_paste, confirm_leave, enable_realtime, update_events, }, state, extra, { editManyQuery, getRowQuery, optionsQuery }) => {
436
452
  let { table, fields, rows } = await editManyQuery(state, {
437
453
  limit: extra.limit,
438
454
  offset: extra.offset,
@@ -462,6 +478,8 @@ const runMany = async (table_id, viewname, { columns, layout, auto_save, split_p
462
478
  split_paste,
463
479
  isRemote,
464
480
  confirm_leave,
481
+ enable_realtime,
482
+ update_events,
465
483
  });
466
484
  return { html, row };
467
485
  });
@@ -476,7 +494,8 @@ const runMany = async (table_id, viewname, { columns, layout, auto_save, split_p
476
494
  * @throws {InvalidConfiguration}
477
495
  * @returns {Promise<void>}
478
496
  */
479
- const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname, optionsQuery, }) => {
497
+ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname, optionsQuery, state, }) => {
498
+ let originalState = state;
480
499
  let pseudo_row = {};
481
500
  if (!row) {
482
501
  table.fields.forEach((f) => {
@@ -653,6 +672,11 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
653
672
  segment.field_repeat = fr;
654
673
  return;
655
674
  } // end edit in edit
675
+ const outerState = {};
676
+ Object.entries(originalState || {}).forEach(([k, v]) => {
677
+ if (k.startsWith("_"))
678
+ outerState[k] = v;
679
+ });
656
680
  let state = {};
657
681
  let urlFormula;
658
682
  let needFields = new Set();
@@ -673,7 +697,7 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
673
697
  const type = relation.type;
674
698
  if (!row && type == RelationType.OWN) {
675
699
  segment.type = "blank";
676
- urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row)`;
700
+ urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
677
701
  segment.contents = segment.contents = div({
678
702
  class: "d-inline",
679
703
  "data-sc-embed-viewname": view.name,
@@ -685,7 +709,7 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
685
709
  else if (!row &&
686
710
  type !== RelationType.INDEPENDENT &&
687
711
  !relation.isFixedRelation()) {
688
- urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row)`;
712
+ urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
689
713
  segment.contents = segment.contents = div({
690
714
  class: "d-inline",
691
715
  "data-sc-embed-viewname": view.name,
@@ -696,7 +720,7 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
696
720
  }
697
721
  const userId = req?.user?.id;
698
722
  state = pathToState(relation, relation.isFixedRelation() ? () => userId : (k) => row[k]);
699
- urlFormula = `add_extra_state('/view/${view.name}?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row)`;
723
+ urlFormula = `add_extra_state('/view/${view.name}?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
700
724
  }
701
725
  }
702
726
  else {
@@ -707,23 +731,23 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
707
731
  switch (view_select.type) {
708
732
  case "Own":
709
733
  state = { id: row?.id };
710
- urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row)`;
734
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
711
735
  needFields.add("id");
712
736
  break;
713
737
  case "Independent":
714
738
  state = {};
715
- urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row)`;
739
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
716
740
  needFields.add("id");
717
741
  break;
718
742
  case "ChildList":
719
743
  case "OneToOneShow":
720
744
  state = { [view_select.field_name]: row?.id };
721
- urlFormula = `add_extra_state('/view/${view.name}/?${view_select.field_name}='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row)`;
745
+ urlFormula = `add_extra_state('/view/${view.name}/?${view_select.field_name}='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
722
746
  needFields.add("id");
723
747
  break;
724
748
  case "ParentShow":
725
749
  state = { id: row?.[view_select.field_name] };
726
- urlFormula = `add_extra_state('/view/${view.name}/?id='+row.${view_select.field_name}, ${JSON.stringify(segment.extra_state_fml)}, row)`;
750
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.${view_select.field_name}, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
727
751
  needFields.add(view_select.field_name);
728
752
  break;
729
753
  }
@@ -745,7 +769,7 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
745
769
  ...(row || pseudo_row),
746
770
  }, req.user, `Extra state formula for embedding view ${view.name}`)
747
771
  : {};
748
- const qs = stateToQueryString({ ...state, ...extra_state }, true);
772
+ const qs = stateToQueryString({ ...state, ...outerState, ...extra_state }, true);
749
773
  segment.contents = div({
750
774
  class: "d-inline",
751
775
  "data-sc-embed-viewname": view.name,
@@ -753,7 +777,7 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
753
777
  "data-view-source-current": `/view/${view.name}${qs}`,
754
778
  "data-view-source-need-fields": [...needFields].join(","),
755
779
  "data-view-source": encodeURIComponent(urlFormula),
756
- }, await view.run({ ...state, ...extra_state }, { req, res }, view.isRemoteTable()));
780
+ }, await view.run({ ...state, ...outerState, ...extra_state }, { req, res }, view.isRemoteTable()));
757
781
  },
758
782
  });
759
783
  translateLayout(form.layout, req.getLocale());
@@ -761,22 +785,33 @@ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname
761
785
  form.xhrSubmit = true;
762
786
  setDateLocales(form, req.getLocale());
763
787
  };
764
- const realTimeScript = (viewname, table_id, row) => {
788
+ const realTimeScript = (viewname, table_id, row, scriptId) => {
765
789
  const view = View.findOne({ name: viewname });
766
790
  const table = Table.findOne({ id: table_id });
767
791
  const rowId = row[table.pk_name];
768
792
  return `
769
793
  const collabCfg = {
770
794
  events: {
771
- '${view.getRealTimeEventName(`UPDATE_EVENT?id=${rowId}`)}': (data) => {
795
+ '${view.getRealTimeEventName(`UPDATE_EVENT?id=${rowId}`)}': async (data) => {
772
796
  console.log("Update event received for view ${viewname}", data);
797
+ const script = document.getElementById('${scriptId}');
798
+ const closestDiv = script?.closest(
799
+ 'div[data-sc-embed-viewname="${viewname}"]'
800
+ );
773
801
  if (data.updates) {
774
- common_done({set_fields: data.updates, no_onchange: true}, "${viewname}");
802
+ if (closestDiv) await common_done({set_fields: data.updates, no_onchange: true}, closestDiv);
803
+ else await common_done({set_fields: data.updates, no_onchange: true}, "${viewname}");
804
+ }
805
+ if (data.actions) {
806
+ for (const action of data.actions) {
807
+ if (closestDiv) await common_done(action, closestDiv);
808
+ else await common_done(action, "${viewname}");
809
+ }
775
810
  }
776
811
  }
777
812
  }
778
813
  };
779
- init_collab_room('${viewname}', collabCfg);`;
814
+ init_collab_room('${viewname}', collabCfg);`.trim();
780
815
  };
781
816
  /**
782
817
  * @param {object} opts
@@ -937,12 +972,16 @@ const render = async ({ table, fields, viewname, columns, layout, row, req, stat
937
972
  : `form${Math.floor(Math.random() * 16777215).toString(16)}`;
938
973
  const identicalFieldsScript = script(domReady(`const editForm = document.getElementById('${formId}'); if (editForm) editForm.addEventListener("change", handle_identical_fields, true);`));
939
974
  const dynamic_updates_enabled = getState().getConfig("enable_dynamic_updates", true);
975
+ const rndid = isTest()
976
+ ? "test-script-id"
977
+ : Math.floor(Math.random() * 16777215).toString(16);
940
978
  const realTimeCollabScript = enable_realtime && row && !(req.headers?.pjaxpageload === "true")
941
979
  ? (!dynamic_updates_enabled
942
980
  ? script({
943
981
  src: `/static_assets/${db.connectObj.version_tag}/socket.io.min.js`,
944
982
  })
945
- : "") + script(domReady(realTimeScript(viewname, table.id, row)))
983
+ : "") +
984
+ script({ id: rndid }, domReady(realTimeScript(viewname, table.id, row, rndid)))
946
985
  : "";
947
986
  if (actually_auto_save) {
948
987
  for (const field of form.fields) {
@@ -959,6 +998,7 @@ const render = async ({ table, fields, viewname, columns, layout, row, req, stat
959
998
  getRowQuery,
960
999
  viewname,
961
1000
  optionsQuery,
1001
+ state,
962
1002
  });
963
1003
  form.id = formId;
964
1004
  return (renderForm(form, !isRemote && req.csrfToken ? req.csrfToken() : false) +
@@ -1756,7 +1796,7 @@ const createBasicView = async ({ table, viewname, template_view, template_table,
1756
1796
  cfg.split_paste = template_view.configuration.split_paste;
1757
1797
  return cfg;
1758
1798
  };
1759
- const virtual_triggers = (table_id, viewname, { enable_realtime }) => {
1799
+ const virtual_triggers = (table_id, viewname, { enable_realtime, update_events }) => {
1760
1800
  if (!enable_realtime)
1761
1801
  return [];
1762
1802
  const table = Table.findOne({ id: table_id });
@@ -1792,15 +1832,21 @@ const virtual_triggers = (table_id, viewname, { enable_realtime }) => {
1792
1832
  }
1793
1833
  else {
1794
1834
  // build and emit updates
1795
- const updateVals = {};
1835
+ const updates = {};
1796
1836
  for (const fieldName of changedLayoutFields) {
1797
1837
  const newVal = row[fieldName];
1798
- updateVals[fieldName] = newVal;
1838
+ updates[fieldName] = newVal;
1799
1839
  }
1800
1840
  const rowId = row[table.pk_name];
1801
- getState().log(6, "Emitting real-time update for row", rowId, updateVals);
1841
+ const actionResults = await runCollabEvents(update_events, user, {
1842
+ new_row: row,
1843
+ old_row: old_row,
1844
+ updates: updates,
1845
+ });
1846
+ getState().log(6, "Emitting real-time update for row", rowId, updates);
1802
1847
  view.emitRealTimeEvent(`UPDATE_EVENT?id=${rowId}`, {
1803
- updates: updateVals,
1848
+ updates: updates,
1849
+ actions: actionResults,
1804
1850
  });
1805
1851
  }
1806
1852
  },
@@ -1840,7 +1886,7 @@ module.exports = {
1840
1886
  getStringsForI18n({ layout }) {
1841
1887
  return getStringsForI18n(layout);
1842
1888
  },
1843
- queries: ({ table_id, name, configuration: { columns, default_state, layout, auto_save, split_paste, destination_type, fixed, confirm_leave, auto_create, delete_unchanged_auto_create, enable_realtime, }, req, res, }) => ({
1889
+ queries: ({ table_id, name, configuration: { columns, default_state, layout, auto_save, split_paste, destination_type, fixed, confirm_leave, auto_create, delete_unchanged_auto_create, enable_realtime, update_events, }, req, res, }) => ({
1844
1890
  async editQuery(state, mobileReferrer, isPreview, hiddenLoginDest) {
1845
1891
  const table = Table.findOne({ id: table_id });
1846
1892
  const fields = table.getFields();
@@ -1922,6 +1968,7 @@ module.exports = {
1922
1968
  auto_created_row,
1923
1969
  hiddenLoginDest,
1924
1970
  enable_realtime,
1971
+ update_events,
1925
1972
  });
1926
1973
  },
1927
1974
  async editManyQuery(state, { limit, offset, orderBy, orderDesc, where }) {