@saltcorn/data 1.6.0-alpha.2 → 1.6.0-alpha.4

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 (190) hide show
  1. package/dist/base-plugin/actions.d.ts +1 -1
  2. package/dist/base-plugin/index.d.ts.map +1 -1
  3. package/dist/base-plugin/viewtemplates/edit.js +1 -1
  4. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  5. package/dist/base-plugin/viewtemplates/filter.js +1 -1
  6. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  7. package/dist/base-plugin/viewtemplates/list.js +1 -1
  8. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  9. package/dist/base-plugin/viewtemplates/listshowlist.js +1 -1
  10. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
  11. package/dist/base-plugin/viewtemplates/room.js +1 -1
  12. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  13. package/dist/base-plugin/viewtemplates/show.js +1 -1
  14. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  15. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +2 -187
  16. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  17. package/dist/base-plugin/viewtemplates/viewable_fields.js +2 -1898
  18. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  19. package/dist/base-plugin/viewtemplates/workflow-room.js +1 -1
  20. package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
  21. package/dist/db/connect.d.ts.map +1 -1
  22. package/dist/db/connect.js +19 -2
  23. package/dist/db/connect.js.map +1 -1
  24. package/dist/diagram/node_extract_utils.js +1 -1
  25. package/dist/diagram/node_extract_utils.js.map +1 -1
  26. package/dist/models/file.d.ts +1 -1
  27. package/dist/models/file.d.ts.map +1 -1
  28. package/dist/models/page.d.ts.map +1 -1
  29. package/dist/models/page.js +28 -1
  30. package/dist/models/page.js.map +1 -1
  31. package/dist/models/table.d.ts.map +1 -1
  32. package/dist/models/table.js +5 -1
  33. package/dist/models/table.js.map +1 -1
  34. package/dist/models/workflow_step.d.ts +5 -0
  35. package/dist/models/workflow_step.d.ts.map +1 -1
  36. package/dist/models/workflow_step.js +142 -0
  37. package/dist/models/workflow_step.js.map +1 -1
  38. package/dist/plugin-helper.d.ts +1 -1
  39. package/dist/plugin-helper.d.ts.map +1 -1
  40. package/dist/plugin-helper.js +18 -7
  41. package/dist/plugin-helper.js.map +1 -1
  42. package/dist/plugin-testing.js +1 -1
  43. package/dist/plugin-testing.js.map +1 -1
  44. package/dist/viewable_fields.d.ts +16 -0
  45. package/dist/viewable_fields.d.ts.map +1 -1
  46. package/dist/viewable_fields.js +342 -4
  47. package/dist/viewable_fields.js.map +1 -1
  48. package/dist/web-mobile-commons.js +1 -1
  49. package/dist/web-mobile-commons.js.map +1 -1
  50. package/package.json +8 -8
  51. package/dist/models/s3_helpers.d.ts +0 -54
  52. package/dist/models/s3_helpers.d.ts.map +0 -1
  53. package/dist/models/s3_helpers.js +0 -505
  54. package/dist/models/s3_helpers.js.map +0 -1
  55. package/dist/test-utils/mocks.d.ts +0 -203
  56. package/dist/test-utils/mocks.d.ts.map +0 -1
  57. package/dist/test-utils/mocks.js +0 -329
  58. package/dist/test-utils/mocks.js.map +0 -1
  59. package/dist/tests/actions.test.d.ts +0 -2
  60. package/dist/tests/actions.test.d.ts.map +0 -1
  61. package/dist/tests/actions.test.js +0 -860
  62. package/dist/tests/actions.test.js.map +0 -1
  63. package/dist/tests/auth.test.d.ts +0 -2
  64. package/dist/tests/auth.test.d.ts.map +0 -1
  65. package/dist/tests/auth.test.js +0 -790
  66. package/dist/tests/auth.test.js.map +0 -1
  67. package/dist/tests/auxtest.test.d.ts +0 -2
  68. package/dist/tests/auxtest.test.d.ts.map +0 -1
  69. package/dist/tests/auxtest.test.js +0 -556
  70. package/dist/tests/auxtest.test.js.map +0 -1
  71. package/dist/tests/base.test.d.ts +0 -2
  72. package/dist/tests/base.test.d.ts.map +0 -1
  73. package/dist/tests/base.test.js +0 -30
  74. package/dist/tests/base.test.js.map +0 -1
  75. package/dist/tests/calc.test.d.ts +0 -2
  76. package/dist/tests/calc.test.d.ts.map +0 -1
  77. package/dist/tests/calc.test.js +0 -1081
  78. package/dist/tests/calc.test.js.map +0 -1
  79. package/dist/tests/composite_pk.test.d.ts +0 -2
  80. package/dist/tests/composite_pk.test.d.ts.map +0 -1
  81. package/dist/tests/composite_pk.test.js +0 -98
  82. package/dist/tests/composite_pk.test.js.map +0 -1
  83. package/dist/tests/config.test.d.ts +0 -2
  84. package/dist/tests/config.test.d.ts.map +0 -1
  85. package/dist/tests/config.test.js +0 -86
  86. package/dist/tests/config.test.js.map +0 -1
  87. package/dist/tests/db.test.d.ts +0 -2
  88. package/dist/tests/db.test.d.ts.map +0 -1
  89. package/dist/tests/db.test.js +0 -178
  90. package/dist/tests/db.test.js.map +0 -1
  91. package/dist/tests/discover.test.d.ts +0 -2
  92. package/dist/tests/discover.test.d.ts.map +0 -1
  93. package/dist/tests/discover.test.js +0 -245
  94. package/dist/tests/discover.test.js.map +0 -1
  95. package/dist/tests/edit.test.d.ts +0 -2
  96. package/dist/tests/edit.test.d.ts.map +0 -1
  97. package/dist/tests/edit.test.js +0 -1161
  98. package/dist/tests/edit.test.js.map +0 -1
  99. package/dist/tests/email.test.d.ts +0 -2
  100. package/dist/tests/email.test.d.ts.map +0 -1
  101. package/dist/tests/email.test.js +0 -255
  102. package/dist/tests/email.test.js.map +0 -1
  103. package/dist/tests/exact_views.test.d.ts +0 -2
  104. package/dist/tests/exact_views.test.d.ts.map +0 -1
  105. package/dist/tests/exact_views.test.js +0 -1363
  106. package/dist/tests/exact_views.test.js.map +0 -1
  107. package/dist/tests/field.test.d.ts +0 -2
  108. package/dist/tests/field.test.d.ts.map +0 -1
  109. package/dist/tests/field.test.js +0 -588
  110. package/dist/tests/field.test.js.map +0 -1
  111. package/dist/tests/fieldviews.test.d.ts +0 -2
  112. package/dist/tests/fieldviews.test.d.ts.map +0 -1
  113. package/dist/tests/fieldviews.test.js +0 -74
  114. package/dist/tests/fieldviews.test.js.map +0 -1
  115. package/dist/tests/file.test.d.ts +0 -2
  116. package/dist/tests/file.test.d.ts.map +0 -1
  117. package/dist/tests/file.test.js +0 -148
  118. package/dist/tests/file.test.js.map +0 -1
  119. package/dist/tests/filter.test.d.ts +0 -2
  120. package/dist/tests/filter.test.d.ts.map +0 -1
  121. package/dist/tests/filter.test.js +0 -496
  122. package/dist/tests/filter.test.js.map +0 -1
  123. package/dist/tests/form.test.d.ts +0 -2
  124. package/dist/tests/form.test.d.ts.map +0 -1
  125. package/dist/tests/form.test.js +0 -199
  126. package/dist/tests/form.test.js.map +0 -1
  127. package/dist/tests/list.test.d.ts +0 -2
  128. package/dist/tests/list.test.d.ts.map +0 -1
  129. package/dist/tests/list.test.js +0 -1037
  130. package/dist/tests/list.test.js.map +0 -1
  131. package/dist/tests/mail_queue.test.d.ts +0 -2
  132. package/dist/tests/mail_queue.test.d.ts.map +0 -1
  133. package/dist/tests/mail_queue.test.js +0 -122
  134. package/dist/tests/mail_queue.test.js.map +0 -1
  135. package/dist/tests/models.test.d.ts +0 -2
  136. package/dist/tests/models.test.d.ts.map +0 -1
  137. package/dist/tests/models.test.js +0 -417
  138. package/dist/tests/models.test.js.map +0 -1
  139. package/dist/tests/page.test.d.ts +0 -2
  140. package/dist/tests/page.test.d.ts.map +0 -1
  141. package/dist/tests/page.test.js +0 -26
  142. package/dist/tests/page.test.js.map +0 -1
  143. package/dist/tests/page_group.test.d.ts +0 -2
  144. package/dist/tests/page_group.test.d.ts.map +0 -1
  145. package/dist/tests/page_group.test.js +0 -51
  146. package/dist/tests/page_group.test.js.map +0 -1
  147. package/dist/tests/plugin.test.d.ts +0 -2
  148. package/dist/tests/plugin.test.d.ts.map +0 -1
  149. package/dist/tests/plugin.test.js +0 -60
  150. package/dist/tests/plugin.test.js.map +0 -1
  151. package/dist/tests/show.test.d.ts +0 -2
  152. package/dist/tests/show.test.d.ts.map +0 -1
  153. package/dist/tests/show.test.js +0 -561
  154. package/dist/tests/show.test.js.map +0 -1
  155. package/dist/tests/state.test.d.ts +0 -2
  156. package/dist/tests/state.test.d.ts.map +0 -1
  157. package/dist/tests/state.test.js +0 -82
  158. package/dist/tests/state.test.js.map +0 -1
  159. package/dist/tests/table.test.d.ts +0 -2
  160. package/dist/tests/table.test.d.ts.map +0 -1
  161. package/dist/tests/table.test.js +0 -2717
  162. package/dist/tests/table.test.js.map +0 -1
  163. package/dist/tests/table_history.test.d.ts +0 -2
  164. package/dist/tests/table_history.test.d.ts.map +0 -1
  165. package/dist/tests/table_history.test.js +0 -413
  166. package/dist/tests/table_history.test.js.map +0 -1
  167. package/dist/tests/table_sync_info.test.d.ts +0 -2
  168. package/dist/tests/table_sync_info.test.d.ts.map +0 -1
  169. package/dist/tests/table_sync_info.test.js +0 -62
  170. package/dist/tests/table_sync_info.test.js.map +0 -1
  171. package/dist/tests/tag.test.d.ts +0 -2
  172. package/dist/tests/tag.test.d.ts.map +0 -1
  173. package/dist/tests/tag.test.js +0 -97
  174. package/dist/tests/tag.test.js.map +0 -1
  175. package/dist/tests/user.test.d.ts +0 -2
  176. package/dist/tests/user.test.d.ts.map +0 -1
  177. package/dist/tests/user.test.js +0 -390
  178. package/dist/tests/user.test.js.map +0 -1
  179. package/dist/tests/view.test.d.ts +0 -2
  180. package/dist/tests/view.test.d.ts.map +0 -1
  181. package/dist/tests/view.test.js +0 -699
  182. package/dist/tests/view.test.js.map +0 -1
  183. package/dist/tests/workflow.test.d.ts +0 -2
  184. package/dist/tests/workflow.test.d.ts.map +0 -1
  185. package/dist/tests/workflow.test.js +0 -303
  186. package/dist/tests/workflow.test.js.map +0 -1
  187. package/dist/tests/workflow_run.test.d.ts +0 -2
  188. package/dist/tests/workflow_run.test.d.ts.map +0 -1
  189. package/dist/tests/workflow_run.test.js +0 -826
  190. package/dist/tests/workflow_run.test.js.map +0 -1
