@rippling/rippling-sdk 0.2.0-alpha.84 → 0.2.0-alpha.86

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 (195) hide show
  1. package/examples/manifest/custom-object-creation-workflow/custom-object-creation-workflow.ts +44 -26
  2. package/examples/manifest/dental-practice-management/dental-practice-management.ts +470 -142
  3. package/examples/manifest/dental-practice-management/functions/chair-schedule.ts +23 -13
  4. package/examples/manifest/dental-practice-management/functions/complete-visit.ts +55 -32
  5. package/examples/manifest/dental-practice-management/functions/operatory-list.ts +23 -13
  6. package/examples/manifest/dental-practice-management/functions/patient-list.ts +23 -13
  7. package/examples/manifest/dental-practice-management/functions/treatment-plan-list.ts +23 -13
  8. package/examples/manifest/existing-manifest-mutations/existing-manifest-mutations.ts +23 -68
  9. package/examples/manifest/field-service-dispatch/field-service-dispatch.ts +375 -102
  10. package/examples/manifest/grant-program-management/grant-program-management.ts +419 -125
  11. package/examples/manifest/gym-membership-management/functions/check-in-desk.ts +23 -13
  12. package/examples/manifest/gym-membership-management/functions/member-list.ts +23 -13
  13. package/examples/manifest/gym-membership-management/functions/today-schedule.ts +23 -13
  14. package/examples/manifest/gym-membership-management/functions/trainer-list.ts +23 -13
  15. package/examples/manifest/gym-membership-management/gym-membership-management.ts +442 -92
  16. package/examples/manifest/procurement-approval-hub/procurement-approval-hub.ts +408 -122
  17. package/examples/manifest/simple-todo-app/functions/mark-done.ts +12 -16
  18. package/examples/manifest/simple-todo-app/functions/todo-list.ts +23 -13
  19. package/examples/manifest/simple-todo-app/simple-todo-app.ts +109 -40
  20. package/examples/manifest/todo-app-without-object-list-view/functions/todo-page.ts +193 -166
  21. package/examples/manifest/todo-app-without-object-list-view/todo-app-without-object-list-view.ts +47 -24
  22. package/package.json +13 -7
  23. package/resources/custom-objects/fields.d.mts +1 -40
  24. package/resources/custom-objects/fields.d.mts.map +1 -1
  25. package/resources/custom-objects/fields.d.ts +1 -40
  26. package/resources/custom-objects/fields.d.ts.map +1 -1
  27. package/resources/levels.d.mts +25 -4
  28. package/resources/levels.d.mts.map +1 -1
  29. package/resources/levels.d.ts +25 -4
  30. package/resources/levels.d.ts.map +1 -1
  31. package/src/resources/custom-objects/fields.ts +1 -46
  32. package/src/resources/levels.ts +28 -4
  33. package/src/tsconfig.json +1 -1
  34. package/src/version.ts +1 -1
  35. package/version.d.mts +1 -1
  36. package/version.d.ts +1 -1
  37. package/version.js +1 -1
  38. package/version.mjs +1 -1
  39. package/core/platform/manifest/custom-objects/action.d.mts +0 -58
  40. package/core/platform/manifest/custom-objects/action.d.mts.map +0 -1
  41. package/core/platform/manifest/custom-objects/action.d.ts +0 -58
  42. package/core/platform/manifest/custom-objects/action.d.ts.map +0 -1
  43. package/core/platform/manifest/custom-objects/action.js +0 -44
  44. package/core/platform/manifest/custom-objects/action.js.map +0 -1
  45. package/core/platform/manifest/custom-objects/action.mjs +0 -40
  46. package/core/platform/manifest/custom-objects/action.mjs.map +0 -1
  47. package/core/platform/manifest/custom-objects/conditions.d.mts +0 -240
  48. package/core/platform/manifest/custom-objects/conditions.d.mts.map +0 -1
  49. package/core/platform/manifest/custom-objects/conditions.d.ts +0 -240
  50. package/core/platform/manifest/custom-objects/conditions.d.ts.map +0 -1
  51. package/core/platform/manifest/custom-objects/conditions.js +0 -326
  52. package/core/platform/manifest/custom-objects/conditions.js.map +0 -1
  53. package/core/platform/manifest/custom-objects/conditions.mjs +0 -321
  54. package/core/platform/manifest/custom-objects/conditions.mjs.map +0 -1
  55. package/core/platform/manifest/custom-objects/existing.d.mts +0 -87
  56. package/core/platform/manifest/custom-objects/existing.d.mts.map +0 -1
  57. package/core/platform/manifest/custom-objects/existing.d.ts +0 -87
  58. package/core/platform/manifest/custom-objects/existing.d.ts.map +0 -1
  59. package/core/platform/manifest/custom-objects/existing.js +0 -113
  60. package/core/platform/manifest/custom-objects/existing.js.map +0 -1
  61. package/core/platform/manifest/custom-objects/existing.mjs +0 -109
  62. package/core/platform/manifest/custom-objects/existing.mjs.map +0 -1
  63. package/core/platform/manifest/custom-objects/field-resolution.d.mts +0 -48
  64. package/core/platform/manifest/custom-objects/field-resolution.d.mts.map +0 -1
  65. package/core/platform/manifest/custom-objects/field-resolution.d.ts +0 -48
  66. package/core/platform/manifest/custom-objects/field-resolution.d.ts.map +0 -1
  67. package/core/platform/manifest/custom-objects/field-resolution.js +0 -61
  68. package/core/platform/manifest/custom-objects/field-resolution.js.map +0 -1
  69. package/core/platform/manifest/custom-objects/field-resolution.mjs +0 -58
  70. package/core/platform/manifest/custom-objects/field-resolution.mjs.map +0 -1
  71. package/core/platform/manifest/custom-objects/function-file.d.mts +0 -87
  72. package/core/platform/manifest/custom-objects/function-file.d.mts.map +0 -1
  73. package/core/platform/manifest/custom-objects/function-file.d.ts +0 -87
  74. package/core/platform/manifest/custom-objects/function-file.d.ts.map +0 -1
  75. package/core/platform/manifest/custom-objects/function-file.js +0 -76
  76. package/core/platform/manifest/custom-objects/function-file.js.map +0 -1
  77. package/core/platform/manifest/custom-objects/function-file.mjs +0 -69
  78. package/core/platform/manifest/custom-objects/function-file.mjs.map +0 -1
  79. package/core/platform/manifest/custom-objects/list-view.d.mts +0 -65
  80. package/core/platform/manifest/custom-objects/list-view.d.mts.map +0 -1
  81. package/core/platform/manifest/custom-objects/list-view.d.ts +0 -65
  82. package/core/platform/manifest/custom-objects/list-view.d.ts.map +0 -1
  83. package/core/platform/manifest/custom-objects/list-view.js +0 -33
  84. package/core/platform/manifest/custom-objects/list-view.js.map +0 -1
  85. package/core/platform/manifest/custom-objects/list-view.mjs +0 -30
  86. package/core/platform/manifest/custom-objects/list-view.mjs.map +0 -1
  87. package/core/platform/manifest/custom-objects/object-list-page.d.mts +0 -43
  88. package/core/platform/manifest/custom-objects/object-list-page.d.mts.map +0 -1
  89. package/core/platform/manifest/custom-objects/object-list-page.d.ts +0 -43
  90. package/core/platform/manifest/custom-objects/object-list-page.d.ts.map +0 -1
  91. package/core/platform/manifest/custom-objects/object-list-page.js +0 -54
  92. package/core/platform/manifest/custom-objects/object-list-page.js.map +0 -1
  93. package/core/platform/manifest/custom-objects/object-list-page.mjs +0 -50
  94. package/core/platform/manifest/custom-objects/object-list-page.mjs.map +0 -1
  95. package/core/platform/manifest/custom-objects/page-layout.d.mts +0 -142
  96. package/core/platform/manifest/custom-objects/page-layout.d.mts.map +0 -1
  97. package/core/platform/manifest/custom-objects/page-layout.d.ts +0 -142
  98. package/core/platform/manifest/custom-objects/page-layout.d.ts.map +0 -1
  99. package/core/platform/manifest/custom-objects/page-layout.js +0 -184
  100. package/core/platform/manifest/custom-objects/page-layout.js.map +0 -1
  101. package/core/platform/manifest/custom-objects/page-layout.mjs +0 -180
  102. package/core/platform/manifest/custom-objects/page-layout.mjs.map +0 -1
  103. package/core/platform/manifest/custom-objects/register.d.mts +0 -87
  104. package/core/platform/manifest/custom-objects/register.d.mts.map +0 -1
  105. package/core/platform/manifest/custom-objects/register.d.ts +0 -87
  106. package/core/platform/manifest/custom-objects/register.d.ts.map +0 -1
  107. package/core/platform/manifest/custom-objects/register.js +0 -395
  108. package/core/platform/manifest/custom-objects/register.js.map +0 -1
  109. package/core/platform/manifest/custom-objects/register.mjs +0 -391
  110. package/core/platform/manifest/custom-objects/register.mjs.map +0 -1
  111. package/core/platform/manifest/custom-objects/rule.d.mts +0 -113
  112. package/core/platform/manifest/custom-objects/rule.d.mts.map +0 -1
  113. package/core/platform/manifest/custom-objects/rule.d.ts +0 -113
  114. package/core/platform/manifest/custom-objects/rule.d.ts.map +0 -1
  115. package/core/platform/manifest/custom-objects/rule.js +0 -49
  116. package/core/platform/manifest/custom-objects/rule.js.map +0 -1
  117. package/core/platform/manifest/custom-objects/rule.mjs +0 -45
  118. package/core/platform/manifest/custom-objects/rule.mjs.map +0 -1
  119. package/core/platform/manifest/custom-objects/sdui-page.d.mts +0 -214
  120. package/core/platform/manifest/custom-objects/sdui-page.d.mts.map +0 -1
  121. package/core/platform/manifest/custom-objects/sdui-page.d.ts +0 -214
  122. package/core/platform/manifest/custom-objects/sdui-page.d.ts.map +0 -1
  123. package/core/platform/manifest/custom-objects/sdui-page.js +0 -194
  124. package/core/platform/manifest/custom-objects/sdui-page.js.map +0 -1
  125. package/core/platform/manifest/custom-objects/sdui-page.mjs +0 -182
  126. package/core/platform/manifest/custom-objects/sdui-page.mjs.map +0 -1
  127. package/core/platform/manifest/custom-objects/typed-condition.d.mts +0 -28
  128. package/core/platform/manifest/custom-objects/typed-condition.d.mts.map +0 -1
  129. package/core/platform/manifest/custom-objects/typed-condition.d.ts +0 -28
  130. package/core/platform/manifest/custom-objects/typed-condition.d.ts.map +0 -1
  131. package/core/platform/manifest/custom-objects/typed-condition.js +0 -434
  132. package/core/platform/manifest/custom-objects/typed-condition.js.map +0 -1
  133. package/core/platform/manifest/custom-objects/typed-condition.mjs +0 -431
  134. package/core/platform/manifest/custom-objects/typed-condition.mjs.map +0 -1
  135. package/core/platform/manifest/custom-objects/types.d.mts +0 -29
  136. package/core/platform/manifest/custom-objects/types.d.mts.map +0 -1
  137. package/core/platform/manifest/custom-objects/types.d.ts +0 -29
  138. package/core/platform/manifest/custom-objects/types.d.ts.map +0 -1
  139. package/core/platform/manifest/custom-objects/types.js +0 -3
  140. package/core/platform/manifest/custom-objects/types.js.map +0 -1
  141. package/core/platform/manifest/custom-objects/types.mjs +0 -2
  142. package/core/platform/manifest/custom-objects/types.mjs.map +0 -1
  143. package/core/platform/manifest/custom-objects/validation.d.mts +0 -44
  144. package/core/platform/manifest/custom-objects/validation.d.mts.map +0 -1
  145. package/core/platform/manifest/custom-objects/validation.d.ts +0 -44
  146. package/core/platform/manifest/custom-objects/validation.d.ts.map +0 -1
  147. package/core/platform/manifest/custom-objects/validation.js +0 -30
  148. package/core/platform/manifest/custom-objects/validation.js.map +0 -1
  149. package/core/platform/manifest/custom-objects/validation.mjs +0 -27
  150. package/core/platform/manifest/custom-objects/validation.mjs.map +0 -1
  151. package/core/platform/manifest/custom-objects/workflow.d.mts +0 -47
  152. package/core/platform/manifest/custom-objects/workflow.d.mts.map +0 -1
  153. package/core/platform/manifest/custom-objects/workflow.d.ts +0 -47
  154. package/core/platform/manifest/custom-objects/workflow.d.ts.map +0 -1
  155. package/core/platform/manifest/custom-objects/workflow.js +0 -38
  156. package/core/platform/manifest/custom-objects/workflow.js.map +0 -1
  157. package/core/platform/manifest/custom-objects/workflow.mjs +0 -34
  158. package/core/platform/manifest/custom-objects/workflow.mjs.map +0 -1
  159. package/core/platform/manifest/custom-objects.d.mts +0 -85
  160. package/core/platform/manifest/custom-objects.d.mts.map +0 -1
  161. package/core/platform/manifest/custom-objects.d.ts +0 -85
  162. package/core/platform/manifest/custom-objects.d.ts.map +0 -1
  163. package/core/platform/manifest/custom-objects.js +0 -84
  164. package/core/platform/manifest/custom-objects.js.map +0 -1
  165. package/core/platform/manifest/custom-objects.mjs +0 -55
  166. package/core/platform/manifest/custom-objects.mjs.map +0 -1
  167. package/examples/manifest/custom-object-creation-workflow/functions/intake-request-created.ts +0 -20
  168. package/examples/manifest/custom-object-creation-workflow/schema.ts +0 -29
  169. package/examples/manifest/dental-practice-management/schema.ts +0 -298
  170. package/examples/manifest/field-service-dispatch/schema.ts +0 -248
  171. package/examples/manifest/grant-program-management/schema.ts +0 -269
  172. package/examples/manifest/gym-membership-management/schema.ts +0 -266
  173. package/examples/manifest/procurement-approval-hub/functions/route-purchase-request.ts +0 -20
  174. package/examples/manifest/procurement-approval-hub/schema.ts +0 -256
  175. package/examples/manifest/simple-todo-app/schema.ts +0 -60
  176. package/examples/manifest/todo-app-without-object-list-view/schema.ts +0 -28
  177. package/src/core/platform/README.md +0 -20
  178. package/src/core/platform/manifest/README.md +0 -26
  179. package/src/core/platform/manifest/custom-objects/action.ts +0 -87
  180. package/src/core/platform/manifest/custom-objects/conditions.ts +0 -762
  181. package/src/core/platform/manifest/custom-objects/existing.ts +0 -221
  182. package/src/core/platform/manifest/custom-objects/field-resolution.ts +0 -116
  183. package/src/core/platform/manifest/custom-objects/function-file.ts +0 -149
  184. package/src/core/platform/manifest/custom-objects/list-view.ts +0 -95
  185. package/src/core/platform/manifest/custom-objects/object-list-page.ts +0 -87
  186. package/src/core/platform/manifest/custom-objects/page-layout.ts +0 -380
  187. package/src/core/platform/manifest/custom-objects/register.ts +0 -555
  188. package/src/core/platform/manifest/custom-objects/rule.ts +0 -192
  189. package/src/core/platform/manifest/custom-objects/sdui-page.ts +0 -515
  190. package/src/core/platform/manifest/custom-objects/typed-condition.ts +0 -617
  191. package/src/core/platform/manifest/custom-objects/types.ts +0 -92
  192. package/src/core/platform/manifest/custom-objects/validation.ts +0 -70
  193. package/src/core/platform/manifest/custom-objects/workflow.ts +0 -71
  194. package/src/core/platform/manifest/custom-objects.ts +0 -203
  195. package/src/pebble-sdui-web-custom-apps-shim.d.ts +0 -3
