@throwbo/timelayer-client 3.4.3 → 3.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ export type Appointment = {
2
+ id: number;
3
+ occurrence_id: number;
4
+ token: string;
5
+ created_at: string;
6
+ updated_at: string;
7
+ expires_at: string;
8
+ };
9
+ export type CancelAppointmentRequest = {
10
+ token: string;
11
+ id: number;
12
+ occurrence_id: number;
13
+ };
@@ -0,0 +1,15 @@
1
+ type Calendar = {
2
+ id: number;
3
+ orgId: number;
4
+ title: string;
5
+ name: string;
6
+ tz: string;
7
+ color: string;
8
+ editable?: number[] | null;
9
+ viewable?: number[] | null;
10
+ event_type: number;
11
+ created_at: Date;
12
+ updated_at: Date;
13
+ created_by: number;
14
+ };
15
+ export default Calendar;
@@ -0,0 +1,29 @@
1
+ import { default as RRule } from './RRule';
2
+ import { default as EventOccurrence } from './EventOccurrence';
3
+ type CalendarEvent = {
4
+ id: number;
5
+ calendar_id: number | null;
6
+ name: string;
7
+ start_time: string | number;
8
+ end_time: string | number;
9
+ timezone: string;
10
+ created_by?: number;
11
+ updated_by?: number | null;
12
+ occurrence?: RRule | null;
13
+ occurrence_id?: number | null;
14
+ occurrences?: EventOccurrence[] | null;
15
+ event_type?: number | null;
16
+ event_nature?: string | null;
17
+ seats?: number | null;
18
+ order?: number;
19
+ description?: string | null;
20
+ location?: string | null;
21
+ color?: string;
22
+ theme?: string;
23
+ viewable?: number[] | null;
24
+ editable: number[] | null;
25
+ rsvpable: number[] | null;
26
+ groups?: string[] | null;
27
+ properties: Record<string, any> | null;
28
+ };
29
+ export default CalendarEvent;
@@ -0,0 +1,2 @@
1
+ type CalendarView = 'day' | '3day' | 'week' | 'month' | 'year' | 'list' | 'filteredList';
2
+ export default CalendarView;
@@ -0,0 +1,6 @@
1
+ type ClientEventFilter = {
2
+ field: string;
3
+ value: string | number | (string | number)[];
4
+ includeUnset?: boolean;
5
+ };
6
+ export default ClientEventFilter;
@@ -0,0 +1,5 @@
1
+ type DateRange = {
2
+ start_date: string;
3
+ end_date: string;
4
+ };
5
+ export default DateRange;
@@ -0,0 +1,37 @@
1
+ import { Appointment } from './Appointment';
2
+ import { default as CalendarEvent } from './CalendarEvent';
3
+ import { default as CalendarView } from './CalendarView';
4
+ import { default as DateRange } from './DateRange';
5
+ type EmbedEvents = {
6
+ initialized?: () => void;
7
+ tokenExpiring?: (event: {
8
+ expiresAt: number | null;
9
+ timeLeft: number;
10
+ }) => void;
11
+ tokenExpired?: (value: boolean) => void;
12
+ changedView?: (view: CalendarView) => void;
13
+ addingRecord?: (event: CalendarEvent) => void;
14
+ addedRecord?: (event: CalendarEvent) => void;
15
+ updatingRecord?: (event: CalendarEvent) => void;
16
+ updatedRecord?: (event: CalendarEvent) => void;
17
+ deletingRecord?: (event: CalendarEvent) => void;
18
+ deletedRecord?: (eventId: number) => void;
19
+ changedInterval?: (event: DateRange) => void;
20
+ selectedDate?: (event: Date) => void;
21
+ error?: (event: unknown) => void;
22
+ resize?: (width: number) => void;
23
+ requestedField?: (event: {
24
+ field: string;
25
+ }) => void;
26
+ createdAppointment?: (event: Appointment) => void;
27
+ canceledAppointment?: (event: {
28
+ occurrence_id: number;
29
+ appointment_id: number;
30
+ }) => void;
31
+ eventFormCanceled?: () => void;
32
+ firedCustomAction?: ({ action, data, }: {
33
+ action: string;
34
+ data?: unknown;
35
+ }) => void;
36
+ };
37
+ export default EmbedEvents;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Server-side filters passed to API endpoints as query parameters
3
+ */
4
+ type EmbedFilters = {
5
+ /**
6
+ * Filters for events API endpoint
7
+ * These are passed directly as query parameters to /events
8
+ * @example { event_types: ['available_demo'], calendar_id: 5 }
9
+ */
10
+ events?: Record<string, any>;
11
+ /**
12
+ * Filters for calendars API endpoint
13
+ * These are passed directly as query parameters to /calendars
14
+ */
15
+ calendars?: Record<string, any>;
16
+ };
17
+ export default EmbedFilters;
@@ -0,0 +1,7 @@
1
+ import { default as EmbedSettings } from './EmbedSettings';
2
+ type EmbedOptions = {
3
+ token: string;
4
+ container?: HTMLElement;
5
+ settings?: EmbedSettings;
6
+ };
7
+ export default EmbedOptions;
@@ -0,0 +1,17 @@
1
+ import { default as CalendarView } from './CalendarView';
2
+ import { default as ClientEventFilter } from './ClientEventFilter';
3
+ import { default as EmbedFilters } from './EmbedFilters';
4
+ import { default as FormField } from './FormField';
5
+ type EmbedSettings = {
6
+ viewMode?: CalendarView;
7
+ startOfWeek?: number;
8
+ timeFormat?: '12' | '24';
9
+ filters?: EmbedFilters;
10
+ clientFilters?: ClientEventFilter[];
11
+ readonly?: boolean;
12
+ hideHeader?: boolean;
13
+ eventFields?: FormField[];
14
+ language?: string;
15
+ baseUrl?: string;
16
+ };
17
+ export default EmbedSettings;
@@ -0,0 +1,7 @@
1
+ type EventAttendance = {
2
+ occurrence_id: number;
3
+ person_id: number;
4
+ status?: 'yes' | 'no' | 'undecided';
5
+ properties?: Record<string, any> | null;
6
+ };
7
+ export default EventAttendance;
@@ -0,0 +1,5 @@
1
+ type EventFieldUpdate = {
2
+ field: string;
3
+ value: unknown;
4
+ };
5
+ export default EventFieldUpdate;
@@ -0,0 +1,6 @@
1
+ type EventFilters = {
2
+ start_date: string;
3
+ end_date: string;
4
+ filters?: Record<string, any>;
5
+ };
6
+ export default EventFilters;
@@ -0,0 +1,23 @@
1
+ import { default as RRule } from './RRule';
2
+ type EventOccurrence = {
3
+ id: number;
4
+ event_id: number;
5
+ start_time: string | number;
6
+ end_time: string | number;
7
+ seats?: number | null;
8
+ occurrence?: RRule | null;
9
+ event_nature?: string | null;
10
+ timezone: string;
11
+ calendar_id: number | null;
12
+ name: string;
13
+ event_type?: number | null;
14
+ description?: string | null;
15
+ location?: string | null;
16
+ color?: string;
17
+ theme?: string;
18
+ rsvpable: number[] | null;
19
+ editable: number[] | null;
20
+ groups?: string[] | null;
21
+ properties: Record<string, any> | null;
22
+ };
23
+ export default EventOccurrence;
@@ -0,0 +1,19 @@
1
+ import { default as FormField } from './FormField';
2
+ type EventType = {
3
+ id: number;
4
+ org_id: number;
5
+ name: string;
6
+ title: string;
7
+ seats?: number | null;
8
+ description?: string | null;
9
+ location?: string | null;
10
+ color?: string;
11
+ order?: number | null;
12
+ created_at?: string | null;
13
+ viewable?: number[] | null;
14
+ editable?: number[] | null;
15
+ rsvpable?: number[] | null;
16
+ duration?: number | null;
17
+ fields?: FormField[];
18
+ };
19
+ export default EventType;
@@ -0,0 +1,18 @@
1
+ import { ShowIfCondition } from '../utils/eventActionsFilter';
2
+ type FormField = {
3
+ name: string;
4
+ type: string;
5
+ label: string;
6
+ color?: string;
7
+ action?: string;
8
+ default?: string | number | boolean | null;
9
+ required?: boolean;
10
+ visible?: Array<'edit' | 'view' | 'list'> | null;
11
+ hidden?: boolean;
12
+ editable?: boolean;
13
+ disabled?: boolean;
14
+ eventType?: string | string[];
15
+ showIf?: ShowIfCondition;
16
+ options?: string[] | null;
17
+ };
18
+ export default FormField;
@@ -0,0 +1,15 @@
1
+ import { default as CalendarEvent } from './CalendarEvent';
2
+ import { default as EventFieldUpdate } from './EventFieldUpdate';
3
+ type ParentEmbedEvents = {
4
+ updateEventFields: EventFieldUpdate[];
5
+ createEvent: Partial<CalendarEvent>;
6
+ updateEvent: Partial<CalendarEvent> & {
7
+ id: number;
8
+ };
9
+ removeEvent: number;
10
+ openEventForm: Partial<CalendarEvent> | undefined;
11
+ openBookingDialog: undefined;
12
+ fetchEvent: number;
13
+ selectDate: Date;
14
+ };
15
+ export default ParentEmbedEvents;
@@ -0,0 +1,11 @@
1
+ type RRule = {
2
+ freq: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY';
3
+ interval?: number;
4
+ count?: number;
5
+ until?: string | Date;
6
+ bymonth?: number[];
7
+ byday?: string[];
8
+ bymonthday?: number[];
9
+ wkst?: 'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU';
10
+ };
11
+ export default RRule;
@@ -0,0 +1,5 @@
1
+ type Role = {
2
+ id: number;
3
+ name: string;
4
+ };
5
+ export default Role;
@@ -0,0 +1,9 @@
1
+ type TimeLayerError = Error & {
2
+ /** HTTP status code. Undefined for network/transport failures — check code instead. */
3
+ statusCode?: number;
4
+ method?: string;
5
+ url?: string;
6
+ /** Axios error code, e.g. 'ERR_NETWORK', 'ECONNABORTED'. */
7
+ code?: string;
8
+ };
9
+ export default TimeLayerError;
@@ -0,0 +1,6 @@
1
+ declare enum UpdateType {
2
+ SPECIFIC = "SPECIFIC",
3
+ THIS_AND_FUTURE = "THIS_AND_FUTURE",
4
+ ALL = "ALL"
5
+ }
6
+ export default UpdateType;
@@ -0,0 +1,12 @@
1
+ type User = {
2
+ id: number;
3
+ org_id: number;
4
+ properties?: Record<string, any> | null;
5
+ role_ids?: number[] | null;
6
+ unique_id: string;
7
+ rsvp_enabled: boolean;
8
+ rsvp_list: boolean;
9
+ groups_enabled: boolean;
10
+ groups?: string[] | null;
11
+ };
12
+ export default User;
package/package.json CHANGED
@@ -1,25 +1,22 @@
1
1
  {
2
2
  "name": "@throwbo/timelayer-client",
3
- "version": "3.4.3",
3
+ "version": "3.4.5",
4
4
  "description": "A calendar SDK with Vue 3, TypeScript, and TailwindCSS.",
5
5
  "main": "dist/timelayer.es.js",
6
6
  "module": "dist/timelayer.es.js",
7
- "types": "dist/index.d.ts",
7
+ "types": "dist/timelayer.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
- "types": "./dist/index.d.ts",
10
+ "types": "./dist/timelayer.d.ts",
11
11
  "import": "./dist/timelayer.es.js"
12
12
  },