@@ -7,12 +7,13 @@
7
7
  const { post_btn } = require("@saltcorn/markup");
8
8
  const { text, a, i, div, button, span, script, domReady, input, } = require("@saltcorn/markup/tags");
9
9
  const { getState, getReq__ } = require("./db/state");
10
- const { link_view, displayType, run_action_column, } = require("./plugin-helper");
10
+ const { link_view, displayType, run_action_column, stateToQueryString, pathToState, } = require("./plugin-helper");
11
11
  const { eval_expression, freeVariables, get_expression_function, } = require("./models/expression");
12
12
  const Field = require("./models/field");
13
+ const FieldRepeat = require("./models/fieldrepeat");
13
14
  const Form = require("./models/form");
14
- const { traverseSync } = require("./models/layout");
15
- const { structuredClone, isWeb, isOfflineMode, getSessionId, interpolate, objectToQueryString, validSqlId, } = require("./utils");
15
+ const { traverseSync, traverse, translateLayout, } = require("./models/layout");
16
+ const { structuredClone, isWeb, isOfflineMode, getSessionId, interpolate, objectToQueryString, validSqlId, InvalidConfiguration, renderServerSide, } = require("./utils");
16
17
  const db = require("./db");
17
18
  const View = require("./models/view");
18
19
  const Table = require("./models/table");
