@rippling/rippling-sdk 0.2.0-alpha.43 → 0.2.0-alpha.45

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 (77) hide show
  1. package/examples/manifest/dental-practice-management/dental-practice-management.ts +109 -59
  2. package/examples/manifest/dental-practice-management/manifest.json +83 -32
  3. package/examples/manifest/existing-manifest-mutations/existing-manifest-mutations.ts +6 -7
  4. package/examples/manifest/gym-membership-management/gym-membership-management.ts +107 -109
  5. package/examples/manifest/gym-membership-management/manifest.json +64 -39
  6. package/lib/manifest/_helpers.d.mts +4 -5
  7. package/lib/manifest/_helpers.d.mts.map +1 -1
  8. package/lib/manifest/_helpers.d.ts +4 -5
  9. package/lib/manifest/_helpers.d.ts.map +1 -1
  10. package/lib/manifest/_helpers.js.map +1 -1
  11. package/lib/manifest/_helpers.mjs.map +1 -1
  12. package/lib/manifest/app.d.mts +8 -13
  13. package/lib/manifest/app.d.mts.map +1 -1
  14. package/lib/manifest/app.d.ts +8 -13
  15. package/lib/manifest/app.d.ts.map +1 -1
  16. package/lib/manifest/app.js +13 -22
  17. package/lib/manifest/app.js.map +1 -1
  18. package/lib/manifest/app.mjs +13 -22
  19. package/lib/manifest/app.mjs.map +1 -1
  20. package/lib/manifest/custom-object-field-section.d.mts +2 -2
  21. package/lib/manifest/custom-object-field-section.d.ts +2 -2
  22. package/lib/manifest/custom-object-field-section.js +2 -2
  23. package/lib/manifest/custom-object-field-section.mjs +2 -2
  24. package/lib/manifest/custom-object-page-layout.d.mts +78 -37
  25. package/lib/manifest/custom-object-page-layout.d.mts.map +1 -1
  26. package/lib/manifest/custom-object-page-layout.d.ts +78 -37
  27. package/lib/manifest/custom-object-page-layout.d.ts.map +1 -1
  28. package/lib/manifest/custom-object-page-layout.js +263 -66
  29. package/lib/manifest/custom-object-page-layout.js.map +1 -1
  30. package/lib/manifest/custom-object-page-layout.mjs +263 -66
  31. package/lib/manifest/custom-object-page-layout.mjs.map +1 -1
  32. package/lib/manifest/custom-object.d.mts +6 -0
  33. package/lib/manifest/custom-object.d.mts.map +1 -1
  34. package/lib/manifest/custom-object.d.ts +6 -0
  35. package/lib/manifest/custom-object.d.ts.map +1 -1
  36. package/lib/manifest/custom-object.js +6 -0
  37. package/lib/manifest/custom-object.js.map +1 -1
  38. package/lib/manifest/custom-object.mjs +6 -0
  39. package/lib/manifest/custom-object.mjs.map +1 -1
  40. package/lib/manifest/existing-manifest-context.d.mts +0 -1
  41. package/lib/manifest/existing-manifest-context.d.mts.map +1 -1
  42. package/lib/manifest/existing-manifest-context.d.ts +0 -1
  43. package/lib/manifest/existing-manifest-context.d.ts.map +1 -1
  44. package/lib/manifest/existing-manifest-context.js +5 -10
  45. package/lib/manifest/existing-manifest-context.js.map +1 -1
  46. package/lib/manifest/existing-manifest-context.mjs +5 -10
  47. package/lib/manifest/existing-manifest-context.mjs.map +1 -1
  48. package/lib/manifest/field.d.mts +6 -3
  49. package/lib/manifest/field.d.mts.map +1 -1
  50. package/lib/manifest/field.d.ts +6 -3
  51. package/lib/manifest/field.d.ts.map +1 -1
  52. package/lib/manifest/field.js +26 -6
  53. package/lib/manifest/field.js.map +1 -1
  54. package/lib/manifest/field.mjs +26 -6
  55. package/lib/manifest/field.mjs.map +1 -1
  56. package/lib/manifest/sdui-page.d.mts +6 -1
  57. package/lib/manifest/sdui-page.d.mts.map +1 -1
  58. package/lib/manifest/sdui-page.d.ts +6 -1
  59. package/lib/manifest/sdui-page.d.ts.map +1 -1
  60. package/lib/manifest/sdui-page.js +6 -1
  61. package/lib/manifest/sdui-page.js.map +1 -1
  62. package/lib/manifest/sdui-page.mjs +6 -1
  63. package/lib/manifest/sdui-page.mjs.map +1 -1
  64. package/package.json +1 -1
  65. package/src/lib/manifest/_helpers.ts +4 -5
  66. package/src/lib/manifest/app.ts +18 -27
  67. package/src/lib/manifest/custom-object-field-section.ts +2 -2
  68. package/src/lib/manifest/custom-object-page-layout.ts +477 -93
  69. package/src/lib/manifest/custom-object.ts +6 -0
  70. package/src/lib/manifest/existing-manifest-context.ts +5 -12
  71. package/src/lib/manifest/field.ts +45 -9
  72. package/src/lib/manifest/sdui-page.ts +6 -1
  73. package/src/version.ts +1 -1
  74. package/version.d.mts +1 -1
  75. package/version.d.ts +1 -1
  76. package/version.js +1 -1
  77. package/version.mjs +1 -1