13
- "./embed": {
14
- "import": "./dist/embed.es.js"
15
- },
16
13
  "./style": "./dist/assets/timelayer.css"
17
14
  },
18
15
  "scripts": {
19
16
  "dev": "vite",
20
17
  "build": "vite build",
21
18
  "prepack": "npm run build",
22
- "lint": "eslint . --ext .ts,.vue --fix",
19
+ "lint": "eslint . --fix",
23
20
  "format": "prettier --write .",
24
21
  "type-check": "tsc --noEmit",
25
22
  "test": "vitest"
@@ -34,30 +31,34 @@
34
31
  "author": "Throwing Boulders",
35
32
  "license": "MIT",
36
33
  "devDependencies": {
34
+ "@eslint/js": "^9.39.4",
37
35
  "@types/lodash": "^4.17.24",
38
36
  "@types/sortablejs": "^1.15.9",
39
- "@typescript-eslint/eslint-plugin": "^6.0.0",
40
- "@typescript-eslint/parser": "^6.0.0",
41
- "@vitejs/plugin-vue": "^5.2.4",
42
- "autoprefixer": "^10.4.27",
43
- "eslint": "8.57.1",
44
- "eslint-config-prettier": "^9.1.0",
45
- "eslint-plugin-prettier": "^5.5.5",
46
- "eslint-plugin-tailwindcss": "^3.18.0",
47
- "eslint-plugin-vue": "^9.33.0",
48
- "jsdom": "^26.1.0",
49
- "postcss": "^8.5.8",
50
- "prettier": "^3.8.1",
37
+ "@typescript-eslint/eslint-plugin": "^8.61.1",
38
+ "@typescript-eslint/parser": "^8.61.1",
39
+ "@vitejs/plugin-vue": "^6.0.7",
40
+ "@vue/test-utils": "^2.4.11",
41
+ "autoprefixer": "^10.5.0",
42
+ "eslint": "^9.39.4",
43
+ "eslint-config-prettier": "^10.1.8",
44
+ "eslint-plugin-prettier": "^5.5.6",
45
+ "eslint-plugin-tailwindcss": "^3.18.3",
46
+ "eslint-plugin-vue": "^10.9.2",
47
+ "globals": "^17.6.0",
48
+ "jsdom": "^29.1.1",
49
+ "pinia": "^3.0.4",
50
+ "postcss": "^8.5.15",
51
+ "prettier": "^3.8.4",
51
52
  "tailwindcss": "^3.4.19",
52
53
  "typescript": "5.3.3",
53
- "vite": "^6.4.1",
54
+ "vite": "^7.3.5",
54
55
  "vite-plugin-dts": "^4.5.4",
55
56
  "vite-plugin-eslint": "^1.0.0",
56
- "vitest": "^2.1.9",
57
- "vue": "^3.5.32",
58
- "vue-router": "^4.6.4",
59
- "pinia": "^3.0.4",
60
- "vue-i18n": "^11.3.1"
57
+ "vitest": "^4.1.9",
58
+ "vue": "^3.5.38",
59
+ "vue-eslint-parser": "^10.4.1",
60
+ "vue-i18n": "^11.4.2",
61
+ "vue-router": "^4.6.4"
61
62
  },
62
63
  "peerDependencies": {
63
64
  "vue": "^3.3.0",
@@ -65,9 +66,9 @@
65
66
  },
66
67
  "files": [
67
68
  "dist/timelayer.es.js",
68
- "dist/embed.es.js",
69
69
  "dist/assets/timelayer.css",
70
- "dist/index.d.ts",
70
+ "dist/timelayer.d.ts",
71
+ "dist/types",
71
72
  "README.md",
72
73
  "LICENSE"
73
74
  ],
@@ -76,14 +77,14 @@
76
77
  "url": "https://gitlab.com/throwbo/timelayer-client.git"
77
78
  },