@@ -1023,7 +1024,7 @@ const standardLayoutRowVisitor = (viewname, state, table, row, req) => {
1023
1024
  const locale = req.getLocale();
1024
1025
  const fields = table.fields;
1025
1026
  const evalMaybeExpr = (segment, key, fmlkey) => {
1026
- if (segment.isFormula && segment.isFormula[fmlkey || key]) {
1027
+ if (segment.isFormula && segment.isFormula[fmlkey || key] && segment[key]) {
1027
1028
  segment[key] = eval_expression(segment[key], { session_id, locale, ...row }, req.user, `property ${key} in segment of type ${segment.type}`);
1028
1029
  }
1029
1030
  };
@@ -1451,6 +1452,7 @@ const getForm = async (table, viewname, columns, layout0, id, req, isRemote) =>
1451
1452
  ref: ref.replace("?", ""),
1452
1453
  target,
1453
1454
  refTable: refField.reftable_name,
1455
+ refTablePK: Table.findOne(refField.reftable_name).pk_name,
1454
1456
  };
1455
1457
  })
1456
1458
  .filter(Boolean);
@@ -1490,6 +1492,339 @@ const getForm = async (table, viewname, columns, layout0, id, req, isRemote) =>
1490
1492
  form.hidden(form.pk_name);