@@ -1,20 +0,0 @@
1
- import { FunctionContext, FunctionEvent, FunctionResponse } from '@rippling/rippling-sdk';
2
-
3
- export type Input = FunctionEvent;
4
-
5
- export type Output = {
6
- ok: true;
7
- runId: string;
8
- };
9
-
10
- export async function onRipplingEvent(
11
- _event: Input,
12
- context: FunctionContext,
13
- ): Promise<FunctionResponse<Output>> {
14
- return new FunctionResponse({
15
- body: {
16
- ok: true,
17
- runId: context.function.run_id,
18
- },
19
- });
20
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * Typed custom-object schema for the minimal workflow example.
3
- */
4
-
5
- import { defineCustomObject, radio, section } from '@rippling/rippling-sdk/core/platform/custom-objects';
6
-
7
- /** Logical category shared by the intake workflow example. */
8
- export const INTAKE_CATEGORY = 'intake';
9
-
10
- /** Typed intake request schema used by the workflow example. */
11
- export const intakeRequestDefinition = defineCustomObject({
12
- name: 'intake_request',
13
- displayName: 'Intake request',
14
- pluralLabel: 'Intake requests',
15
- category: INTAKE_CATEGORY,
16
- description: 'Request submitted for workflow processing.',
17
- sections: {
18
- details: section('Details', { sectionId: 'sec_intake_request_details' }),
19
- },
20
- fields: {
21
- status: radio({
22
- displayName: 'Status',
23
- description: 'Request status',
24
- options: ['New', 'In review', 'Complete'],
25
- required: true,
26
- section: 'details',
27
- }),
28
- },
29
- });
@@ -1,298 +0,0 @@
1
- /**
2
- * Typed custom-object schema definitions for the dental practice management example.
3
- *
4
- * This file demonstrates the TypeScript-first schema layer under
5
- * `core/platform/custom-objects`. The exported definitions are plain structural
6
- * values that can be shared across manifests, validators, tests, and other
7
- * tooling without depending on side-effectful constructor calls.
8
- */
9
-
10
- import {
11
- boolean,
12
- date,
13
- datetime,
14
- defineCustomObject,
15
- email,
16
- formula,
17
- longText,
18
- lookup,
19
- number,
20
- parentChild,
21
- phone,
22
- radio,
23
- section,
24
- text,
25
- typedRql,
26
- } from '@rippling/rippling-sdk/core/platform/custom-objects';
27
-
28
- /** Logical category name shared by all custom objects in this example. */
29
- export const DENTAL_CATEGORY_NAME = 'dental';
30
-
31
- /** Patient chart schema: demographics, allergies, billing context, and chart notes. */
32
- export const patientDefinition = defineCustomObject({
33
- name: 'dental_patient',
34
- displayName: 'Patient',
35
- pluralLabel: 'Patients',
36
- category: DENTAL_CATEGORY_NAME,
37
- description: 'Clinical chart, demographics, and care preferences',
38
- icon: { emoji: '🦷' },
39
- sections: {
40
- identity: section('Demographics', { sectionId: 'sec_pt_identity' }),
41
- clinical: section('Clinical', { sectionId: 'sec_pt_clinical' }),
42
- },
43
- fields: {
44
- legal_name: text({
45
- displayName: 'Full legal name',
46
- description: 'Full legal name field',
47
- required: true,
48
- maxLength: 160,
49
- section: 'identity',
50
- }),
51
- date_of_birth: date({
52
- displayName: 'Date of birth',
53
- description: 'Date of birth field',
54
- section: 'identity',
55
- }),
56
- phone: phone({
57
- displayName: 'Phone',
58
- description: 'Phone field',
59
- section: 'identity',
60
- }),
61
- email: email({
62
- displayName: 'Email',
63
- description: 'Email field',
64
- unique: true,
65
- section: 'identity',
66
- }),
67
- active_patient: boolean({
68
- displayName: 'Active patient',
69
- description: 'Whether the patient is currently active in the practice',
70
- required: true,
71
- section: 'identity',
72
- }),
73
- allergies_and_alerts: longText({
74
- displayName: 'Allergies & medical alerts',
75
- description: 'Drug allergies, bisphosphonates, anticoagulants, latex, etc.',
76
- maxLength: 2000,
77
- section: 'clinical',
78
- }),
79
- insurance_plan: text({
80
- displayName: 'Insurance / payer',
81
- description: 'Insurance / payer field',
82
- maxLength: 120,
83
- section: 'clinical',
84
- }),
85
- chart_summary: longText({
86
- displayName: 'Chart summary & preferences',
87
- description: 'Narrative, anxiety notes, perio class, last prophy, family history',
88
- maxLength: 4000,
89
- section: 'clinical',
90
- }),
91
- patient_label: formula.text({
92
- displayName: 'Chart label',
93
- description: 'Quick list label (name and birth year)',
94
- formula: "CONCATENATE(legal_name__c, ' (b. ', YEAR(date_of_birth__c), ')')",
95
- maxLength: 220,
96
- section: 'identity',
97
- }),
98
- },
99
- });
100
-
101
- /** Provider schema used for appointment assignment and scheduling filters. */
102
- export const providerDefinition = defineCustomObject({
103
- name: 'dental_provider',
104
- displayName: 'Provider',
105
- pluralLabel: 'Providers',
106
- category: DENTAL_CATEGORY_NAME,
107
- description: 'Clinicians who can be assigned to appointment blocks',
108
- icon: { emoji: '🧑‍⚕️' },
109
- sections: {
110
- provider: section('Provider', { sectionId: 'sec_provider_info' }),
111
- },
112
- fields: {
113
- provider_status: radio({
114
- displayName: 'Status',
115
- description: 'Whether this provider is active in the practice',
116
- options: ['Active', 'On leave', 'Inactive'],
117
- required: true,
118
- section: 'provider',
119
- }),
120
- booking_status: radio({
121
- displayName: 'Booking status',
122
- description: 'Whether scheduling should offer this provider for new appointments',
123
- options: ['Open', 'Limited', 'Closed'],
124
- required: true,
125
- section: 'provider',
126
- }),
127
- next_available_days: number({
128
- displayName: 'Next available (days)',
129
- description: 'Estimated days until this provider has an open appointment slot',
130
- decimalPlaces: 0,
131
- required: true,
132
- section: 'provider',
133
- }),
134
- },
135
- });
136
-
137
- /** Operatory schema used as the parent object for the daily chair board. */
138
- export const operatoryDefinition = defineCustomObject({
139
- name: 'dental_operatory',
140
- displayName: 'Operatory',
141
- pluralLabel: 'Operatories',
142
- category: DENTAL_CATEGORY_NAME,
143
- description: 'A chair, bay, or room you book on the daily board',
144
- icon: { emoji: '🪥' },
145
- sections: {
146
- operatory: section('Operatory', { sectionId: 'sec_op_info' }),
147
- },
148
- fields: {
149
- room_code: text({
150
- displayName: 'Room code',
151
- description: 'Short code for whiteboards and schedules',
152
- maxLength: 20,
153
- section: 'operatory',
154
- }),
155
- },
156
- });
157
-
158
- /** Appointment schema covering chair, patient, provider, schedule, and status. */
159
- export const appointmentDefinition = defineCustomObject({
160
- name: 'dental_appointment',
161
- displayName: 'Appointment',
162
- pluralLabel: 'Appointments',
163
- category: DENTAL_CATEGORY_NAME,
164
- description: 'Chair booking with visit type and real-time visit status',
165
- icon: { emoji: '📅' },
166
- sections: {
167
- operatory_and_time: section('Operatory & time', { sectionId: 'sec_appt_op' }),
168
- patient_and_visit: section('Patient & visit', { sectionId: 'sec_appt_patient' }),
169
- },
170
- fields: {
171
- operatory_ref: parentChild(operatoryDefinition, {
172
- displayName: 'Operatory (chair)',
173
- description: 'Which chair or bay this visit is booked on',
174
- relatedDataLabel: 'Appointments',
175
- parentChildType: 'PRIMARY',
176
- enableParentOwnerInheritance: false,
177
- section: 'operatory_and_time',
178
- }),
179
- start_time: datetime({
180
- displayName: 'Start (local)',
181
- description: 'Planned or actual start; board sorts by this',
182
- required: true,
183
- section: 'operatory_and_time',
184
- }),
185
- duration_minutes: number({
186
- displayName: 'Duration (minutes)',
187
- description: 'Expected chair time for the procedure block',
188
- required: true,
189
- decimalPlaces: 0,
190
- section: 'operatory_and_time',
191
- }),
192
- patient_ref: lookup(patientDefinition, {
193
- displayName: 'Patient',
194
- description: 'Chart to open for this visit (active patients only)',
195
- relatedDataLabel: 'Appointments',
196
- required: true,
197
- lookupFilterRqlCondition: typedRql(patientDefinition, '(active_patient == True)'),
198
- section: 'patient_and_visit',
199
- }),
200
- provider_ref: lookup(providerDefinition, {
201
- displayName: 'Provider',
202
- description: 'Provider assigned to this visit (active and bookable within two weeks)',
203
- relatedDataLabel: 'Appointments',
204
- required: true,
205
- lookupFilterRqlCondition: typedRql(
206
- providerDefinition,
207
- "((provider_status IN ['Active']) AND (next_available_days <= 14) AND (booking_status NOT_IN ['Closed']))",
208
- ),
209
- section: 'patient_and_visit',
210
- }),
211
- visit_type: radio({
212
- displayName: 'Visit type',
213
- description: 'Visit type field',
214
- options: [
215
- 'New patient exam',
216
- 'Periodic / recall exam',
217
- 'Prophy / cleaning',
218
- 'Restorative',
219
- 'Endodontic',
220
- 'Perio / SRP',
221
- 'Oral surgery / extraction',
222
- 'Orthodontic',
223
- 'Emergency / pain',
224
- 'Other',
225
- ],
226
- required: true,
227
- section: 'patient_and_visit',
228
- }),
229
- appointment_status: radio({
230
- displayName: 'Visit status',
231
- description: 'Front-desk and clinical workflow status',
232
- options: ['Scheduled', 'Checked in', 'In treatment', 'Completed', 'Cancelled', 'No-show'],
233
- required: true,
234
- section: 'patient_and_visit',
235
- }),
236
- visit_notes: longText({
237
- displayName: 'Visit notes',
238
- description: 'Chairside notes for this block (sync with EDR as needed)',
239
- maxLength: 4000,
240
- section: 'patient_and_visit',
241
- }),
242
- board_label: formula.text({
243
- displayName: 'Board label',
244
- description: 'Board label field',
245
- formula: "CONCATENATE(visit_type__c, ' · ', appointment_status__c)",
246
- maxLength: 260,
247
- section: 'patient_and_visit',
248
- }),
249
- },
250
- });
251
-
252
- /** Treatment-plan schema for staged work owned by a patient chart. */
253
- export const treatmentPlanDefinition = defineCustomObject({
254
- name: 'dental_treatment_plan',
255
- displayName: 'Treatment plan',
256
- pluralLabel: 'Treatment plans',
257
- category: DENTAL_CATEGORY_NAME,
258
- description: 'Staged work sequenced for a patient',
259
- icon: { emoji: '📋' },
260
- sections: {
261
- link: section('Link', { sectionId: 'sec_plan_link' }),
262
- plan: section('Plan', { sectionId: 'sec_plan_body' }),
263
- },
264
- fields: {
265
- plan_patient_ref: parentChild(patientDefinition, {
266
- displayName: 'Patient',
267
- description: 'Which chart owns this plan',
268
- relatedDataLabel: 'Treatment plans',
269
- parentChildType: 'PRIMARY',
270
- enableParentOwnerInheritance: false,
271
- section: 'link',
272
- }),
273
- plan_status: radio({
274
- displayName: 'Status',
275
- description: 'Status field',
276
- options: ['Draft', 'Presented', 'Accepted', 'In progress', 'Completed', 'Declined / on hold'],
277
- required: true,
278
- section: 'plan',
279
- }),
280
- target_completion: date({
281
- displayName: 'Target completion',
282
- description: 'Goal to finish or next review',
283
- section: 'plan',
284
- }),
285
- procedures_summary: longText({
286
- displayName: 'Procedures & sequence',
287
- description: 'Tooth numbers, codes, and staging',
288
- maxLength: 8000,
289
- section: 'plan',
290
- }),
291
- fee_estimate_cents: number({
292
- displayName: 'Fee estimate (cents)',
293
- description: 'Rough office fee total for planning; adjust per office policy',
294
- decimalPlaces: 0,
295
- section: 'plan',
296
- }),
297
- },
298
- });
@@ -1,248 +0,0 @@
1
- /**
2
- * Typed custom-object schema definitions for the field service dispatch example.
3
- */
4
-
5
- import {
6
- date,
7
- datetime,
8
- defineCustomObject,
9
- formula,
10
- longText,
11
- lookup,
12
- number,
13
- parentChild,
14
- radio,
15
- section,
16
- text,
17
- } from '@rippling/rippling-sdk/core/platform/custom-objects';
18
-
19
- /** Logical category shared by the field service dispatch example. */
20
- export const FIELD_SERVICE_CATEGORY = 'field_service';
21
-
22
- /** Customer-site schema used by assets and work orders. */
23
- export const siteDefinition = defineCustomObject({
24
- name: 'fs_customer_site',
25
- displayName: 'Customer site',
26
- pluralLabel: 'Customer sites',
27
- category: FIELD_SERVICE_CATEGORY,
28
- description: 'Customer location with service tier and access notes',
29
- sections: {
30
- site: section('Site', { sectionId: 'sec_fs_site' }),
31
- },
32
- fields: {
33
- account_name: text({
34
- displayName: 'Account name',
35
- description: 'Customer account or property group',
36
- required: true,
37
- maxLength: 160,
38
- section: 'site',
39
- }),
40
- service_address: longText({
41
- displayName: 'Service address',
42
- description: 'Address, gate code, and arrival instructions',
43
- maxLength: 3000,
44
- section: 'site',
45
- }),
46
- service_tier: radio({
47
- displayName: 'Service tier',
48
- description: 'SLA tier for dispatch prioritization',
49
- options: ['Standard', 'Premium', 'Critical 24x7'],
50
- required: true,
51
- section: 'site',
52
- }),
53
- },
54
- });
55
-
56
- /** Installed-asset schema tied to a customer site. */
57
- export const assetDefinition = defineCustomObject({
58
- name: 'fs_asset',
59
- displayName: 'Asset',
60
- pluralLabel: 'Assets',
61
- category: FIELD_SERVICE_CATEGORY,
62
- description: 'Installed equipment maintained at a customer site',
63
- sections: {
64
- asset: section('Asset', { sectionId: 'sec_fs_asset' }),
65
- },
66
- fields: {
67
- customer_site_ref: parentChild(siteDefinition, {
68
- displayName: 'Customer site',
69
- description: 'Site where this asset is installed',
70
- relatedDataLabel: 'Assets',
71
- parentChildType: 'PRIMARY',
72
- enableParentOwnerInheritance: false,
73
- section: 'asset',
74
- }),
75
- serial_number: text({
76
- displayName: 'Serial number',
77
- description: 'Manufacturer serial number',
78
- maxLength: 80,
79
- section: 'asset',
80
- }),
81
- asset_type: radio({
82
- displayName: 'Asset type',
83
- description: 'Equipment category',
84
- options: ['HVAC', 'Generator', 'Security', 'Network', 'Kitchen equipment', 'Other'],
85
- required: true,
86
- section: 'asset',
87
- }),
88
- warranty_end: date({
89
- displayName: 'Warranty end',
90
- description: 'Warranty expiration date',
91
- section: 'asset',
92
- }),
93
- },
94
- });
95
-
96
- /** Work-order schema tied to a customer site and optional asset. */
97
- export const workOrderDefinition = defineCustomObject({
98
- name: 'fs_work_order',
99
- displayName: 'Work order',
100
- pluralLabel: 'Work orders',
101
- category: FIELD_SERVICE_CATEGORY,
102
- description: 'Dispatch job with schedule, priority, and status',
103
- sections: {
104
- work_order: section('Work order', { sectionId: 'sec_fs_work_order' }),
105
- },
106
- fields: {
107
- customer_site_ref: parentChild(siteDefinition, {
108
- displayName: 'Customer site',
109
- description: 'Site receiving service',
110
- relatedDataLabel: 'Work orders',
111
- parentChildType: 'PRIMARY',
112
- enableParentOwnerInheritance: false,
113
- section: 'work_order',
114
- }),
115
- asset_ref: lookup(assetDefinition, {
116
- displayName: 'Asset',
117
- description: 'Optional installed asset being serviced',
118
- relatedDataLabel: 'Work orders',
119
- section: 'work_order',
120
- }),
121
- priority: radio({
122
- displayName: 'Priority',
123
- description: 'Dispatch priority',
124
- options: ['Low', 'Normal', 'High', 'Emergency'],
125
- required: true,
126
- section: 'work_order',
127
- }),
128
- status: radio({
129
- displayName: 'Status',
130
- description: 'Current dispatch status',
131
- options: ['New', 'Scheduled', 'In progress', 'Blocked', 'Complete', 'Cancelled'],
132
- required: true,
133
- section: 'work_order',
134
- }),
135
- scheduled_start: datetime({
136
- displayName: 'Scheduled start',
137
- description: 'Planned arrival window start',
138
- section: 'work_order',
139
- }),
140
- scheduled_end: datetime({
141
- displayName: 'Scheduled end',
142
- description: 'Planned arrival window end',
143
- section: 'work_order',
144
- }),
145
- problem_summary: longText({
146
- displayName: 'Problem summary',
147
- description: 'Customer-reported issue and triage notes',
148
- maxLength: 6000,
149
- section: 'work_order',
150
- }),
151
- dispatch_label: formula.text({
152
- displayName: 'Dispatch label',
153
- description: 'Compact board label',
154
- formula: "CONCATENATE(priority__c, ' - ', status__c)",
155
- maxLength: 240,
156
- section: 'work_order',
157
- }),
158
- },
159
- });
160
-
161
- /** Task schema tied to a parent work order. */
162
- export const taskDefinition = defineCustomObject({
163
- name: 'fs_task',
164
- displayName: 'Task',
165
- pluralLabel: 'Tasks',
166
- category: FIELD_SERVICE_CATEGORY,
167
- description: 'Work order task with labor estimate and completion state',
168
- sections: {
169
- task: section('Task', { sectionId: 'sec_fs_task' }),
170
- },
171
- fields: {
172
- work_order_ref: parentChild(workOrderDefinition, {
173
- displayName: 'Work order',
174
- description: 'Work order this task belongs to',
175
- relatedDataLabel: 'Tasks',
176
- parentChildType: 'PRIMARY',
177
- enableParentOwnerInheritance: true,
178
- section: 'task',
179
- }),
180
- task_type: radio({
181
- displayName: 'Task type',
182
- description: 'Type of work required',
183
- options: ['Inspect', 'Repair', 'Replace', 'Calibrate', 'Clean', 'Customer walkthrough'],
184
- required: true,
185
- section: 'task',
186
- }),
187
- status: radio({
188
- displayName: 'Status',
189
- description: 'Task status',
190
- options: ['Open', 'In progress', 'Blocked', 'Done'],
191
- required: true,
192
- section: 'task',
193
- }),
194
- estimated_hours: number({
195
- displayName: 'Estimated hours',
196
- description: 'Labor estimate for this task',
197
- decimalPlaces: 2,
198
- section: 'task',
199
- }),
200
- completed_at: datetime({
201
- displayName: 'Completed at',
202
- description: 'Completion timestamp',
203
- section: 'task',
204
- }),
205
- },
206
- });
207
-
208
- /** Part-usage schema tied to a parent task. */
209
- export const partUsageDefinition = defineCustomObject({
210
- name: 'fs_part_usage',
211
- displayName: 'Part usage',
212
- pluralLabel: 'Part usage',
213
- category: FIELD_SERVICE_CATEGORY,
214
- description: 'Part consumed while completing a task',
215
- sections: {
216
- part_usage: section('Part usage', { sectionId: 'sec_fs_part_usage' }),
217
- },
218
- fields: {
219
- task_ref: parentChild(taskDefinition, {
220
- displayName: 'Task',
221
- description: 'Task that consumed this part',
222
- relatedDataLabel: 'Parts used',
223
- parentChildType: 'PRIMARY',
224
- enableParentOwnerInheritance: true,
225
- section: 'part_usage',
226
- }),
227
- sku: text({
228
- displayName: 'SKU',
229
- description: 'Inventory SKU or part number',
230
- maxLength: 80,
231
- required: true,
232
- section: 'part_usage',
233
- }),
234
- quantity: number({
235
- displayName: 'Quantity',
236
- description: 'Quantity consumed',
237
- decimalPlaces: 2,
238
- required: true,
239
- section: 'part_usage',
240
- }),
241
- unit_cost_cents: number({
242
- displayName: 'Unit cost (cents)',
243
- description: 'Unit material cost in cents',
244
- decimalPlaces: 0,
245
- section: 'part_usage',
246
- }),
247
- },
248
- });