@proveanything/smartlinks 1.5.5 → 1.6.0
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.
- package/dist/api/contact.d.ts +26 -10
- package/dist/api/contact.js +24 -8
- package/dist/docs/API_SUMMARY.md +49 -28
- package/dist/types/contact.d.ts +76 -41
- package/dist/types/contact.js +56 -26
- package/docs/API_SUMMARY.md +49 -28
- package/package.json +1 -1
package/dist/api/contact.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContactResponse, ContactCreateRequest, ContactUpdateRequest, ContactListResponse, PublicContactUpsertRequest, PublicContactUpsertResponse, UserSearchResponse, ContactPatch, PublicGetMyContactResponse, PublicUpdateMyContactResponse,
|
|
1
|
+
import { ContactResponse, ContactCreateRequest, ContactUpdateRequest, ContactListResponse, PublicContactUpsertRequest, PublicContactUpsertResponse, UserSearchResponse, ContactPatch, PublicGetMyContactResponse, PublicUpdateMyContactResponse, ContactSchemaResponse } from "../types";
|
|
2
2
|
export declare namespace contact {
|
|
3
3
|
function create(collectionId: string, data: ContactCreateRequest): Promise<ContactResponse>;
|
|
4
4
|
function list(collectionId: string, params?: {
|
|
@@ -20,18 +20,34 @@ export declare namespace contact {
|
|
|
20
20
|
function publicGetMine(collectionId: string): Promise<PublicGetMyContactResponse>;
|
|
21
21
|
function publicUpdateMine(collectionId: string, data: ContactPatch): Promise<PublicUpdateMyContactResponse>;
|
|
22
22
|
/**
|
|
23
|
-
* Public: Get contact
|
|
23
|
+
* Public: Get the contact schema for a collection.
|
|
24
|
+
* GET /public/collection/:collectionId/contact/schema
|
|
24
25
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
26
|
+
* Returns a ContactSchemaResponse describing all publicly visible contact fields.
|
|
27
|
+
* Core fields and collection-defined custom fields are merged into a single flat schema.
|
|
27
28
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
29
|
+
* Fields not in `publicVisibleFields` are stripped entirely from the response.
|
|
30
|
+
* Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`.
|
|
31
|
+
*
|
|
32
|
+
* Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions`
|
|
33
|
+
* from the types package to handle conditional field visibility.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* import { contact, evaluateConditions } from '@proveanything/smartlinks'
|
|
38
|
+
*
|
|
39
|
+
* const schema = await contact.publicGetSchema(collectionId)
|
|
40
|
+
*
|
|
41
|
+
* for (const fieldId of schema.fieldOrder) {
|
|
42
|
+
* const property = schema.schema.properties[fieldId]
|
|
43
|
+
* const ui = schema.uiSchema[fieldId] || {}
|
|
44
|
+
* const visible = evaluateConditions(property.conditions, property.showWhen, formValues)
|
|
45
|
+
* const disabled = ui['ui:disabled'] === true
|
|
46
|
+
* if (visible) renderField({ fieldId, property, ui, disabled })
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
33
49
|
*/
|
|
34
|
-
function publicGetSchema(collectionId: string): Promise<
|
|
50
|
+
function publicGetSchema(collectionId: string): Promise<ContactSchemaResponse>;
|
|
35
51
|
function erase(collectionId: string, contactId: string, body?: any): Promise<ContactResponse>;
|
|
36
52
|
function getUser(collectionId: string, userId: string): Promise<UserSearchResponse>;
|
|
37
53
|
}
|
package/dist/api/contact.js
CHANGED
|
@@ -72,16 +72,32 @@ export var contact;
|
|
|
72
72
|
}
|
|
73
73
|
contact.publicUpdateMine = publicUpdateMine;
|
|
74
74
|
/**
|
|
75
|
-
* Public: Get contact
|
|
75
|
+
* Public: Get the contact schema for a collection.
|
|
76
|
+
* GET /public/collection/:collectionId/contact/schema
|
|
76
77
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
78
|
+
* Returns a ContactSchemaResponse describing all publicly visible contact fields.
|
|
79
|
+
* Core fields and collection-defined custom fields are merged into a single flat schema.
|
|
79
80
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
81
|
+
* Fields not in `publicVisibleFields` are stripped entirely from the response.
|
|
82
|
+
* Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`.
|
|
83
|
+
*
|
|
84
|
+
* Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions`
|
|
85
|
+
* from the types package to handle conditional field visibility.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* import { contact, evaluateConditions } from '@proveanything/smartlinks'
|
|
90
|
+
*
|
|
91
|
+
* const schema = await contact.publicGetSchema(collectionId)
|
|
92
|
+
*
|
|
93
|
+
* for (const fieldId of schema.fieldOrder) {
|
|
94
|
+
* const property = schema.schema.properties[fieldId]
|
|
95
|
+
* const ui = schema.uiSchema[fieldId] || {}
|
|
96
|
+
* const visible = evaluateConditions(property.conditions, property.showWhen, formValues)
|
|
97
|
+
* const disabled = ui['ui:disabled'] === true
|
|
98
|
+
* if (visible) renderField({ fieldId, property, ui, disabled })
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
85
101
|
*/
|
|
86
102
|
async function publicGetSchema(collectionId) {
|
|
87
103
|
const path = `/public/collection/${encodeURIComponent(collectionId)}/contact/schema`;
|
package/dist/docs/API_SUMMARY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Smartlinks API Summary
|
|
2
2
|
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0 | Generated: 2026-02-26T10:54:21.851Z
|
|
4
4
|
|
|
5
5
|
This is a concise summary of all available API functions and types.
|
|
6
6
|
|
|
@@ -990,6 +990,19 @@ interface GetCollectionWidgetsOptions {
|
|
|
990
990
|
|
|
991
991
|
### appObjects
|
|
992
992
|
|
|
993
|
+
**PaginatedResponse<T>** (interface)
|
|
994
|
+
```typescript
|
|
995
|
+
interface PaginatedResponse<T> {
|
|
996
|
+
data: T[]
|
|
997
|
+
pagination: {
|
|
998
|
+
total: number
|
|
999
|
+
limit: number
|
|
1000
|
+
offset: number
|
|
1001
|
+
hasMore: boolean
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
```
|
|
1005
|
+
|
|
993
1006
|
**AggregateRequest** (interface)
|
|
994
1007
|
```typescript
|
|
995
1008
|
interface AggregateRequest {
|
|
@@ -2489,36 +2502,46 @@ interface CommsState {
|
|
|
2489
2502
|
**FieldCondition** (interface)
|
|
2490
2503
|
```typescript
|
|
2491
2504
|
interface FieldCondition {
|
|
2492
|
-
|
|
2505
|
+
targetFieldId: string // The field whose value is tested
|
|
2493
2506
|
operator: ConditionOperator
|
|
2494
|
-
value?:
|
|
2507
|
+
value?: unknown // Required for equals / not_equals / contains / not_contains / greater_than / less_than
|
|
2508
|
+
}
|
|
2509
|
+
```
|
|
2510
|
+
|
|
2511
|
+
**ContactSchemaProperty** (interface)
|
|
2512
|
+
```typescript
|
|
2513
|
+
interface ContactSchemaProperty {
|
|
2514
|
+
type: 'string' | 'number' | 'boolean' | 'array'
|
|
2515
|
+
title?: string
|
|
2516
|
+
description?: string
|
|
2517
|
+
format?: string
|
|
2518
|
+
enum?: string[]
|
|
2519
|
+
conditions?: FieldCondition[]
|
|
2520
|
+
showWhen?: 'all' | 'any'
|
|
2495
2521
|
}
|
|
2496
2522
|
```
|
|
2497
2523
|
|
|
2498
|
-
**
|
|
2524
|
+
**ContactUiSchemaEntry** (interface)
|
|
2499
2525
|
```typescript
|
|
2500
|
-
interface
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
widget: FieldWidget
|
|
2505
|
-
visible: boolean
|
|
2506
|
-
editable: boolean
|
|
2507
|
-
readOnly: boolean
|
|
2526
|
+
interface ContactUiSchemaEntry {
|
|
2527
|
+
'ui:disabled'?: true // Field is visible but not editable
|
|
2528
|
+
'ui:placeholder'?: string // Placeholder text
|
|
2529
|
+
[key: string]: unknown // Forward-compatible with additional rjsf hints
|
|
2508
2530
|
}
|
|
2509
2531
|
```
|
|
2510
2532
|
|
|
2511
|
-
**
|
|
2533
|
+
**ContactSchemaResponse** (interface)
|
|
2512
2534
|
```typescript
|
|
2513
|
-
interface
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
publicVisibleFields: string[]
|
|
2519
|
-
publicEditableFields: string[]
|
|
2520
|
-
customFieldsVersion: number
|
|
2535
|
+
interface ContactSchemaResponse {
|
|
2536
|
+
schema: {
|
|
2537
|
+
type: 'object'
|
|
2538
|
+
required?: string[]
|
|
2539
|
+
properties: Record<string, ContactSchemaProperty>
|
|
2521
2540
|
}
|
|
2541
|
+
uiSchema: Record<string, ContactUiSchemaEntry>
|
|
2542
|
+
fieldOrder: string[]
|
|
2543
|
+
settings: Record<string, unknown>
|
|
2544
|
+
styling: Record<string, unknown>
|
|
2522
2545
|
}
|
|
2523
2546
|
```
|
|
2524
2547
|
|
|
@@ -2540,9 +2563,7 @@ interface ContactSchema {
|
|
|
2540
2563
|
|
|
2541
2564
|
**ConditionOperator** = ``
|
|
2542
2565
|
|
|
2543
|
-
**
|
|
2544
|
-
|
|
2545
|
-
**FieldType** = ``
|
|
2566
|
+
**ContactSchema** = `ContactSchemaResponse`
|
|
2546
2567
|
|
|
2547
2568
|
### crate
|
|
2548
2569
|
|
|
@@ -4952,15 +4973,15 @@ Logging: Append many communication events for a list of IDs. POST /admin/collect
|
|
|
4952
4973
|
**publicUpdateMine**(collectionId: string,
|
|
4953
4974
|
data: ContactPatch) → `Promise<PublicUpdateMyContactResponse>`
|
|
4954
4975
|
|
|
4955
|
-
**publicGetSchema**(collectionId: string) → `Promise<
|
|
4956
|
-
Public: Get contact
|
|
4976
|
+
**publicGetSchema**(collectionId: string) → `Promise<ContactSchemaResponse>`
|
|
4977
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4957
4978
|
|
|
4958
4979
|
**erase**(collectionId: string, contactId: string, body?: any) → `Promise<ContactResponse>`
|
|
4959
|
-
Public: Get contact
|
|
4980
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4960
4981
|
|
|
4961
4982
|
**getUser**(collectionId: string,
|
|
4962
4983
|
userId: string,) → `Promise<UserSearchResponse>`
|
|
4963
|
-
Public: Get contact
|
|
4984
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4964
4985
|
|
|
4965
4986
|
### crate
|
|
4966
4987
|
|
package/dist/types/contact.d.ts
CHANGED
|
@@ -131,61 +131,96 @@ export interface CommsState {
|
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
133
|
* Operators for conditional field visibility.
|
|
134
|
-
*
|
|
134
|
+
* Used in ContactSchemaProperty.conditions[].operator.
|
|
135
135
|
*/
|
|
136
|
-
export type ConditionOperator = 'equals' | '
|
|
136
|
+
export type ConditionOperator = 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'is_empty' | 'is_not_empty' | 'greater_than' | 'less_than';
|
|
137
137
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
138
|
+
* A single visibility condition on a field.
|
|
139
|
+
* The field renders only when its conditions are satisfied (see `showWhen`).
|
|
140
140
|
*/
|
|
141
141
|
export interface FieldCondition {
|
|
142
|
-
|
|
142
|
+
targetFieldId: string;
|
|
143
143
|
operator: ConditionOperator;
|
|
144
|
-
value?:
|
|
144
|
+
value?: unknown;
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
146
|
+
/**
|
|
147
|
+
* A single field property as returned by the contact schema endpoint.
|
|
148
|
+
* Follows JSON Schema conventions with rendering hints via `format`.
|
|
149
|
+
*
|
|
150
|
+
* Format values:
|
|
151
|
+
* (none) → plain text input
|
|
152
|
+
* email → email input
|
|
153
|
+
* uri → URL input
|
|
154
|
+
* tel → phone input
|
|
155
|
+
* date → date picker
|
|
156
|
+
* textarea → multi-line text
|
|
157
|
+
* select → single-select dropdown (requires `enum`)
|
|
158
|
+
* multiselect → multi-select (type will be 'array', requires `enum`)
|
|
159
|
+
* radio → radio button group (requires `enum`)
|
|
160
|
+
*/
|
|
161
|
+
export interface ContactSchemaProperty {
|
|
162
|
+
type: 'string' | 'number' | 'boolean' | 'array';
|
|
163
|
+
title?: string;
|
|
164
|
+
description?: string;
|
|
165
|
+
format?: string;
|
|
166
|
+
enum?: string[];
|
|
167
|
+
conditions?: FieldCondition[];
|
|
168
|
+
showWhen?: 'all' | 'any';
|
|
156
169
|
}
|
|
157
|
-
|
|
170
|
+
/**
|
|
171
|
+
* UI rendering hints for a single field, keyed by field ID in `uiSchema`.
|
|
172
|
+
*/
|
|
173
|
+
export interface ContactUiSchemaEntry {
|
|
174
|
+
'ui:disabled'?: true;
|
|
175
|
+
'ui:placeholder'?: string;
|
|
176
|
+
[key: string]: unknown;
|
|
158
177
|
}
|
|
159
178
|
/**
|
|
160
|
-
*
|
|
179
|
+
* Response from GET /public/collection/:collectionId/contact/schema
|
|
180
|
+
*
|
|
181
|
+
* Core fields and collection-defined custom fields are merged into a single
|
|
182
|
+
* flat schema. Fields not in `publicVisibleFields` are stripped entirely.
|
|
183
|
+
* Fields visible but not in `publicEditableFields` have `ui:disabled: true`
|
|
184
|
+
* in `uiSchema`.
|
|
161
185
|
*/
|
|
162
|
-
export interface
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
placeholder?: string;
|
|
168
|
-
description?: string;
|
|
169
|
-
condition?: FieldCondition;
|
|
170
|
-
}
|
|
171
|
-
export interface ContactSchema {
|
|
172
|
-
version: number;
|
|
173
|
-
fields: CoreField[];
|
|
174
|
-
customFields: CustomField[];
|
|
175
|
-
settings: {
|
|
176
|
-
publicVisibleFields: string[];
|
|
177
|
-
publicEditableFields: string[];
|
|
178
|
-
customFieldsVersion: number;
|
|
186
|
+
export interface ContactSchemaResponse {
|
|
187
|
+
schema: {
|
|
188
|
+
type: 'object';
|
|
189
|
+
required?: string[];
|
|
190
|
+
properties: Record<string, ContactSchemaProperty>;
|
|
179
191
|
};
|
|
180
|
-
|
|
192
|
+
uiSchema: Record<string, ContactUiSchemaEntry>;
|
|
193
|
+
/** Ordered list of field IDs — core fields first, then custom fields */
|
|
194
|
+
fieldOrder: string[];
|
|
195
|
+
/** Pass-through of the collection's SchemaFormConfig settings block */
|
|
196
|
+
settings: Record<string, unknown>;
|
|
197
|
+
/** Pass-through of the collection's SchemaFormConfig styling block */
|
|
198
|
+
styling: Record<string, unknown>;
|
|
199
|
+
}
|
|
200
|
+
/** @deprecated Use ContactSchemaResponse instead */
|
|
201
|
+
export type ContactSchema = ContactSchemaResponse;
|
|
181
202
|
/**
|
|
182
|
-
* Evaluate whether a field's
|
|
183
|
-
* Returns true if the field should be visible.
|
|
203
|
+
* Evaluate whether a field's conditions are satisfied given the current form values.
|
|
204
|
+
* Returns `true` if the field should be visible.
|
|
205
|
+
*
|
|
206
|
+
* @param conditions The `conditions` array from a ContactSchemaProperty (may be undefined)
|
|
207
|
+
* @param showWhen 'all' requires every condition to pass; 'any' requires at least one
|
|
208
|
+
* @param fieldValues Current form values keyed by field ID
|
|
184
209
|
*
|
|
185
210
|
* @example
|
|
186
211
|
* ```typescript
|
|
187
|
-
* const
|
|
188
|
-
* const
|
|
212
|
+
* const property = schema.schema.properties[fieldId]
|
|
213
|
+
* const visible = evaluateConditions(property.conditions, property.showWhen, formValues)
|
|
189
214
|
* ```
|
|
190
215
|
*/
|
|
191
|
-
export declare function
|
|
216
|
+
export declare function evaluateConditions(conditions: FieldCondition[] | undefined, showWhen: 'all' | 'any' | undefined, fieldValues: Record<string, unknown>): boolean;
|
|
217
|
+
/**
|
|
218
|
+
* @deprecated Use evaluateConditions (plural) instead.
|
|
219
|
+
* Shim for code using the old single-condition API.
|
|
220
|
+
*/
|
|
221
|
+
export declare function evaluateCondition(condition: {
|
|
222
|
+
dependsOn?: string;
|
|
223
|
+
targetFieldId?: string;
|
|
224
|
+
operator: string;
|
|
225
|
+
value?: unknown;
|
|
226
|
+
} | undefined, fieldValues: Record<string, unknown>): boolean;
|
package/dist/types/contact.js
CHANGED
|
@@ -1,35 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Evaluate whether a field's
|
|
3
|
-
* Returns true if the field should be visible.
|
|
2
|
+
* Evaluate whether a field's conditions are satisfied given the current form values.
|
|
3
|
+
* Returns `true` if the field should be visible.
|
|
4
|
+
*
|
|
5
|
+
* @param conditions The `conditions` array from a ContactSchemaProperty (may be undefined)
|
|
6
|
+
* @param showWhen 'all' requires every condition to pass; 'any' requires at least one
|
|
7
|
+
* @param fieldValues Current form values keyed by field ID
|
|
4
8
|
*
|
|
5
9
|
* @example
|
|
6
10
|
* ```typescript
|
|
7
|
-
* const
|
|
8
|
-
* const
|
|
11
|
+
* const property = schema.schema.properties[fieldId]
|
|
12
|
+
* const visible = evaluateConditions(property.conditions, property.showWhen, formValues)
|
|
9
13
|
* ```
|
|
10
14
|
*/
|
|
15
|
+
export function evaluateConditions(conditions, showWhen, fieldValues) {
|
|
16
|
+
if (!conditions || conditions.length === 0)
|
|
17
|
+
return true;
|
|
18
|
+
const results = conditions.map(condition => {
|
|
19
|
+
const value = fieldValues[condition.targetFieldId];
|
|
20
|
+
switch (condition.operator) {
|
|
21
|
+
case 'is_empty':
|
|
22
|
+
return value == null || value === '' || (Array.isArray(value) && value.length === 0);
|
|
23
|
+
case 'is_not_empty':
|
|
24
|
+
return value != null && value !== '' && !(Array.isArray(value) && value.length === 0);
|
|
25
|
+
case 'equals':
|
|
26
|
+
return value === condition.value;
|
|
27
|
+
case 'not_equals':
|
|
28
|
+
return value !== condition.value;
|
|
29
|
+
case 'contains':
|
|
30
|
+
return Array.isArray(value)
|
|
31
|
+
? value.includes(condition.value)
|
|
32
|
+
: typeof value === 'string' && value.includes(String(condition.value));
|
|
33
|
+
case 'not_contains':
|
|
34
|
+
return Array.isArray(value)
|
|
35
|
+
? !value.includes(condition.value)
|
|
36
|
+
: typeof value === 'string' && !value.includes(String(condition.value));
|
|
37
|
+
case 'greater_than':
|
|
38
|
+
return typeof value === 'number' && typeof condition.value === 'number'
|
|
39
|
+
? value > condition.value
|
|
40
|
+
: String(value) > String(condition.value);
|
|
41
|
+
case 'less_than':
|
|
42
|
+
return typeof value === 'number' && typeof condition.value === 'number'
|
|
43
|
+
? value < condition.value
|
|
44
|
+
: String(value) < String(condition.value);
|
|
45
|
+
default:
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return (showWhen !== null && showWhen !== void 0 ? showWhen : 'all') === 'any'
|
|
50
|
+
? results.some(Boolean)
|
|
51
|
+
: results.every(Boolean);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated Use evaluateConditions (plural) instead.
|
|
55
|
+
* Shim for code using the old single-condition API.
|
|
56
|
+
*/
|
|
11
57
|
export function evaluateCondition(condition, fieldValues) {
|
|
58
|
+
var _a;
|
|
12
59
|
if (!condition)
|
|
13
|
-
return true;
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
case 'isNotEmpty':
|
|
19
|
-
return value != null && value !== '' && !(Array.isArray(value) && !value.length);
|
|
20
|
-
case 'isTrue':
|
|
21
|
-
return value === true;
|
|
22
|
-
case 'isFalse':
|
|
23
|
-
return value === false;
|
|
24
|
-
case 'equals':
|
|
25
|
-
return value === condition.value;
|
|
26
|
-
case 'notEquals':
|
|
27
|
-
return value !== condition.value;
|
|
28
|
-
case 'contains':
|
|
29
|
-
return Array.isArray(value) && value.includes(condition.value);
|
|
30
|
-
case 'notContains':
|
|
31
|
-
return !Array.isArray(value) || !value.includes(condition.value);
|
|
32
|
-
default:
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
60
|
+
return true;
|
|
61
|
+
const targetFieldId = (_a = condition.dependsOn) !== null && _a !== void 0 ? _a : condition.targetFieldId;
|
|
62
|
+
if (!targetFieldId)
|
|
63
|
+
return true;
|
|
64
|
+
return evaluateConditions([{ targetFieldId, operator: condition.operator, value: condition.value }], 'all', fieldValues);
|
|
35
65
|
}
|
package/docs/API_SUMMARY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Smartlinks API Summary
|
|
2
2
|
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0 | Generated: 2026-02-26T10:54:21.851Z
|
|
4
4
|
|
|
5
5
|
This is a concise summary of all available API functions and types.
|
|
6
6
|
|
|
@@ -990,6 +990,19 @@ interface GetCollectionWidgetsOptions {
|
|
|
990
990
|
|
|
991
991
|
### appObjects
|
|
992
992
|
|
|
993
|
+
**PaginatedResponse<T>** (interface)
|
|
994
|
+
```typescript
|
|
995
|
+
interface PaginatedResponse<T> {
|
|
996
|
+
data: T[]
|
|
997
|
+
pagination: {
|
|
998
|
+
total: number
|
|
999
|
+
limit: number
|
|
1000
|
+
offset: number
|
|
1001
|
+
hasMore: boolean
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
```
|
|
1005
|
+
|
|
993
1006
|
**AggregateRequest** (interface)
|
|
994
1007
|
```typescript
|
|
995
1008
|
interface AggregateRequest {
|
|
@@ -2489,36 +2502,46 @@ interface CommsState {
|
|
|
2489
2502
|
**FieldCondition** (interface)
|
|
2490
2503
|
```typescript
|
|
2491
2504
|
interface FieldCondition {
|
|
2492
|
-
|
|
2505
|
+
targetFieldId: string // The field whose value is tested
|
|
2493
2506
|
operator: ConditionOperator
|
|
2494
|
-
value?:
|
|
2507
|
+
value?: unknown // Required for equals / not_equals / contains / not_contains / greater_than / less_than
|
|
2508
|
+
}
|
|
2509
|
+
```
|
|
2510
|
+
|
|
2511
|
+
**ContactSchemaProperty** (interface)
|
|
2512
|
+
```typescript
|
|
2513
|
+
interface ContactSchemaProperty {
|
|
2514
|
+
type: 'string' | 'number' | 'boolean' | 'array'
|
|
2515
|
+
title?: string
|
|
2516
|
+
description?: string
|
|
2517
|
+
format?: string
|
|
2518
|
+
enum?: string[]
|
|
2519
|
+
conditions?: FieldCondition[]
|
|
2520
|
+
showWhen?: 'all' | 'any'
|
|
2495
2521
|
}
|
|
2496
2522
|
```
|
|
2497
2523
|
|
|
2498
|
-
**
|
|
2524
|
+
**ContactUiSchemaEntry** (interface)
|
|
2499
2525
|
```typescript
|
|
2500
|
-
interface
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
widget: FieldWidget
|
|
2505
|
-
visible: boolean
|
|
2506
|
-
editable: boolean
|
|
2507
|
-
readOnly: boolean
|
|
2526
|
+
interface ContactUiSchemaEntry {
|
|
2527
|
+
'ui:disabled'?: true // Field is visible but not editable
|
|
2528
|
+
'ui:placeholder'?: string // Placeholder text
|
|
2529
|
+
[key: string]: unknown // Forward-compatible with additional rjsf hints
|
|
2508
2530
|
}
|
|
2509
2531
|
```
|
|
2510
2532
|
|
|
2511
|
-
**
|
|
2533
|
+
**ContactSchemaResponse** (interface)
|
|
2512
2534
|
```typescript
|
|
2513
|
-
interface
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
publicVisibleFields: string[]
|
|
2519
|
-
publicEditableFields: string[]
|
|
2520
|
-
customFieldsVersion: number
|
|
2535
|
+
interface ContactSchemaResponse {
|
|
2536
|
+
schema: {
|
|
2537
|
+
type: 'object'
|
|
2538
|
+
required?: string[]
|
|
2539
|
+
properties: Record<string, ContactSchemaProperty>
|
|
2521
2540
|
}
|
|
2541
|
+
uiSchema: Record<string, ContactUiSchemaEntry>
|
|
2542
|
+
fieldOrder: string[]
|
|
2543
|
+
settings: Record<string, unknown>
|
|
2544
|
+
styling: Record<string, unknown>
|
|
2522
2545
|
}
|
|
2523
2546
|
```
|
|
2524
2547
|
|
|
@@ -2540,9 +2563,7 @@ interface ContactSchema {
|
|
|
2540
2563
|
|
|
2541
2564
|
**ConditionOperator** = ``
|
|
2542
2565
|
|
|
2543
|
-
**
|
|
2544
|
-
|
|
2545
|
-
**FieldType** = ``
|
|
2566
|
+
**ContactSchema** = `ContactSchemaResponse`
|
|
2546
2567
|
|
|
2547
2568
|
### crate
|
|
2548
2569
|
|
|
@@ -4952,15 +4973,15 @@ Logging: Append many communication events for a list of IDs. POST /admin/collect
|
|
|
4952
4973
|
**publicUpdateMine**(collectionId: string,
|
|
4953
4974
|
data: ContactPatch) → `Promise<PublicUpdateMyContactResponse>`
|
|
4954
4975
|
|
|
4955
|
-
**publicGetSchema**(collectionId: string) → `Promise<
|
|
4956
|
-
Public: Get contact
|
|
4976
|
+
**publicGetSchema**(collectionId: string) → `Promise<ContactSchemaResponse>`
|
|
4977
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4957
4978
|
|
|
4958
4979
|
**erase**(collectionId: string, contactId: string, body?: any) → `Promise<ContactResponse>`
|
|
4959
|
-
Public: Get contact
|
|
4980
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4960
4981
|
|
|
4961
4982
|
**getUser**(collectionId: string,
|
|
4962
4983
|
userId: string,) → `Promise<UserSearchResponse>`
|
|
4963
|
-
Public: Get contact
|
|
4984
|
+
Public: Get the contact schema for a collection. GET /public/collection/:collectionId/contact/schema Returns a ContactSchemaResponse describing all publicly visible contact fields. Core fields and collection-defined custom fields are merged into a single flat schema. Fields not in `publicVisibleFields` are stripped entirely from the response. Fields visible but not in `publicEditableFields` have `ui:disabled: true` in `uiSchema`. Use `fieldOrder` to render fields in the correct sequence, and `evaluateConditions` from the types package to handle conditional field visibility. ```typescript import { contact, evaluateConditions } from '@proveanything/smartlinks' const schema = await contact.publicGetSchema(collectionId) for (const fieldId of schema.fieldOrder) { const property = schema.schema.properties[fieldId] const ui = schema.uiSchema[fieldId] || {} const visible = evaluateConditions(property.conditions, property.showWhen, formValues) const disabled = ui['ui:disabled'] === true if (visible) renderField({ fieldId, property, ui, disabled }) } ```
|
|
4964
4985
|
|
|
4965
4986
|
### crate
|
|
4966
4987
|
|