chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
import { formSchema } from './tally-events'
|
||||
import { listSubmissionsInputSchema, listSubmissionsOuputSchema } from './tally-submissions'
|
||||
|
||||
export default {
|
||||
listSubmissionsInputSchema,
|
||||
listSubmissionsOuputSchema,
|
||||
formSchema,
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import { z } from '@botpress/sdk'
|
||||
import { tallyFieldSchema } from './tally-fields'
|
||||
|
||||
export const formSchema = z.object({
|
||||
formId: z.string().min(1).describe('Form ID').title('Form ID'),
|
||||
fields: z.array(tallyFieldSchema).default([]).describe('Form fields').title('Fields'),
|
||||
})
|
||||
|
||||
export const webhookSchema = z
|
||||
.object({
|
||||
eventId: z.string().describe('Event ID').title('Event ID'),
|
||||
eventType: z.literal('FORM_RESPONSE').describe('Event Type').title('Event Type'),
|
||||
createdAt: z.string().describe('Creation Date').title('Created At'),
|
||||
data: z
|
||||
.object({
|
||||
responseId: z.string().optional().describe('Response ID').title('Response ID'),
|
||||
submissionId: z.string().optional().describe('Submission ID').title('Submission ID'),
|
||||
respondentId: z.string().optional().describe('Respondent ID').title('Respondent ID'),
|
||||
formId: z.string().describe('Form ID').title('Form ID'),
|
||||
formName: z.string().optional().describe('Form Name').title('Form Name'),
|
||||
createdAt: z.string().optional().describe('Creation Date').title('Created At'),
|
||||
fields: z.array(tallyFieldSchema).default([]).describe('Form fields').title('Fields'),
|
||||
})
|
||||
.passthrough(),
|
||||
})
|
||||
.passthrough()
|
||||
@@ -0,0 +1,91 @@
|
||||
import { z } from '@botpress/sdk'
|
||||
|
||||
const baseField = z
|
||||
.object({
|
||||
key: z.string().min(1).title('Key').describe('Field key identifier'),
|
||||
label: z.string().nullable().optional().title('Label').describe('Field label'),
|
||||
type: z.string().min(1).title('Type').describe('Field type'),
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const optionSchema = z
|
||||
.object({
|
||||
id: z.string().min(1).title('ID').describe('Option ID'),
|
||||
text: z.string().nullable().optional().title('Text').describe('Option text'),
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const fileSchema = z
|
||||
.object({
|
||||
id: z.string().optional().title('ID').describe('File ID'),
|
||||
name: z.string().nullable().optional().title('Name').describe('File name'),
|
||||
url: z.string().url().optional().title('URL').describe('File URL'),
|
||||
mimeType: z.string().nullable().optional().title('MIME Type').describe('File MIME type'),
|
||||
size: z.number().optional().title('Size').describe('File size in bytes'),
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const optionsFieldBase = baseField.extend({
|
||||
value: z.array(z.string()).nullable().optional().title('Value').describe('Selected option values'),
|
||||
options: z.array(optionSchema).optional().title('Options').describe('Available options'),
|
||||
})
|
||||
|
||||
const multiSelectField = optionsFieldBase.extend({
|
||||
type: z.literal('MULTI_SELECT').title('Type').describe('Field type'),
|
||||
})
|
||||
const dropdownField = optionsFieldBase.extend({
|
||||
type: z.literal('DROPDOWN').title('Type').describe('Field type'),
|
||||
})
|
||||
const multipleChoiceField = optionsFieldBase.extend({
|
||||
type: z.literal('MULTIPLE_CHOICE').title('Type').describe('Field type'),
|
||||
})
|
||||
const rankingField = optionsFieldBase.extend({
|
||||
type: z.literal('RANKING').title('Type').describe('Field type'),
|
||||
})
|
||||
|
||||
const checkboxesField = baseField.extend({
|
||||
type: z.literal('CHECKBOXES').title('Type').describe('Field type'),
|
||||
value: z
|
||||
.union([z.array(z.string()), z.boolean()])
|
||||
.nullable()
|
||||
.optional()
|
||||
.title('Value')
|
||||
.describe('Checkbox values'),
|
||||
options: z.array(optionSchema).optional().title('Options').describe('Available checkbox options'),
|
||||
})
|
||||
|
||||
const fileUploadField = baseField.extend({
|
||||
type: z.literal('FILE_UPLOAD').title('Type').describe('Field type'),
|
||||
value: z.array(fileSchema).nullable().optional().title('Value').describe('Uploaded files'),
|
||||
})
|
||||
const signatureField = baseField.extend({
|
||||
type: z.literal('SIGNATURE').title('Type').describe('Field type'),
|
||||
value: z.array(fileSchema).nullable().optional().title('Value').describe('Signature files'),
|
||||
})
|
||||
|
||||
const matrixField = baseField.extend({
|
||||
type: z.literal('MATRIX').title('Type').describe('Field type'),
|
||||
value: z.record(z.array(z.string())).nullable().optional().title('Value').describe('Matrix values'),
|
||||
rows: z.array(optionSchema).optional().title('Rows').describe('Matrix rows'),
|
||||
columns: z.array(optionSchema).optional().title('Columns').describe('Matrix columns'),
|
||||
})
|
||||
|
||||
const knownSpecialFieldSchema = z.discriminatedUnion('type', [
|
||||
multiSelectField,
|
||||
dropdownField,
|
||||
checkboxesField,
|
||||
multipleChoiceField,
|
||||
rankingField,
|
||||
fileUploadField,
|
||||
signatureField,
|
||||
matrixField,
|
||||
])
|
||||
|
||||
const fallbackFieldSchema = baseField
|
||||
.extend({
|
||||
value: z.any().optional().title('Value').describe('Field value'),
|
||||
options: z.any().optional().title('Options').describe('Field options'),
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
export const tallyFieldSchema = z.union([knownSpecialFieldSchema, fallbackFieldSchema])
|
||||
@@ -0,0 +1,41 @@
|
||||
import { z } from '@botpress/sdk'
|
||||
|
||||
export const listSubmissionsInputSchema = z.object({
|
||||
formId: z.string().title('Form ID').describe('Tally form ID'),
|
||||
page: z.number().int().min(1).optional().describe('Page number for pagination').title('Page'),
|
||||
filter: z.enum(['all', 'completed', 'partial']).optional().describe('Filter submissions by status').title('Filter'),
|
||||
startDate: z.string().optional().describe('Start date for filtering submissions').title('Start Date'),
|
||||
endDate: z.string().optional().describe('End date for filtering submissions').title('End Date'),
|
||||
afterId: z.string().optional().describe('ID of the submission after which to start listing').title('After ID'),
|
||||
})
|
||||
|
||||
export const listSubmissionsOuputSchema = z.object({
|
||||
questions: z
|
||||
.array(
|
||||
z.object({
|
||||
id: z.string().describe('Question ID').title('Question ID'),
|
||||
type: z.string().optional().describe('Question type').title('Type'),
|
||||
title: z.string().nullable().optional().describe('Question title').title('Title'),
|
||||
})
|
||||
)
|
||||
.describe('List of questions')
|
||||
.title('Questions'),
|
||||
submissions: z
|
||||
.array(
|
||||
z.object({
|
||||
id: z.string().describe('Submission ID').title('Submission ID'),
|
||||
responses: z
|
||||
.array(
|
||||
z.object({
|
||||
questionId: z.string().describe('Question ID').title('Question ID'),
|
||||
value: z.any().optional().describe('Response value').title('Value'),
|
||||
answer: z.any().optional().describe('Response answer').title('Answer'),
|
||||
})
|
||||
)
|
||||
.describe('List of responses for this submission')
|
||||
.title('Responses'),
|
||||
})
|
||||
)
|
||||
.describe('List of submissions')
|
||||
.title('Submissions'),
|
||||
})
|
||||
Reference in New Issue
Block a user