import { FormAudience, FormioAnswerValues } from '@features/configure-forms/form.typing'; import { TypeaheadSelectOption } from '@yourcause/common'; import { ReferenceFieldsUI } from '../ui/reference-fields.typing'; export namespace ReferenceFieldAPI { export enum DataSetCollectionType { Number = 1, Percent = 2, YesOrNo = 3 } export enum ReferenceFieldAggregateType { Sum = 1, Max = 2, Min = 3, Count = 4, Average = 5 } export enum ReferenceFieldFormattingType { NONE = 0, EMAIL = 1, TIME_24_HOUR = 2, TIME_12_HOUR = 3, EIN = 4, URL_OPT_HTTP = 5, URL_REQ_HTTP = 6 } export const ReferenceFieldFormattingValues = { EMAIL: /^\w+([\.\+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/, URL_REQ_HTTP: /^((http|https):\/\/)([\w-]+\.?)+(\.[\w-]{2,})(\/[\w-\.]+)*$/, URL_OPT_HTTP: /^((http|https):\/\/)?([\w-]+\.?)+(\.[\w-]{2,})(\/[\w-\.]+)*$/, TIME_12_HOUR: /^((1[0-2]|0?[1-9]):([0-5][0-9]) ?(AM|PM|am|pm))$/, TIME_24_HOUR: /^((0[0-9]|1[0-9]|2[0-3])|[0-23]):[0-5][0-9]$/, EIN: /^[0-9]\d(-?)\d{7}$/ }; export interface ReferenceFieldBaseModel { customDataTableGuid: string; parentReferenceFieldId: number; name: string; description: string; type: ReferenceFieldsUI.ReferenceFieldTypes; formatType?: ReferenceFieldFormattingType; key: string; supportsMultiple: boolean; categoryId: number; formAudience: FormAudience; aggregateType: ReferenceFieldAggregateType; isSingleResponse: boolean; isEncrypted: boolean; isMasked: boolean; tableAllowsImport: boolean; // Tables only isTableField: boolean; aggregateTableReferenceFieldId: number; referenceFieldTableId: number; isStandardProductField: boolean; standardComponentIsPublished: boolean; // Only used Root zone subsetCollectionType: DataSetCollectionType; } export interface TableField { referenceFieldId: number; referenceFieldName: string; label: string; isRequired: boolean; showInTable: boolean; columnOrder: number; aggregateColumnReferenceFieldId: number; } export interface ReferenceFieldDisplayModel extends ReferenceFieldBaseModel { referenceFieldId: number; formCount: number; usedOnReports: boolean; createdBy: string; createDate: string; updatedBy: string; updateDate: string; } export interface ReferenceFieldPdfData extends ReferenceFieldDisplayModel { options: TypeaheadSelectOption[]; } export interface ReferenceFieldAdHocModel extends ReferenceFieldDisplayModel { formIds: number[]; } export interface ApplicationRefFieldResponse { referenceFieldKey: string; referenceFieldId: number; value: FormioAnswerValues; numericValue: number|null; dateValue: string; currencyValue: string; file: ApplicationRefFieldFile; files: ApplicationRefFieldFile[]; applicationFormId: number; applicationId: number; } export interface ApplicationRefFieldResponseForApi { referenceFieldKey: string; referenceFieldId: number; value: FormioAnswerValues; numericValue: number|null; dateValue?: string; currencyValue: string; } export interface ApplicationRefFieldFile { fileId: number; fileName: string; value: string; } export interface TableChangeValues { values: ApplicationRefFieldResponseForApi[]; rowId: number; isNewRecord: boolean; tableReferenceFieldId: number; index: number; } export interface TableDeletion { applicationId: number; applicationFormId: number; tableReferenceFieldId: number; rowId: number; } export interface TableChangeResponse { updates: TableChangeValues[]; deletions: TableDeletion[]; } export interface TableReferenceFieldResponse extends ApplicationRefFieldResponse { tableReferenceFieldId: number; rowId: number; } export interface ExportReferenceField { id: number; name: string; description: string; type: string; key: string; formRevisionIds: number[]; customDataTableGuid: string; supportsMultiple: boolean; category: { id: number; name: string; }; formatType: ReferenceFieldFormattingType; formAudience: FormAudience; } export interface BulkCreateReferenceField { id: number; name: string; description: string; type: ReferenceFieldsUI.ReferenceFieldTypes; key: string; picklistId: number; parentReferenceFieldKey: string; supportsMultiple: boolean; formAudience: FormAudience; category: { id: number; name: string; }; aggregateType: ReferenceFieldAggregateType; singleResponse: boolean; isEncrypted: boolean; isMasked: boolean; isTableField: boolean; formatType: ReferenceFieldFormattingType; } export interface Category { id: number; name: string; formFieldCount: number; createdBy: string; createdDate: string; updatedBy: string; updatedDate: string; impersonatedBy: string; createImpersonatedBy: string; } export interface MergeFormFieldsApi { referenceFieldId1: number; referenceFieldId2: number; customDataTableGuid: string; name: string; description: string; type: ReferenceFieldsUI.ReferenceFieldTypes; key: string; supportsMultiple: boolean; categoryId: number; formAudience: FormAudience; priorityReferenceFieldId: number; } export interface ReferenceFieldDetail extends ReferenceFieldDisplayModel { forms?: { formId: number; formRevisionId: number; name: string; formRevisionVersion: number; }[]; hasTable: boolean; hasWflAutomation: boolean; hasResponses: boolean; } export interface ApplicationResponse { applicationId: number; referenceField1Response: string; referenceField2Response: string; } export interface CreateUpdateReferenceField { referenceFieldId: number; customDataTableGuid: string; tableInfo: TableInfoForCreate; name: string; description: string; type: ReferenceFieldsUI.ReferenceFieldTypes; formatType: ReferenceFieldFormattingType; key: string; supportsMultiple: boolean; categoryId: number; formAudience: FormAudience; parentReferenceFieldId: number; aggregateType: ReferenceFieldAggregateType; isSingleResponse: boolean; isEncrypted: boolean; isMasked: boolean; isTableField: boolean; aggregateTableReferenceFieldId: number; subsetCollectionType: DataSetCollectionType; } export interface TableInfoForCreate { allowImport: boolean; tableFields: TableFieldForCreate[]; } export interface TableFieldForCreate { referenceFieldId: number; isRequired: boolean; columnOrder: number; showInTable: boolean; label: string; } export interface TableResponse { rowId: number; columns: TableResponseColumn[]; } export type TableResponseColumn = ApplicationRefFieldResponse; export interface TableRowForBulkSave { referenceFieldValues: ApplicationRefFieldResponseForApi[]; rowId: number; } export interface TableUpdatesForBulkSave { applicationId: number; applicationFormId: number; tableReferenceFieldId: number; rows: TableRowForBulkSave[]; removedRows: number[]; } export interface ConvertFieldTypeAffectedAdHocFilter { reportName: string; reportDescription: string; filterType: string; filterValue: any; userSavedFilterColumnId: number; advancedFilter: boolean; reportId: number; referenceFieldId: number; columnName: string; columnDisplayName: string; } export interface ConvertFieldTypeAffectedWflAutomationRules { automationRuleSetExpressionId: number; automationRuleSetId: number; columnName: string; comparisonType: number; comparisonValue: any; name: string; description: string; applyRulesWithOr: boolean; status: number; referenceFieldId: number; } export interface ConvertFieldTypeValidationResponse { affectedAdHocFilters: ConvertFieldTypeAffectedAdHocFilter[]; affectedWflAutomationRules: ConvertFieldTypeAffectedWflAutomationRules[]; canConvert: boolean; } export interface ConvertTextToDateValidationResponse extends ConvertFieldTypeValidationResponse { invalidDateValues: InvalidDateRecord[]; } export interface InvalidDateRecord { invalidDateValue: string; formIds: number[]; applicationReferenceFieldId: number; applicationId: number; } export enum TextFieldConversionType { TEXT_AREA = 2, TEXT_FIELD = 3 } }