@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.
- package/README.md +5 -0
- package/dist/assets/timelayer.css +1 -1
- package/dist/timelayer.d.ts +43 -0
- package/dist/timelayer.es.js +13 -81
- package/dist/types/Appointment.d.ts +13 -0
- package/dist/types/Calendar.d.ts +15 -0
- package/dist/types/CalendarEvent.d.ts +29 -0
- package/dist/types/CalendarView.d.ts +2 -0
- package/dist/types/ClientEventFilter.d.ts +6 -0
- package/dist/types/DateRange.d.ts +5 -0
- package/dist/types/EmbedEvents.d.ts +37 -0
- package/dist/types/EmbedFilters.d.ts +17 -0
- package/dist/types/EmbedOptions.d.ts +7 -0
- package/dist/types/EmbedSettings.d.ts +17 -0
- package/dist/types/EventAttendance.d.ts +7 -0
- package/dist/types/EventFieldUpdate.d.ts +5 -0
- package/dist/types/EventFilters.d.ts +6 -0
- package/dist/types/EventOccurrence.d.ts +23 -0
- package/dist/types/EventType.d.ts +19 -0
- package/dist/types/FormField.d.ts +18 -0
- package/dist/types/ParentEmbedEvents.d.ts +15 -0
- package/dist/types/RRule.d.ts +11 -0
- package/dist/types/Role.d.ts +5 -0
- package/dist/types/TimeLayerError.d.ts +9 -0
- package/dist/types/UpdateType.d.ts +6 -0
- package/dist/types/User.d.ts +12 -0
- package/package.json +32 -31
- package/dist/embed.es.js +0 -1
|
@@ -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,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,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,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,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,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
|
+
"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/
|
|
7
|
+
"types": "dist/timelayer.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
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 . --
|
|
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": "^
|
|
40
|
-
"@typescript-eslint/parser": "^
|
|
41
|
-
"@vitejs/plugin-vue": "^
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"eslint
|
|
45
|
-
"eslint-
|
|
46
|
-
"eslint-plugin-
|
|
47
|
-
"eslint-plugin-
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
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": "^
|
|
54
|
+
"vite": "^7.3.5",
|
|
54
55
|
"vite-plugin-dts": "^4.5.4",
|
|
55
56
|
"vite-plugin-eslint": "^1.0.0",
|
|
56
|
-
"vitest": "^
|
|
57
|
-
"vue": "^3.5.
|
|
58
|
-
"vue-
|
|
59
|
-
"
|
|
60
|
-
"vue-
|
|
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/
|
|
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": ">=
|
|
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;
|