Skip to content

Commit 053cdfc

Browse files
authored
feat: add LocationService.createInputField method (#833)
* feat: add LocationService.createInputField method Add support for creating input fields via the public V2 API endpoint POST /input-fields. Includes a type-safe discriminated union covering all 9 input field types (TEXT, SELECT, EMAIL, PHONE_NUMBER, FIRST_NAME, LAST_NAME, URL, DATE, NUMERIC) with per-type properties. * style: format test file with prettier * refactor: split input field types into dedicated files Follow existing one-type-per-file pattern (ticket-extra-option.ts, opening-hours-time.ts, etc.) by splitting the monolithic input-field-creation-request.ts into 16 individual files. * refactor: extract LocationRef and LineRef types Replace inline { id: number } with named LocationRef and LineRef interfaces in InputFieldBase, matching the server's ref pattern. * chore: remove unnecessary UUID comments * refactor: extract shared V2_HEADERS constant and add FIRST_NAME test Move the duplicated V2 API version header into a shared v2-headers.ts module, reused by both location and ticket services. Remove unused InputFieldType. Add test for minimal FIRST_NAME field creation. * fix: address PR review feedback for createInputField Remove duplicate JSDoc from implementation function, remove V2 header implementation detail from service docs, and remove internal InputFieldBase from public API exports.
1 parent da1858b commit 053cdfc

23 files changed

Lines changed: 310 additions & 8 deletions
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { InputFieldBase } from './input-field-base.js';
2+
import { InputFieldTranslation } from './input-field-translation.js';
3+
4+
export interface DateFieldCreationRequest extends InputFieldBase {
5+
type: 'DATE';
6+
title: string;
7+
visitorFacingTitle?: string;
8+
translations?: InputFieldTranslation[];
9+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { InputFieldBase } from './input-field-base.js';
2+
3+
export interface EmailFieldCreationRequest extends InputFieldBase {
4+
type: 'EMAIL';
5+
isRequiredInAppointments: boolean;
6+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { InputFieldBase } from './input-field-base.js';
2+
3+
export interface FirstNameFieldCreationRequest extends InputFieldBase {
4+
type: 'FIRST_NAME';
5+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { LineRef } from './line-ref.js';
2+
import { LocationRef } from './location-ref.js';
3+
import { UUID } from '../uuid.js';
4+
5+
export interface InputFieldBase {
6+
id: UUID;
7+
location: LocationRef;
8+
isMandatoryBeforeAdded: boolean;
9+
isMandatoryBeforeServed: boolean;
10+
isMandatoryInRemoteSignIn: boolean;
11+
isVisibleInWaitingDrawer: boolean;
12+
isVisibleInServingDrawer: boolean;
13+
visibleForLines: LineRef[];
14+
showInRemoteSignIn: boolean;
15+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { DateFieldCreationRequest } from './date-field-creation-request.js';
2+
import { EmailFieldCreationRequest } from './email-field-creation-request.js';
3+
import { FirstNameFieldCreationRequest } from './first-name-field-creation-request.js';
4+
import { LastNameFieldCreationRequest } from './last-name-field-creation-request.js';
5+
import { NumericFieldCreationRequest } from './numeric-field-creation-request.js';
6+
import { PhoneNumberFieldCreationRequest } from './phone-number-field-creation-request.js';
7+
import { SelectFieldCreationRequest } from './select-field-creation-request.js';
8+
import { TextFieldCreationRequest } from './text-field-creation-request.js';
9+
import { UrlFieldCreationRequest } from './url-field-creation-request.js';
10+
11+
/**
12+
* A discriminated union of all input field creation request types.
13+
* The `type` field determines which properties are available.
14+
*/
15+
export type InputFieldCreationRequest =
16+
| TextFieldCreationRequest
17+
| SelectFieldCreationRequest
18+
| EmailFieldCreationRequest
19+
| PhoneNumberFieldCreationRequest
20+
| FirstNameFieldCreationRequest
21+
| LastNameFieldCreationRequest
22+
| UrlFieldCreationRequest
23+
| DateFieldCreationRequest
24+
| NumericFieldCreationRequest;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface InputFieldTranslation {
2+
languageCode: string;
3+
title?: string;
4+
visitorFacingTitle?: string;
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { InputFieldBase } from './input-field-base.js';
2+
3+
export interface LastNameFieldCreationRequest extends InputFieldBase {
4+
type: 'LAST_NAME';
5+
isRequiredInAppointments?: boolean;
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface LineRef {
2+
id: number;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface LocationRef {
2+
id: number;
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface NumericFieldConstraints {
2+
min?: number;
3+
max?: number;
4+
scale: number;
5+
}

0 commit comments

Comments
 (0)