@@ -444,7 +444,6 @@ new CustomObjectPageLayout(patientObj, {
444
444
  type: 'tab_with_sections',
445
445
  sections: [
446
446
  {
447
- key: 'id',
448
447
  name: 'Profile',
449
448
  type: 'fields_section',
450
449
  section: patientIdentitySection,
@@ -457,7 +456,6 @@ new CustomObjectPageLayout(patientObj, {
457
456
  ],
458
457
  },
459
458
  {
460
- key: 'clinical',
461
459
  name: 'Clinical & billing',
462
460
  type: 'fields_section',
463
461
  section: patientClinicalSection,
@@ -490,7 +488,6 @@ new CustomObjectPageLayout(operatoryObj, {
490
488
  type: 'tab_with_sections',
491
489
  sections: [
492
490
  {
493
- key: 'room',
494
491
  name: 'Room',
495
492
  type: 'fields_section',
496
493
  section: operatorySection,
@@ -518,14 +515,12 @@ new CustomObjectPageLayout(apptObj, {
518
515
  type: 'tab_with_sections',
519
516
  sections: [
520
517
  {
521
- key: 'chair',
522
518
  name: 'Chair & schedule',
523
519
  type: 'fields_section',
524
520
  section: apptOperatorySection,
525
521
  fields: [apptOperatoryRef, apptStartField, apptDurationMins],
526
522
  },
527
523
  {
528
- key: 'patient',
529
524
  name: 'Patient & status',
530
525
  type: 'fields_section',
531
526
  section: apptPatientSection,
@@ -553,14 +548,12 @@ new CustomObjectPageLayout(planObj, {
553
548
  type: 'tab_with_sections',
554
549
  sections: [
555
550
  {
556
- key: 'link',
557
551
  name: 'Patient',
558
552
  type: 'fields_section',
559
553
  section: planLinkSection,
560
554
  fields: [planPatientRef],
561
555
  },
562
556
  {
563
- key: 'content',
564
557
  name: 'Planned work',
565
558
  type: 'fields_section',
566
559
  section: planBodySection,
@@ -575,64 +568,121 @@ new CustomObjectPageLayout(planObj, {
575
568
  visibilityConditions: {},
576
569
  });
577
570
 
578
- // ── SDUI: chair schedule tab — ObjectListView on appointments (same style as other examples) ─
579
- const chairBoardCode = [
580
- "import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';",
581
- "import SDUI from '@rippling/sdui-builder';",
582
- '',
583
- `const OBJECT = '${apptObj.getApiName()}';`,
584
- '',
585
- 'export async function onRipplingEvent(',
586
- ' event: FunctionEvent,',
587
- ' context: FunctionContext,',
588
- '): Promise<FunctionResponse> {',
589
- ' const action = event.parameters?.action;',
590
- '',
591
- " if (!action || action === 'init') {",
592
- ' const s = SDUI.createState({});',
593
- ' const root = SDUI.components.VStack({',
594
- ' children: [',
595
- ' SDUI.components.ObjectListView({',
596
- ' objectApiName: OBJECT,',
597
- ' canSearchInGrid: true,',
598
- ' }),',
599
- ' ],',
600
- ' });',
601
- ' return new FunctionResponse({',
602
- ' body: { spec: JSON.stringify(SDUI.render(s, root)) },',
603
- ' statusCode: 200,',
604
- ' headers: {},',
605
- " message: '',",
606
- ' });',
607
- ' }',
608
- '',
609
- " return new FunctionResponse({ body: {}, statusCode: 200, headers: {}, message: '' });",
610
- '}',
611
- ].join('\n');
612
-
613
- const chairBoardFn = new ManifestFunction(manifest, {
614
- apiName: 'dental_chair_schedule_fn',
615
- name: 'Daily chair board (SDUI)',
616
- description: 'SDUI ObjectListView for appointments (init + spec render)',
617
- runtime: 'lambda-deno',
618
- code: chairBoardCode,
619
- dependencies: { '@rippling/rippling-sdk': '^0.2.0-alpha.33', '@rippling/sdui-builder': '^0.1.0' },
620
- isAsync: false,
621
- });
622
-
623
- const chairBoardPage = new SduiPage(manifest, {
624
- sduiPageId: 'dental_chair_schedule',
625
- name: 'Chair schedule',
626
- function: chairBoardFn,
627
- description: 'SDUI list of appointments (searchable grid); use object records for status edits',
571
+ // ── SDUI object-list tabs ───────────────────────────────────────────────────
572
+ const sduiObjectListDependencies = {
573
+ '@rippling/rippling-sdk': '^0.2.0-alpha.33',
574
+ '@rippling/sdui-builder': '^0.1.0',
575
+ };
576
+
577
+ function objectListViewCode(objectApiName: string): string {
578
+ return [
579
+ "import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';",
580
+ "import SDUI from '@rippling/sdui-builder';",
581
+ '',
582
+ `const OBJECT = '${objectApiName}';`,
583
+ '',
584
+ 'export async function onRipplingEvent(',
585
+ ' event: FunctionEvent,',
586
+ ' context: FunctionContext,',
587
+ '): Promise<FunctionResponse> {',
588
+ ' const action = event.parameters?.action;',
589
+ '',
590
+ " if (!action || action === 'init') {",
591
+ ' const s = SDUI.createState({});',
592
+ ' const root = SDUI.components.VStack({',
593
+ ' children: [',
594
+ ' SDUI.components.ObjectListView({',
595
+ ' objectApiName: OBJECT,',
596
+ ' canSearchInGrid: true,',
597
+ ' }),',
598
+ ' ],',
599
+ ' });',
600
+ ' return new FunctionResponse({',
601
+ ' body: { spec: JSON.stringify(SDUI.render(s, root)) },',
602
+ ' statusCode: 200,',
603
+ ' headers: {},',
604
+ " message: '',",
605
+ ' });',
606
+ ' }',
607
+ '',
608
+ " return new FunctionResponse({ body: {}, statusCode: 200, headers: {}, message: '' });",
609
+ '}',
610
+ ].join('\n');
611
+ }
612
+
613
+ function createObjectListPage(props: {
614
+ objectApiName: string;
615
+ functionApiName: string;
616
+ functionName: string;
617
+ functionDescription: string;
618
+ pageId: string;
619
+ pageName: string;
620
+ pageDescription: string;
621
+ }): SduiPage {
622
+ const listFn = new ManifestFunction(manifest, {
623
+ apiName: props.functionApiName,
624
+ name: props.functionName,
625
+ description: props.functionDescription,
626
+ runtime: 'lambda-deno',
627
+ code: objectListViewCode(props.objectApiName),
628
+ dependencies: sduiObjectListDependencies,
629
+ isAsync: false,
630
+ });
631
+
632
+ return new SduiPage(manifest, {
633
+ sduiPageId: props.pageId,
634
+ name: props.pageName,
635
+ function: listFn,
636
+ description: props.pageDescription,
637
+ });
638
+ }
639
+
640
+ const patientListPage = createObjectListPage({
641
+ objectApiName: patientObj.getApiName(),
642
+ functionApiName: 'dental_patient_list_fn',
643
+ functionName: 'Patients (SDUI)',
644
+ functionDescription: 'SDUI ObjectListView for patient records',
645
+ pageId: 'dental_patients',
646
+ pageName: 'Patients',
647
+ pageDescription: 'SDUI ObjectListView for patient records',
648
+ });
649
+
650
+ const operatoryListPage = createObjectListPage({
651
+ objectApiName: operatoryObj.getApiName(),
652
+ functionApiName: 'dental_operatory_list_fn',
653
+ functionName: 'Operatories (SDUI)',
654
+ functionDescription: 'SDUI ObjectListView for operatory records',
655
+ pageId: 'dental_operatories',
656
+ pageName: 'Operatories',
657
+ pageDescription: 'SDUI ObjectListView for operatory records',
658
+ });
659
+
660
+ const chairBoardPage = createObjectListPage({
661
+ objectApiName: apptObj.getApiName(),
662
+ functionApiName: 'dental_chair_schedule_fn',
663
+ functionName: 'Daily chair board (SDUI)',
664
+ functionDescription: 'SDUI ObjectListView for appointments (init + spec render)',
665
+ pageId: 'dental_chair_schedule',
666
+ pageName: 'Chair schedule',
667
+ pageDescription: 'SDUI list of appointments (searchable grid); use object records for status edits',
668
+ });
669
+
670
+ const treatmentPlanListPage = createObjectListPage({
671
+ objectApiName: planObj.getApiName(),
672
+ functionApiName: 'dental_treatment_plan_list_fn',
673
+ functionName: 'Treatment plans (SDUI)',
674
+ functionDescription: 'SDUI ObjectListView for treatment plan records',
675
+ pageId: 'dental_treatment_plans',
676
+ pageName: 'Treatment plans',
677
+ pageDescription: 'SDUI ObjectListView for treatment plan records',
628
678
  });
629
679
 
630
680
  new App(manifest, {
631
681
  apiName: 'dental_practice_management_app',
632
682
  name: 'Dental Practice Management',
633
- description: 'Patient charts, operatories, treatment plans, and an SDUI appointment list tab',
683
+ description: 'Patient charts, operatories, treatment plans, and SDUI object-list tabs',
634
684
  appType: 'custom',
635
- pages: [patientObj, operatoryObj, apptObj, planObj, chairBoardPage],
685
+ pages: [patientListPage, operatoryListPage, chairBoardPage, treatmentPlanListPage],
636
686
  });
637
687
 
638
688
  console.log(manifest.preview());
@@ -1588,6 +1588,7 @@
1588
1588
  "name": "Patient chart",
1589
1589
  "system_created": false,
1590
1590
  "tab_edits": {
1591
+ "tabsOrder": ["chart"],
1591
1592
  "newTabs": [
1592
1593
  {
1593
1594
  "key": "chart",
@@ -1595,7 +1596,6 @@
1595
1596
  "type": "tab_with_sections",
1596
1597
  "sections": [
1597
1598
  {
1598
- "key": "id",
1599
1599
  "name": "Profile",
1600
1600
  "type": "fields_section",
1601
1601
  "fields": [
@@ -1617,7 +1617,6 @@
1617
1617
  ]
1618
1618
  },
1619
1619
  {
1620
- "key": "clinical",
1621
1620
  "name": "Clinical & billing",
1622
1621
  "type": "fields_section",
1623
1622
  "fields": [
@@ -1638,8 +1637,7 @@
1638
1637
  ]
1639
1638
  }
1640
1639
  ],
1641
- "systemTabEdits": {},
1642
- "tabsOrder": ["chart"]
1640
+ "systemTabEdits": {}
1643
1641
  },
1644
1642
  "header_edits": {
1645
1643
  "newTitleField": "legal_name__c"
@@ -1655,6 +1653,7 @@
1655
1653
  "name": "Operatory",
1656
1654
  "system_created": false,
1657
1655
  "tab_edits": {
1656
+ "tabsOrder": ["overview"],
1658
1657
  "newTabs": [
1659
1658
  {
1660
1659
  "key": "overview",
@@ -1662,7 +1661,6 @@
1662
1661
  "type": "tab_with_sections",
1663
1662
  "sections": [
1664
1663
  {
1665
- "key": "room",
1666
1664
  "name": "Room",
1667
1665
  "type": "fields_section",
1668
1666
  "fields": [
@@ -1680,8 +1678,7 @@
1680
1678
  ]
1681
1679
  }
1682
1680
  ],
1683
- "systemTabEdits": {},
1684
- "tabsOrder": ["overview"]
1681
+ "systemTabEdits": {}
1685
1682
  },
1686
1683
  "header_edits": {
1687
1684
  "newTitleField": "operatory_name__c"
@@ -1697,6 +1694,7 @@
1697
1694
  "name": "Appointment",
1698
1695
  "system_created": false,
1699
1696
  "tab_edits": {
1697
+ "tabsOrder": ["visit"],
1700
1698
  "newTabs": [
1701
1699
  {
1702
1700
  "key": "visit",
@@ -1704,7 +1702,6 @@
1704
1702
  "type": "tab_with_sections",
1705
1703
  "sections": [
1706
1704
  {
1707
- "key": "chair",
1708
1705
  "name": "Chair & schedule",
1709
1706
  "type": "fields_section",
1710
1707
  "fields": [
@@ -1720,7 +1717,6 @@
1720
1717
  ]
1721
1718
  },
1722
1719
  {
1723
- "key": "patient",
1724
1720
  "name": "Patient & status",
1725
1721
  "type": "fields_section",
1726
1722
  "fields": [
@@ -1744,8 +1740,7 @@
1744
1740
  ]
1745
1741
  }
1746
1742
  ],
1747
- "systemTabEdits": {},
1748
- "tabsOrder": ["visit"]
1743
+ "systemTabEdits": {}
1749
1744
  },
1750
1745
  "header_edits": {
1751
1746
  "newTitleField": "board_label__c"
@@ -1761,6 +1756,7 @@
1761
1756
  "name": "Treatment plan",
1762
1757
  "system_created": false,
1763
1758
  "tab_edits": {
1759
+ "tabsOrder": ["plan"],
1764
1760
  "newTabs": [
1765
1761
  {
1766
1762
  "key": "plan",
@@ -1768,7 +1764,6 @@
1768
1764
  "type": "tab_with_sections",
1769
1765
  "sections": [
1770
1766
  {
1771
- "key": "link",
1772
1767
  "name": "Patient",
1773
1768
  "type": "fields_section",
1774
1769
  "fields": [
@@ -1778,7 +1773,6 @@
1778
1773
  ]
1779
1774
  },
1780
1775
  {
1781
- "key": "content",
1782
1776
  "name": "Planned work",
1783
1777
  "type": "fields_section",
1784
1778
  "fields": [
@@ -1802,8 +1796,7 @@
1802
1796
  ]
1803
1797
  }
1804
1798
  ],
1805
- "systemTabEdits": {},
1806
- "tabsOrder": ["plan"]
1799
+ "systemTabEdits": {}
1807
1800
  },
1808
1801
  "header_edits": {
1809
1802
  "newTitleField": "plan_name__c"
@@ -1811,6 +1804,48 @@
1811
1804
  "visibility_conditions": {},
1812
1805
  "blueprint_key": "dental_treatment_plan__c"
1813
1806
  },
1807
+ {
1808
+ "type": "FUNCTION",
1809
+ "name": "Patients (SDUI)",
1810
+ "api_name": "dental_patient_list_fn",
1811
+ "description": "SDUI ObjectListView for patient records",
1812
+ "code_draft": "import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';\nimport SDUI from '@rippling/sdui-builder';\n\nconst OBJECT = 'dental_patient__c';\n\nexport async function onRipplingEvent(\n event: FunctionEvent,\n context: FunctionContext,\n): Promise<FunctionResponse> {\n const action = event.parameters?.action;\n\n if (!action || action === 'init') {\n const s = SDUI.createState({});\n const root = SDUI.components.VStack({\n children: [\n SDUI.components.ObjectListView({\n objectApiName: OBJECT,\n canSearchInGrid: true,\n }),\n ],\n });\n return new FunctionResponse({\n body: { spec: JSON.stringify(SDUI.render(s, root)) },\n statusCode: 200,\n headers: {},\n message: '',\n });\n }\n\n return new FunctionResponse({ body: {}, statusCode: 200, headers: {}, message: '' });\n}",
1813
+ "dependencies": {
1814
+ "@rippling/rippling-sdk": "^0.2.0-alpha.33",
1815
+ "@rippling/sdui-builder": "^0.1.0"
1816
+ },
1817
+ "deployment_options": {
1818
+ "runtime": "lambda-deno"
1819
+ }
1820
+ },
1821
+ {
1822
+ "type": "SDUI_PAGE",
1823
+ "name": "Patients",
1824
+ "sdui_page_id": "dental_patients",
1825
+ "function_api_name": "dental_patient_list_fn",
1826
+ "description": "SDUI ObjectListView for patient records"
1827
+ },
1828
+ {
1829
+ "type": "FUNCTION",
1830
+ "name": "Operatories (SDUI)",
1831
+ "api_name": "dental_operatory_list_fn",
1832
+ "description": "SDUI ObjectListView for operatory records",
1833
+ "code_draft": "import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';\nimport SDUI from '@rippling/sdui-builder';\n\nconst OBJECT = 'dental_operatory__c';\n\nexport async function onRipplingEvent(\n event: FunctionEvent,\n context: FunctionContext,\n): Promise<FunctionResponse> {\n const action = event.parameters?.action;\n\n if (!action || action === 'init') {\n const s = SDUI.createState({});\n const root = SDUI.components.VStack({\n children: [\n SDUI.components.ObjectListView({\n objectApiName: OBJECT,\n canSearchInGrid: true,\n }),\n ],\n });\n return new FunctionResponse({\n body: { spec: JSON.stringify(SDUI.render(s, root)) },\n statusCode: 200,\n headers: {},\n message: '',\n });\n }\n\n return new FunctionResponse({ body: {}, statusCode: 200, headers: {}, message: '' });\n}",
1834
+ "dependencies": {
1835
+ "@rippling/rippling-sdk": "^0.2.0-alpha.33",
1836
+ "@rippling/sdui-builder": "^0.1.0"
1837
+ },
1838
+ "deployment_options": {
1839
+ "runtime": "lambda-deno"
1840
+ }
1841
+ },
1842
+ {
1843
+ "type": "SDUI_PAGE",
1844
+ "name": "Operatories",
1845
+ "sdui_page_id": "dental_operatories",
1846
+ "function_api_name": "dental_operatory_list_fn",
1847
+ "description": "SDUI ObjectListView for operatory records"
1848
+ },
1814
1849
  {
1815
1850
  "type": "FUNCTION",
1816
1851
  "name": "Daily chair board (SDUI)",
@@ -1832,37 +1867,53 @@
1832
1867
  "function_api_name": "dental_chair_schedule_fn",
1833
1868
  "description": "SDUI list of appointments (searchable grid); use object records for status edits"
1834
1869
  },
1870
+ {
1871
+ "type": "FUNCTION",
1872
+ "name": "Treatment plans (SDUI)",
1873
+ "api_name": "dental_treatment_plan_list_fn",
1874
+ "description": "SDUI ObjectListView for treatment plan records",
1875
+ "code_draft": "import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';\nimport SDUI from '@rippling/sdui-builder';\n\nconst OBJECT = 'dental_treatment_plan__c';\n\nexport async function onRipplingEvent(\n event: FunctionEvent,\n context: FunctionContext,\n): Promise<FunctionResponse> {\n const action = event.parameters?.action;\n\n if (!action || action === 'init') {\n const s = SDUI.createState({});\n const root = SDUI.components.VStack({\n children: [\n SDUI.components.ObjectListView({\n objectApiName: OBJECT,\n canSearchInGrid: true,\n }),\n ],\n });\n return new FunctionResponse({\n body: { spec: JSON.stringify(SDUI.render(s, root)) },\n statusCode: 200,\n headers: {},\n message: '',\n });\n }\n\n return new FunctionResponse({ body: {}, statusCode: 200, headers: {}, message: '' });\n}",
1876
+ "dependencies": {
1877
+ "@rippling/rippling-sdk": "^0.2.0-alpha.33",
1878
+ "@rippling/sdui-builder": "^0.1.0"
1879
+ },
1880
+ "deployment_options": {
1881
+ "runtime": "lambda-deno"
1882
+ }
1883
+ },
1884
+ {
1885
+ "type": "SDUI_PAGE",
1886
+ "name": "Treatment plans",
1887
+ "sdui_page_id": "dental_treatment_plans",
1888
+ "function_api_name": "dental_treatment_plan_list_fn",
1889
+ "description": "SDUI ObjectListView for treatment plan records"
1890
+ },
1835
1891
  {
1836
1892
  "type": "CUSTOM_APP",
1837
1893
  "api_name": "dental_practice_management_app",
1838
1894
  "name": "Dental Practice Management",
1839
- "description": "Patient charts, operatories, treatment plans, and an SDUI appointment list tab",
1895
+ "description": "Patient charts, operatories, treatment plans, and SDUI object-list tabs",
1840
1896
  "app_type": "custom",
1841
1897
  "pages": [
1842
1898
  {
1843
- "api_name": "dental_patient__c",
1844
- "page_type": "object_page",
1845
- "object_rql_name": "dental_patient__c"
1846
- },
1847
- {
1848
- "api_name": "dental_operatory__c",
1849
- "page_type": "object_page",
1850
- "object_rql_name": "dental_operatory__c"
1851
- },
1852
- {
1853
- "api_name": "dental_appointment__c",
1854
- "page_type": "object_page",
1855
- "object_rql_name": "dental_appointment__c"
1899
+ "api_name": "dental_patients",
1900
+ "page_type": "sdui_page",
1901
+ "sdui_page_id": "dental_patients"
1856
1902
  },
1857
1903
  {
1858
- "api_name": "dental_treatment_plan__c",
1859
- "page_type": "object_page",
1860
- "object_rql_name": "dental_treatment_plan__c"
1904
+ "api_name": "dental_operatories",
1905
+ "page_type": "sdui_page",
1906
+ "sdui_page_id": "dental_operatories"
1861
1907
  },
1862
1908
  {
1863
1909
  "api_name": "dental_chair_schedule",
1864
1910
  "page_type": "sdui_page",
1865
1911
  "sdui_page_id": "dental_chair_schedule"
1912
+ },
1913
+ {
1914
+ "api_name": "dental_treatment_plans",
1915
+ "page_type": "sdui_page",
1916
+ "sdui_page_id": "dental_treatment_plans"
1866
1917
  }
1867
1918
  ]
1868
1919
  }
@@ -128,7 +128,6 @@ const existingManifestJson: ExistingManifest = {
128
128
  type: 'tab_with_sections',
129
129
  sections: [
130
130
  {
131
- key: 'profile',
132
131
  name: 'Profile',
133
132
  type: 'fields_section',
134
133
  fields: [
@@ -138,7 +137,6 @@ const existingManifestJson: ExistingManifest = {
138
137
  ],
139
138
  },
140
139
  {
141
- key: 'membership',
142
140
  name: 'Membership',
143
141
  type: 'fields_section',
144
142
  fields: [{ fieldRqlName: 'membership_status__c' }, { fieldRqlName: 'join_date__c' }],
@@ -164,6 +162,9 @@ const memberObj = CustomObject.loadFromExisting('gym_member__c');
164
162
  const profileSection = CustomObjectFieldSection.loadFromExisting('sec_gm_profile', {
165
163
  customObjectApiName: memberObj.getApiName(),
166
164
  });
165
+ const membershipSection = CustomObjectFieldSection.loadFromExisting('sec_gm_membership', {
166
+ customObjectApiName: memberObj.getApiName(),
167
+ });
167
168
  const memberLayout = CustomObjectPageLayout.loadFromExisting('layout_gym_member', {
168
169
  customObjectApiName: memberObj.getApiName(),
169
170
  });
@@ -181,13 +182,12 @@ const preferredName = new TextField(memberObj, {
181
182
  memberLayout
182
183
  .removeField('phone__c', {
183
184
  tabKey: 'member',
184
- sectionKey: 'profile',
185
+ section: profileSection,
185
186
  removeAll: false,
186
187
  })
187
188
  .addField(preferredName, {
188
189
  tabKey: 'member',
189
- sectionKey: 'profile',
190
- fieldSection: profileSection,
190
+ section: profileSection,
191
191
  position: 2,
192
192
  });
193
193
 
@@ -211,13 +211,12 @@ const referralSource = new TextField(memberObj, {
211
211
  // Remove one existing section from the layout, then add a different one.
212
212
  // The removed section component and its fields remain in the manifest.
213
213
  memberLayout
214
- .removeSection('membership', {
214
+ .removeSection(membershipSection, {
215
215
  tabKey: 'member',
216
216
  removeAll: false,
217
217
  })
218
218
  .addSection(
219
219
  {
220
- key: 'marketing',
221
220
  name: 'Marketing',
222
221
  type: 'fields_section',
223
222
  section: marketingSection,