1491
1493
  return form;
1492
1494
  };
1495
+ const transformForm = async ({ form, table, req, row, res, getRowQuery, viewname, optionsQuery, state, }) => {
1496
+ let originalState = state;
1497
+ let pseudo_row = {};
1498
+ if (!row) {
1499
+ table.fields.forEach((f) => {
1500
+ pseudo_row[f.name] = undefined;
1501
+ });
1502
+ }
1503
+ const appState = getState();
1504
+ const __ = db.is_node && appState
1505
+ ? (s) => appState.i18n.__({ phrase: s, locale: req.getLocale() }) || s
1506
+ : (s) => {
1507
+ return s;
1508
+ };
1509
+ await traverse(form.layout, {
1510
+ container(segment) {
1511
+ if (segment.click_action) {
1512
+ segment.url = `javascript:view_post(this, 'run_action', {click_action: '${segment.click_action}', ...get_form_record(this) })`;
1513
+ }
1514
+ },
1515
+ async action(segment) {
1516
+ if (segment.action_style === "on_page_load") {
1517
+ segment.type = "blank";
1518
+ segment.style = {};
1519
+ if (segment.minRole && segment.minRole != 100) {
1520
+ const minRole = +segment.minRole;
1521
+ const userRole = req?.user?.role_id || 100;
1522
+ if (minRole < userRole)
1523
+ return;
1524
+ }
1525
+ if (req.method === "POST")
1526
+ return;
1527
+ //run action
1528
+ try {
1529
+ const actionResult = await run_action_column({
1530
+ col: { ...segment },
1531
+ referrer: req?.get?.("Referrer"),
1532
+ req,
1533
+ res,
1534
+ table,
1535
+ row: row || pseudo_row,
1536
+ });
1537
+ if (actionResult)
1538
+ segment.contents = script(domReady(`common_done(${JSON.stringify(actionResult)}, "${viewname}")`));
1539
+ }
1540
+ catch (e) {
1541
+ appState.log(5, `Error in Edit ${viewname} on page load action: ${e.message}`);
1542
+ e.message = `Error in evaluating Run on Page Load action in view ${viewname}: ${e.message}`;
1543
+ throw e;
1544
+ }
1545
+ }
1546
+ if (segment.action_name === "Delete") {
1547
+ if (form.values && form.values[table.pk_name]) {
1548
+ segment.action_url = table.delete_url(form.values);
1549
+ }
1550
+ else {
1551
+ segment.type = "blank";
1552
+ segment.contents = "";
1553
+ }
1554
+ }
1555
+ else if (segment.action_name === "form_action" &&
1556
+ segment.configuration?.form_action === "Save" &&
1557
+ table.fields.some((f) => f.type === "File")) {
1558
+ let url = action_url(viewname, table, segment.action_name, row, segment.rndid, "rndid", segment.confirm);
1559
+ if (url.javascript) {
1560
+ //redo to include dynamic row
1561
+ const confirmStr = segment.confirm
1562
+ ? `if(confirm('Are you sure?'))`
1563
+ : "";
1564
+ url.javascript = `${confirmStr}view_post(this, 'run_action', get_form_data(this, '${segment.rndid}') );`;
1565
+ }
1566
+ segment.action_link = action_link(url, req, segment, __);
1567
+ }
1568
+ else if (!["Sign up", ...edit_build_in_actions].includes(segment.action_name) &&
1569
+ !segment.action_name.startsWith("Login")) {
1570
+ let url = action_url(viewname, table, segment.action_name, row, segment.rndid, "rndid", segment.confirm, undefined, segment.run_async);
1571
+ if (url.javascript) {
1572
+ //redo to include dynamic row
1573
+ const confirmStr = segment.confirm
1574
+ ? `if(confirm('Are you sure?'))`
1575
+ : "";
1576
+ // If this is a Multi-step action or the form/table contains File fields,
1577
+ // post multipart FormData so req.files is populated server-side.
1578
+ const hasFileFields = table.fields?.some((f) => f.type === "File");
1579
+ if (segment.action_name === "Multi-step action" || hasFileFields) {
1580
+ url.javascript = `${confirmStr}view_post(this, 'run_action', get_form_data(this, '${segment.rndid}') );`;
1581
+ }
1582
+ else {
1583
+ url.javascript = `${confirmStr}view_post(this, 'run_action', {rndid:'${segment.rndid}', ...get_form_record(this)});`;
1584
+ }
1585
+ }
1586
+ segment.action_link = action_link(url, req, segment, __);
1587
+ }
1588
+ },
1589
+ join_field(segment) {
1590
+ const qs = objToQueryString(segment.configuration);
1591
+ segment.sourceURL = `/field/show-calculated/${table.name}/${segment.join_field}/${segment.fieldview}?${qs}`;
1592
+ },
1593
+ tabs(segment) {
1594
+ const to_delete = new Set();
1595
+ (segment.showif || []).forEach((sif, ix) => {
1596
+ if (sif) {
1597
+ const showit = eval_expression(sif, row || pseudo_row, req.user, "Tab show if formula");
1598
+ if (!showit)
1599
+ to_delete.add(ix);
1600
+ }
1601
+ });
1602
+ segment.titles = segment.titles.filter((v, ix) => !to_delete.has(ix));
1603
+ segment.contents = segment.contents.filter((v, ix) => !to_delete.has(ix));
1604
+ (segment.titles || []).forEach((t, ix) => {
1605
+ if (typeof t === "string" && t.includes("{{")) {
1606
+ segment.titles[ix] = interpolate(t, row, req.user, "Tab titles");
1607
+ }
1608
+ });
1609
+ },
1610
+ view_link(segment) {
1611
+ segment.type = "blank";
1612
+ const view_select = parse_view_select(segment.view);
1613
+ if (!row && view_select.type !== "Independent") {
1614
+ segment.contents = "";
1615
+ }
1616
+ else {
1617
+ const prefix = req.generate_email && req.get_base_url ? req.get_base_url() : "";
1618
+ const { key } = view_linker(segment, table.fields, (s) => s, isWeb(req), req.user, prefix, req.query, req, viewname);
1619
+ segment.contents = key(row || {});
1620
+ }
1621
+ },
1622
+ async view(segment) {
1623
+ //console.log(segment);
1624
+ const view_select = parse_view_select(segment.view, segment.relation);
1625
+ //console.log({ view_select });
1626
+ const view = View.findOne({ name: view_select.viewname });
1627
+ if (!view)
1628
+ throw new InvalidConfiguration(`Cannot find embedded view: ${view_select.viewname}`);
1629
+ // check if the relation path matches a ChildList relations
1630
+ let childListRelPath = false;
1631
+ if (segment.relation && view.table_id) {
1632
+ const targetTbl = Table.findOne({ id: view.table_id });
1633
+ const relation = new Relation(segment.relation, targetTbl.name, displayType(await view.get_state_fields()));
1634
+ childListRelPath = relation.type === RelationType.CHILD_LIST;
1635
+ }
1636
+ // Edit-in-edit
1637
+ if (view.viewtemplate === "Edit" &&
1638
+ (view_select.type === "ChildList" || childListRelPath)) {
1639
+ if (childListRelPath)
1640
+ updateViewSelect(view_select);
1641
+ const childTable = Table.findOne({ id: view.table_id });
1642
+ const childForm = await getForm(childTable, view.name, view.configuration.columns, view.configuration.layout, row?.id, req, !isWeb(req));
1643
+ traverseSync(childForm.layout, {
1644
+ field(segment) {
1645
+ segment.field_name = `${view_select.field_name}.${segment.field_name}`;
1646
+ },
1647
+ });
1648
+ for (const field of childForm.fields) {
1649
+ if (field.name === childTable.pk_name) {
1650
+ field.class = field.class
1651
+ ? `${field.class} omit-repeater-clone`
1652
+ : "omit-repeater-clone";
1653
+ }
1654
+ }
1655
+ await childForm.fill_fkey_options(false, optionsQuery, req.user);
1656
+ const fr = new FieldRepeat({
1657
+ name: view_select.field_name,
1658
+ label: view_select.field_name,
1659
+ fields: childForm.fields,
1660
+ layout: childForm.layout,
1661
+ metadata: {
1662
+ table_id: childTable.id,
1663
+ view: segment.view,
1664
+ relation: view_select.field_name,
1665
+ relation_path: segment.relation,
1666
+ order_field: segment.order_field,
1667
+ },
1668
+ });
1669
+ if (row?.id) {
1670
+ const childRows = getRowQuery
1671
+ ? await getRowQuery(view.table_id, view_select, row.id, segment.order_field)
1672
+ : await childTable.getRows({
1673
+ [view_select.field_name]: row.id,
1674
+ }, segment.order_field ? { orderBy: segment.order_field } : {});
1675
+ fr.metadata.rows = childRows;
1676
+ if (!fr.fields.map((f) => f.name).includes(childTable.pk_name))
1677
+ fr.fields.push({
1678
+ name: childTable.pk_name,
1679
+ input_type: "hidden",
1680
+ });
1681
+ }
1682
+ form.fields.push(fr);
1683
+ segment.type = "field_repeat";
1684
+ segment.field_repeat = fr;
1685
+ return;
1686
+ } // end edit in edit
1687
+ const outerState = {};
1688
+ Object.entries(originalState || {}).forEach(([k, v]) => {
1689
+ if (k.startsWith("_"))
1690
+ outerState[k] = v;
1691
+ });
1692
+ let state = {};
1693
+ let urlFormula;
1694
+ let needFields = new Set();
1695
+ if (view_select.type === "RelationPath" && view.table_id) {
1696
+ const pathToUrlFormula = (relation) => {
1697
+ const st = pathToState(relation, (k) => `row.` + k);
1698
+ return Object.entries(st)
1699
+ .map(([k, v]) => {
1700
+ needFields.add(v.split(".")[1]);
1701
+ return `${k}='+${v}+'`;
1702
+ })
1703
+ .join("&");
1704
+ };
1705
+ const targetTbl = Table.findOne({ id: view.table_id });
1706
+ if (targetTbl) {
1707
+ const relation = new Relation(segment.relation, targetTbl.name, displayType(await view.get_state_fields()));
1708
+ const relFmlQS = pathToUrlFormula(relation);
1709
+ const type = relation.type;
1710
+ if (!row && type == RelationType.OWN) {
1711
+ segment.type = "blank";
1712
+ urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1713
+ segment.contents = segment.contents = div({
1714
+ class: "d-inline",
1715
+ "data-sc-embed-viewname": view.name,
1716
+ "data-view-source-need-fields": [...needFields].join(","),
1717
+ "data-view-source": encodeURIComponent(urlFormula),
1718
+ });
1719
+ return;
1720
+ }
1721
+ else if (!row &&
1722
+ type !== RelationType.INDEPENDENT &&
1723
+ !relation.isFixedRelation()) {
1724
+ urlFormula = `add_extra_state('/view/${view.name}/?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1725
+ segment.contents = segment.contents = div({
1726
+ class: "d-inline",
1727
+ "data-sc-embed-viewname": view.name,
1728
+ "data-view-source-need-fields": [...needFields].join(","),
1729
+ "data-view-source": encodeURIComponent(urlFormula),
1730
+ });
1731
+ return;
1732
+ }
1733
+ const userId = req?.user?.id;
1734
+ state = pathToState(relation, relation.isFixedRelation() ? () => userId : (k) => row[k]);
1735
+ urlFormula = `add_extra_state('/view/${view.name}?${relFmlQS}', ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1736
+ }
1737
+ }
1738
+ else {
1739
+ const isIndependent = view_select.type === "Independent";
1740
+ // legacy none check ?
1741
+ if (!view)
1742
+ throw new InvalidConfiguration(`Edit view incorrectly configured: cannot find embedded view ${view_select.viewname}`);
1743
+ switch (view_select.type) {
1744
+ case "Own":
1745
+ state = { id: row?.id };
1746
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1747
+ needFields.add("id");
1748
+ break;
1749
+ case "Independent":
1750
+ state = {};
1751
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1752
+ needFields.add("id");
1753
+ break;
1754
+ case "ChildList":
1755
+ case "OneToOneShow":
1756
+ state = { [view_select.field_name]: row?.id };
1757
+ urlFormula = `add_extra_state('/view/${view.name}/?${view_select.field_name}='+row.id, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1758
+ needFields.add("id");
1759
+ break;
1760
+ case "ParentShow":
1761
+ state = { id: row?.[view_select.field_name] };
1762
+ urlFormula = `add_extra_state('/view/${view.name}/?id='+row.${view_select.field_name}, ${JSON.stringify(segment.extra_state_fml)}, row, ${JSON.stringify(outerState)})`;
1763
+ needFields.add(view_select.field_name);
1764
+ break;
1765
+ }
1766
+ if (!row && !isIndependent) {
1767
+ segment.type = "blank";
1768
+ segment.contents = div({
1769
+ class: "d-inline",
1770
+ "data-sc-embed-viewname": view.name,
1771
+ "data-view-source-need-fields": [...needFields].join(","),
1772
+ "data-view-source": encodeURIComponent(urlFormula),
1773
+ });
1774
+ return;
1775
+ }
1776
+ }
1777
+ const extra_state = segment.extra_state_fml
1778
+ ? eval_expression(segment.extra_state_fml, {
1779
+ ...dollarizeObject(req.query),
1780
+ session_id: getSessionId(req),
1781
+ ...(row || pseudo_row),
1782
+ }, req.user, `Extra state formula for embedding view ${view.name}`)
1783
+ : {};
1784
+ const qs = stateToQueryString({ ...state, ...outerState, ...extra_state }, true);
1785
+ segment.contents = div({
1786
+ class: "d-inline",
1787
+ "data-sc-embed-viewname": view.name,
1788
+ "data-sc-view-source": `/view/${view.name}${qs}`,
1789
+ "data-view-source-current": `/view/${view.name}${qs}`,
1790
+ "data-view-source-need-fields": [...needFields].join(","),
1791
+ "data-view-source": encodeURIComponent(urlFormula),
1792
+ }, view.renderLocally()
1793
+ ? await view.run({ ...state, ...outerState, ...extra_state }, { req, res }, view.isRemoteTable())
1794
+ : await renderServerSide(view.name, {
1795
+ ...state,
1796
+ ...outerState,
1797
+ ...extra_state,
1798
+ }));
1799
+ },
1800
+ });
1801
+ translateLayout(form.layout, req.getLocale());
1802
+ if (req.headers?.saltcornmodalrequest)
1803
+ form.xhrSubmit = true;
1804
+ setDateLocales(form, req.getLocale());
1805
+ };
1806
+ const setDateLocales = (form, locale) => {
1807
+ form.fields.forEach((f) => {
1808
+ if (f.type && f.type.name === "Date") {
1809
+ f.attributes.locale = locale;
1810
+ }
1811
+ });
1812
+ };
1813
+ /**
1814
+ * update viewSelect so that it looks like a normal ChildList
1815
+ */
1816
+ const updateViewSelect = (viewSelect) => {
1817
+ if (viewSelect.path.length === 1) {
1818
+ viewSelect.field_name = viewSelect.path[0].inboundKey;
1819
+ viewSelect.table_name = viewSelect.path[0].table;
1820
+ }
1821
+ else if (viewSelect.path.length === 2) {
1822
+ viewSelect.field_name = viewSelect.path[1].inboundKey;
1823
+ viewSelect.table_name = viewSelect.path[1].table;
1824
+ viewSelect.throughTable = viewSelect.path[0].inboundKey;
1825
+ viewSelect.through = viewSelect.path[0].table;
1826
+ }
1827
+ };
1493
1828
  /**
1494
1829
  * @param {object} table
1495
1830
  * @param {object} req
@@ -1558,5 +1893,8 @@ module.exports = {
1558
1893
  edit_build_in_actions,
1559
1894
  standardBlockDispatch,
1560
1895
  standardLayoutRowVisitor,
1896
+ setDateLocales,
1897
+ transformForm,
1898
+ updateViewSelect,
1561
1899
  };
1562
1900
  //# sourceMappingURL=viewable_fields.js.map