78
79
  "dependencies": {
79
- "axios": "1.13.6",
80
- "date-fns": "^4.1.0",
81
- "date-fns-tz": "^3.2.0",
82
80
  "@headlessui/vue": "^1.7.23",
83
81
  "@heroicons/vue": "^2.2.0",
84
82
  "@tailwindcss/forms": "^0.5.11",
85
83
  "@vuelidate/core": "^2.0.3",
86
84
  "@vuelidate/validators": "^2.0.4",
85
+ "axios": "1.18.0",
86
+ "date-fns": "^4.4.0",
87
+ "date-fns-tz": "^3.2.0",
87
88
  "lodash": "^4.18.1",
88
89
  "vue-draggable-next": "^2.3.0"
89
90
  },
@@ -91,6 +92,6 @@
91
92
  "access": "public"
92
93
  },
93
94
  "engines": {
94
- "node": ">=16.0.0"
95
+ "node": ">=20.19.0"
95
96
  }
96
97
  }
package/dist/embed.es.js DELETED
@@ -1 +0,0 @@
1
- var m=Object.defineProperty;var d=(a,e,t)=>e in a?m(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var s=(a,e,t)=>d(a,typeof e!="symbol"?e+"":e,t);const r="https://app.timelayer.io";class h{constructor({token:e,container:t,events:i={},settings:n={}}){s(this,"token");s(this,"container");s(this,"events");s(this,"settings");s(this,"iframe");s(this,"updateEventField",e=>this.sendMessageToIframe("updateEventFields",[e]));s(this,"updateEvent",e=>this.sendMessageToIframe("updateEvent",e));s(this,"createEvent",e=>this.sendMessageToIframe("createEvent",e));s(this,"removeEvent",e=>this.sendMessageToIframe("removeEvent",e));this.token=e,this.container=t,this.events=i,this.settings=n,this.iframe=null,this.createIframe(),this.setupEventListener()}getCalendarUrl(){const e=r,t=new URLSearchParams({token:this.token,settings:JSON.stringify(this.settings)});return`${e}/public?${t.toString()}`}createIframe(){this.iframe=document.createElement("iframe"),this.iframe.src=this.getCalendarUrl(),this.iframe.className="embed-iframe",this.container.appendChild(this.iframe)}setupEventListener(){window.addEventListener("message",e=>{var n,o;if(e.origin!==r)return;const{eventName:t,data:i}=e.data;t in this.events&&((o=(n=this.events)[t])==null||o.call(n,i))})}sendMessageToIframe(e,t){var i,n;(n=(i=this.iframe)==null?void 0:i.contentWindow)==null||n.postMessage({type:e,data:t},r)}openModal(){return!1}}window.Embed=h;