import {z} from 'zod' export type GetApiV1OrgOrgIdAssessmentAssessmentIdFormsQuestionsArgs = {orgId: string, assessmentId: string}; export type GetApiV1OrgOrgIdAssessmentAssessmentIdFormsQuestionsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const translations = z.object({values: z.record(z.string(), z.string())}); export const formBlock = z.object({id: z.string().optional(), fieldName: z.string().optional(), type: z.enum(["QUESTION", "CONTENT"]), content: z.string().optional(), contentTr: translations.optional(), required: z.boolean().optional(), questionId: z.string().optional(), filter: z.string().optional()}); export const messageChannelConfig = z.object({channels: z.array(z.enum(["EMAIL", "CHAT", "CHAT_SLACK", "CHAT_TEAMS"])), alwaysEmail: z.boolean()}); export const autoShare = z.object({access: z.enum(["NONE", "LIMITED_READ", "LIMITED_WRITE", "STANDARD_READ", "STANDARD_WRITE", "COMPENSATION_READ", "FULL_READ", "COMP_PLANNING_PARTICIPANT", "COMPENSATION_WRITE", "WRITE", "COMPENSATION_OWNER", "OWNER"]), shareWith: z.string()}); export const formEditAccess = z.object({allow: z.enum(["ALWAYS", "WHILE_PROPOSED", "UNTIL_ACTIVE", "WHILE_ASSESSMENT_ACTIVE", "TIME_LIMIT"]).optional(), timeLimitSecs: z.number().int().optional()}); export const dueDate = z.object({type: z.enum(["EXACT", "RELATIVE"]), dueDay: z.string(), dueTime: z.string()}); export const formSignatureConfig = z.object({signers: z.array(z.string()), messageChannel: messageChannelConfig.optional(), message: z.string().optional(), dueDate: dueDate.optional(), isSkippable: z.boolean().optional(), fieldId: z.string().optional()}); export const formOptions = z.object({notifySubmitter: z.boolean().optional(), notifySubmitterManager: z.boolean().optional(), notifySelf: z.boolean().optional(), notifyManager: z.boolean().optional(), notifyUserIds: z.array(z.string()).optional(), fillValues: z.boolean().optional(), enableDraft: z.boolean().optional(), peersField: z.string().optional(), enableExport: z.boolean().optional(), timeToEdit: z.string().optional(), endDate: z.string().optional()}); export const formAiConfig = z.object({enableRead: z.boolean(), enableWrite: z.boolean(), agentUserId: z.string().optional(), instructions: z.string().optional(), label: z.string().optional(), agentSubmit: z.enum(["CHAT", "AUTO"]).optional()}); export const attribution = z.object({principalUserId: z.string().optional(), agentUserIds: z.array(z.string()).optional(), eventId: z.string().optional(), aiChatId: z.string().optional(), aiToolUseId: z.string().optional(), channel: z.enum(["WEB", "MOBILE", "SLACK", "TEAMS", "MCP"]).optional()}); export const form = z.object({id: z.string(), orgId: z.string(), label: z.string(), displayName: z.string().optional(), displayNameTr: translations.optional(), description: z.string().optional(), blocks: z.array(formBlock).optional(), status: z.enum(["ACTIVE", "INACTIVE", "ARCHIVED"]), type: z.enum(["BUILT_IN", "CUSTOM"]).optional(), targetType: z.enum(["NONE", "PERSON"]).optional(), targetFilter: z.string().optional(), submitFilter: z.string().optional(), responseReadFilter: z.string().optional(), approval: z.enum(["MANAGER", "GRAND_MANAGER"]).optional(), release: z.enum(["SUBMITTER", "ADMIN"]).optional(), releaseMessageChannel: messageChannelConfig.optional(), share: z.enum(["SUBMITTER", "ADMIN"]).optional(), shareMessageChannel: messageChannelConfig.optional(), autoShare: z.array(autoShare).optional(), autoShareMessageChannel: messageChannelConfig.optional(), submitterEdit: formEditAccess.optional(), approverEdit: formEditAccess.optional(), signature: formSignatureConfig.optional(), authorSensitive: z.enum(["ANONYMOUS", "PRIVATE", "HIGH", "MANAGER"]).optional(), options: formOptions, completeMode: z.enum(["MODAL", "FULLSCREEN"]).optional(), ai: formAiConfig.optional(), createId: z.string().optional(), createBehalfId: z.string().optional(), createAttribution: attribution.optional(), createAt: z.string().optional(), updateId: z.string().optional(), updateBehalfId: z.string().optional(), updateAttribution: attribution.optional(), updateAt: z.string().optional(), deleteId: z.string().optional(), deleteBehalfId: z.string().optional(), deleteAttribution: attribution.optional(), deleteAt: z.string().optional()}); export const enumValue = z.object({name: z.string(), label: z.string(), color: z.string().optional(), expr: z.string().optional(), num: z.number().optional(), sort: z.number().int().optional(), rank: z.number().int().optional(), id: z.string().optional(), labelTr: translations.optional()}); export const fieldOptions = z.object({min: z.string().optional(), max: z.string().optional(), minItems: z.number().int().optional(), maxItems: z.number().int().optional(), stackRank: z.boolean().optional(), step: z.number().optional(), enableEditDialog: z.boolean().optional(), requiredJobField: z.boolean().optional(), excludeTargetPersonId: z.boolean().optional(), maxLength: z.number().int().optional(), readOnly: z.boolean().optional(), includeFormer: z.boolean().optional(), groupTypeIds: z.array(z.string()).optional(), effectiveDated: z.boolean().optional(), unique: z.boolean().optional(), required: z.boolean().optional()}); export const question = z.object({id: z.string(), orgId: z.string().optional(), question: z.string(), questionTr: translations.optional(), fieldId: z.string().optional(), type: z.enum(["ADDRESS", "ALLOCATIONS", "AUDIO", "BOOLEAN", "COMP", "COMPOUND", "COMP_BAND", "CONTACTS", "CURRENCY", "DATE", "DECIMAL", "ELAPSED_DAYS", "ELAPSED_MONTHS", "ELAPSED_YEARS", "EMAIL", "ENUM", "ENUM_EXPR", "ENUM_MULTI", "ENUM_SCALE", "EXPR", "FILE", "GROUP", "GROUPS", "GROUP_ASSIGNMENTS", "GROUP_TYPE", "GROUP_POSITION_ASSIGNMENTS", "IMAGE", "INTEGER", "JOB", "JOB_CODE", "JOBS", "JOB_TIER", "LIST", "MAP", "MONEY", "NAME", "OBJECT", "PAY_INTERVAL", "PERCENT", "PERSON", "PERSONS", "PHONE", "STOCKGRANT", "STRING", "TABLE_REF", "TEXT", "TIMEOFF", "TIMESTAMP", "TRACKED_GROUP", "URL", "USER", "VARIABLE_COMP", "VARIABLE_COMPS"]), plural: z.enum(["SINGLE", "LIST", "SET"]).optional(), values: z.array(enumValue).optional(), places: z.number().int().optional(), options: fieldOptions.optional(), createId: z.string().optional(), createBehalfId: z.string().optional(), createAttribution: attribution.optional(), createAt: z.string().optional(), updateId: z.string().optional(), updateBehalfId: z.string().optional(), updateAttribution: attribution.optional(), updateAt: z.string().optional(), deleteId: z.string().optional(), deleteBehalfId: z.string().optional(), deleteAttribution: attribution.optional(), deleteAt: z.string().optional()}); export const assessmentFormsAndQuestions = z.object({forms: z.array(form), questions: z.array(question)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Return an overview of the forms and questions used in the assessment. If the user has read access to the assessment, then the forms and questions are visible, even if they would not otherwise be visible on their own * * GET /v1/org/{orgId}/assessment/{assessmentId}/forms-questions */ export const getApiV1OrgOrgIdAssessmentAssessmentIdFormsQuestions = async (args: GetApiV1OrgOrgIdAssessmentAssessmentIdFormsQuestionsArgs, options?: GetApiV1OrgOrgIdAssessmentAssessmentIdFormsQuestionsOptions) => { const {baseUrl = "https://localhost", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/org/${encodeURIComponent(String(args.orgId))}/assessment/${encodeURIComponent(String(args.assessmentId))}/forms-questions${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(assessmentFormsAndQuestions, await res.json()) };