From c9725f781bfc2bc9e745c6866804ef7a573b368f Mon Sep 17 00:00:00 2001 From: Madis Liias Date: Mon, 22 Jun 2026 14:24:27 +0200 Subject: [PATCH] feat: support attachment field creation --- .../attachment-field-constraints.ts | 20 ++++++++++ .../attachment-field-creation-request.ts | 11 ++++++ .../input-field-creation-request.ts | 4 +- .../location/location.service.spec.ts | 38 +++++++++++++++++++ .../javascript-api/src/public-api/model.ts | 2 + 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 packages/javascript-api/src/lib/model/input-field/attachment-field-constraints.ts create mode 100644 packages/javascript-api/src/lib/model/input-field/attachment-field-creation-request.ts diff --git a/packages/javascript-api/src/lib/model/input-field/attachment-field-constraints.ts b/packages/javascript-api/src/lib/model/input-field/attachment-field-constraints.ts new file mode 100644 index 00000000..a663c2bf --- /dev/null +++ b/packages/javascript-api/src/lib/model/input-field/attachment-field-constraints.ts @@ -0,0 +1,20 @@ +export interface AttachmentFieldConstraints { + maxNumberOfFiles: number; + allowedFileTypeGroups: AllowedFileTypeGroups; +} + +export interface AllowedFileTypeGroups { + mode: AllowMode; + groups?: FileTypeGroup[]; +} + +export enum AllowMode { + ALL = 'ALL', + ONLY = 'ONLY', +} + +export enum FileTypeGroup { + IMAGES = 'IMAGES', + DOCUMENTS = 'DOCUMENTS', + ARCHIVES = 'ARCHIVES', +} diff --git a/packages/javascript-api/src/lib/model/input-field/attachment-field-creation-request.ts b/packages/javascript-api/src/lib/model/input-field/attachment-field-creation-request.ts new file mode 100644 index 00000000..d292d4f7 --- /dev/null +++ b/packages/javascript-api/src/lib/model/input-field/attachment-field-creation-request.ts @@ -0,0 +1,11 @@ +import { InputFieldBase } from './input-field-base.js'; +import { InputFieldTranslation } from './input-field-translation.js'; +import { AttachmentFieldConstraints } from './attachment-field-constraints.js'; + +export interface AttachmentFieldCreationRequest extends InputFieldBase { + type: 'ATTACHMENT'; + title: string; + visitorFacingTitle?: string; + translations?: InputFieldTranslation[]; + constraints: AttachmentFieldConstraints; +} diff --git a/packages/javascript-api/src/lib/model/input-field/input-field-creation-request.ts b/packages/javascript-api/src/lib/model/input-field/input-field-creation-request.ts index d0b9dfdd..c0ac6d5f 100644 --- a/packages/javascript-api/src/lib/model/input-field/input-field-creation-request.ts +++ b/packages/javascript-api/src/lib/model/input-field/input-field-creation-request.ts @@ -7,6 +7,7 @@ import { PhoneNumberFieldCreationRequest } from './phone-number-field-creation-r import { SelectFieldCreationRequest } from './select-field-creation-request.js'; import { TextFieldCreationRequest } from './text-field-creation-request.js'; import { UrlFieldCreationRequest } from './url-field-creation-request.js'; +import { AttachmentFieldCreationRequest } from './attachment-field-creation-request'; /** * A discriminated union of all input field creation request types. @@ -21,4 +22,5 @@ export type InputFieldCreationRequest = | LastNameFieldCreationRequest | UrlFieldCreationRequest | DateFieldCreationRequest - | NumericFieldCreationRequest; + | NumericFieldCreationRequest + | AttachmentFieldCreationRequest; diff --git a/packages/javascript-api/src/lib/services/location/location.service.spec.ts b/packages/javascript-api/src/lib/services/location/location.service.spec.ts index 0154d355..3bc82078 100644 --- a/packages/javascript-api/src/lib/services/location/location.service.spec.ts +++ b/packages/javascript-api/src/lib/services/location/location.service.spec.ts @@ -3,9 +3,15 @@ import { Desk } from '../../model/desk'; import { InputFieldCreationRequest } from '../../model/input-field/input-field-creation-request'; import { FirstNameFieldCreationRequest } from '../../model/input-field/first-name-field-creation-request'; import { NumericFieldCreationRequest } from '../../model/input-field/numeric-field-creation-request'; +import { AttachmentFieldCreationRequest } from '../../model/input-field/attachment-field-creation-request'; import { SelectFieldCreationRequest } from '../../model/input-field/select-field-creation-request'; import { Qminder } from '../../qminder'; import { LocationService } from './location.service'; +import { + AllowedFileTypeGroups, + AllowMode, + FileTypeGroup, +} from '../../model/input-field/attachment-field-constraints'; describe('Location service', function () { const LOCATIONS = [ @@ -331,6 +337,38 @@ describe('Location service', function () { ).toBeTruthy(); }); + it('sends an ATTACHMENT field with constraints', async function () { + const attachmentField: AttachmentFieldCreationRequest = { + type: 'ATTACHMENT', + id: '3fcf43c4-2dc3-46bf-be7b-4e52350e2ce4 ', + location: { id: LOCATION_ID }, + title: 'Amount', + constraints: { + maxNumberOfFiles: 10, + allowedFileTypeGroups: { + mode: AllowMode.ONLY, + groups: [FileTypeGroup.IMAGES], + }, + }, + isMandatoryBeforeAdded: false, + isMandatoryBeforeServed: true, + isMandatoryInRemoteSignIn: false, + isVisibleInWaitingDrawer: false, + isVisibleInServingDrawer: true, + visibleForLines: [], + showInRemoteSignIn: false, + }; + + await LocationService.createInputField(attachmentField); + expect( + requestStub.calledWith('input-fields', { + method: 'POST', + body: JSON.stringify(attachmentField), + headers: { 'X-Qminder-API-Version': '2020-09-01' }, + }), + ).toBeTruthy(); + }); + it('sends a FIRST_NAME field with only base properties', async function () { const firstNameField: FirstNameFieldCreationRequest = { type: 'FIRST_NAME', diff --git a/packages/javascript-api/src/public-api/model.ts b/packages/javascript-api/src/public-api/model.ts index 45a378a3..72515ad4 100644 --- a/packages/javascript-api/src/public-api/model.ts +++ b/packages/javascript-api/src/public-api/model.ts @@ -55,3 +55,5 @@ export { LastNameFieldCreationRequest } from '../lib/model/input-field/last-name export { UrlFieldCreationRequest } from '../lib/model/input-field/url-field-creation-request.js'; export { DateFieldCreationRequest } from '../lib/model/input-field/date-field-creation-request.js'; export { NumericFieldCreationRequest } from '../lib/model/input-field/numeric-field-creation-request.js'; +export { AttachmentFieldConstraints } from '../lib/model/input-field/attachment-field-constraints.js'; +export { AttachmentFieldCreationRequest } from '../lib/model/input-field/attachment-field-creation-request.js';