@axis-backstage/plugin-vacation-calendar 0.5.0 → 0.7.0
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/CHANGELOG.md +45 -0
- package/dist/api/VacationCalendarApi.esm.js.map +1 -1
- package/dist/api/VacationCalendarClient.esm.js.map +1 -1
- package/dist/components/CalendarCard/CalendarCard.esm.js +137 -111
- package/dist/components/CalendarCard/CalendarCard.esm.js.map +1 -1
- package/dist/components/CalendarCard/fetch.esm.js +1 -1
- package/dist/components/CalendarCard/fetch.esm.js.map +1 -1
- package/dist/components/CalendarCard/lib.esm.js.map +1 -1
- package/dist/components/DateSelector/DateSelector.esm.js +3 -3
- package/dist/components/DateSelector/DateSelector.esm.js.map +1 -1
- package/dist/components/SignInContent/SignInContent.esm.js +15 -15
- package/dist/components/SignInContent/SignInContent.esm.js.map +1 -1
- package/dist/components/VacationCalendar.esm.js +3 -3
- package/dist/components/VacationCalendar.esm.js.map +1 -1
- package/dist/hooks/useAvailibility.esm.js.map +1 -1
- package/dist/hooks/useSignIn.esm.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/plugin.esm.js +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/package.json +28 -15
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @axis-backstage/plugin-vacation-calendar
|
|
2
|
+
|
|
3
|
+
## 0.7.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 86c01b7: Bumped to Backstage 1.40
|
|
8
|
+
|
|
9
|
+
## 0.6.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- ede8341: Updated to Backstage v1.36.1.
|
|
14
|
+
|
|
15
|
+
## 0.5.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- 6fd284d: Updated to Backstage v1.30.1.
|
|
20
|
+
|
|
21
|
+
## 0.4.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- a30ae43: Added required imports to installation guide in README.md in vacation calendar plugin.
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- 306fcb8: Add moment to dependecies in vacation-calendar package.json to resolve 'Can't resolve 'moment' in .../node_modules/react-calendar-timeline/lib/lib/items'
|
|
30
|
+
|
|
31
|
+
## 0.3.0
|
|
32
|
+
|
|
33
|
+
### Minor Changes
|
|
34
|
+
|
|
35
|
+
- 0b948ea: Generate pluginIds for plugins and bumping @backstage/cli
|
|
36
|
+
|
|
37
|
+
## 0.2.0
|
|
38
|
+
|
|
39
|
+
### Minor Changes
|
|
40
|
+
|
|
41
|
+
- e416aff: Added new plugin for displaying out-of-office events in a react-calendar-timeline. Also added support for microsoft autentication.
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- e12733a: Updated package.json to make package public and enable version packaging.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VacationCalendarApi.esm.js","sources":["../../src/api/VacationCalendarApi.ts"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\nimport type { MicrosoftCalendar, ScheduleInformation } from './types';\n\n/**\n * The apiref for the VacationCalendar plugin.\n *\n * @public\n */\nexport const vacationCalendarApiRef = createApiRef<VacationCalendarApi>({\n id: 'plugin.vacation-calendar.service',\n});\n\n/**\n * The definition for the VacationCalendar api.\n *\n * @public\n */\nexport interface VacationCalendarApi {\n /**\n * Fetches schedule items for users\n */\n getCalendars(): Promise<MicrosoftCalendar[]>;\n /**\n * Fetches Microsoft calendars\n */\n getAvailability(\n params: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n },\n headers: {\n [x: string]: any;\n },\n ): Promise<ScheduleInformation[]>;\n}\n"],"names":[],"mappings":";;AAQO,MAAM,yBAAyB,YAAkC,CAAA;AAAA,EACtE,EAAI,EAAA
|
|
1
|
+
{"version":3,"file":"VacationCalendarApi.esm.js","sources":["../../src/api/VacationCalendarApi.ts"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\nimport type { MicrosoftCalendar, ScheduleInformation } from './types';\n\n/**\n * The apiref for the VacationCalendar plugin.\n *\n * @public\n */\nexport const vacationCalendarApiRef = createApiRef<VacationCalendarApi>({\n id: 'plugin.vacation-calendar.service',\n});\n\n/**\n * The definition for the VacationCalendar api.\n *\n * @public\n */\nexport interface VacationCalendarApi {\n /**\n * Fetches schedule items for users\n */\n getCalendars(): Promise<MicrosoftCalendar[]>;\n /**\n * Fetches Microsoft calendars\n */\n getAvailability(\n params: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n },\n headers: {\n [x: string]: any;\n },\n ): Promise<ScheduleInformation[]>;\n}\n"],"names":[],"mappings":";;AAQO,MAAM,yBAAyB,YAAkC,CAAA;AAAA,EACtE,EAAI,EAAA;AACN,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VacationCalendarClient.esm.js","sources":["../../src/api/VacationCalendarClient.ts"],"sourcesContent":["import { OAuthApi, FetchApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport type { ScheduleInformation, MicrosoftCalendar } from './types';\n\nconst getAvailabilityBody = ({\n users,\n startDateTime,\n endDateTime,\n}: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n}) => ({\n Schedules: users,\n StartTime: {\n dateTime: startDateTime,\n timeZone: 'Europe/Paris',\n },\n EndTime: {\n dateTime: endDateTime,\n timeZone: 'Europe/Paris',\n },\n availabilityViewInterval: '1440',\n});\n\n/**\n * The client implementation for the frontend api.\n *\n * @public\n */\nexport class VacationCalendarApiClient {\n private readonly authApi: OAuthApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { authApi: OAuthApi; fetchApi: FetchApi }) {\n this.authApi = options.authApi;\n this.fetchApi = options.fetchApi;\n }\n\n private async get<T>(\n path: string,\n params: { [key in string]: any } = {},\n headers?: any,\n ): Promise<T> {\n const query = new URLSearchParams(params);\n const url = new URL(\n `${path}?${query.toString()}`,\n 'https://graph.microsoft.com',\n );\n const token = await this.authApi.getAccessToken();\n let temp: any = {};\n\n if (headers && typeof headers === 'object') {\n temp = {\n ...headers,\n };\n }\n\n if (token) {\n temp.Authorization = `Bearer ${token}`;\n }\n\n const response = await this.fetchApi.fetch(url.toString(), {\n headers: temp,\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n\n private async post<T>(path: string, body: any, headers?: any): Promise<T> {\n const url = new URL(path, 'https://graph.microsoft.com');\n const token = await this.authApi.getAccessToken();\n let temp: any = {};\n\n if (headers && typeof headers === 'object') {\n temp = {\n ...headers,\n };\n }\n\n if (token) {\n temp.Authorization = `Bearer ${token}`;\n }\n temp['Content-type'] = 'application/json';\n\n const response = await this.fetchApi.fetch(url.toString(), {\n method: 'POST',\n headers: temp,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Fetches Microsoft calendars\n *\n * @returns the MicrosoftValendar objects\n */\n async getCalendars(): Promise<MicrosoftCalendar[]> {\n const data = await this.get<{\n id: string;\n value: MicrosoftCalendar[];\n }>('v1.0/me/calendars');\n return data.value;\n }\n\n /**\n * Fetches schedule items for users\n *\n * @param users - list of users\n * @param startDateTime - string with start date\n * @param endDateTime - string with end date\n * @returns Microsoft ScheduleInformation items\n */\n async getAvailability(\n params: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n },\n headers: { [key in string]: any },\n ): Promise<ScheduleInformation[]> {\n const data = await this.post<{\n id: string;\n value: ScheduleInformation[];\n }>(\n `v1.0/me/calendar/getschedule`,\n getAvailabilityBody({ ...params }),\n headers,\n );\n return data.value;\n }\n}\n"],"names":[],"mappings":";;AAIA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,aAAA;AAAA,EACA
|
|
1
|
+
{"version":3,"file":"VacationCalendarClient.esm.js","sources":["../../src/api/VacationCalendarClient.ts"],"sourcesContent":["import { OAuthApi, FetchApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport type { ScheduleInformation, MicrosoftCalendar } from './types';\n\nconst getAvailabilityBody = ({\n users,\n startDateTime,\n endDateTime,\n}: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n}) => ({\n Schedules: users,\n StartTime: {\n dateTime: startDateTime,\n timeZone: 'Europe/Paris',\n },\n EndTime: {\n dateTime: endDateTime,\n timeZone: 'Europe/Paris',\n },\n availabilityViewInterval: '1440',\n});\n\n/**\n * The client implementation for the frontend api.\n *\n * @public\n */\nexport class VacationCalendarApiClient {\n private readonly authApi: OAuthApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { authApi: OAuthApi; fetchApi: FetchApi }) {\n this.authApi = options.authApi;\n this.fetchApi = options.fetchApi;\n }\n\n private async get<T>(\n path: string,\n params: { [key in string]: any } = {},\n headers?: any,\n ): Promise<T> {\n const query = new URLSearchParams(params);\n const url = new URL(\n `${path}?${query.toString()}`,\n 'https://graph.microsoft.com',\n );\n const token = await this.authApi.getAccessToken();\n let temp: any = {};\n\n if (headers && typeof headers === 'object') {\n temp = {\n ...headers,\n };\n }\n\n if (token) {\n temp.Authorization = `Bearer ${token}`;\n }\n\n const response = await this.fetchApi.fetch(url.toString(), {\n headers: temp,\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n\n private async post<T>(path: string, body: any, headers?: any): Promise<T> {\n const url = new URL(path, 'https://graph.microsoft.com');\n const token = await this.authApi.getAccessToken();\n let temp: any = {};\n\n if (headers && typeof headers === 'object') {\n temp = {\n ...headers,\n };\n }\n\n if (token) {\n temp.Authorization = `Bearer ${token}`;\n }\n temp['Content-type'] = 'application/json';\n\n const response = await this.fetchApi.fetch(url.toString(), {\n method: 'POST',\n headers: temp,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Fetches Microsoft calendars\n *\n * @returns the MicrosoftValendar objects\n */\n async getCalendars(): Promise<MicrosoftCalendar[]> {\n const data = await this.get<{\n id: string;\n value: MicrosoftCalendar[];\n }>('v1.0/me/calendars');\n return data.value;\n }\n\n /**\n * Fetches schedule items for users\n *\n * @param users - list of users\n * @param startDateTime - string with start date\n * @param endDateTime - string with end date\n * @returns Microsoft ScheduleInformation items\n */\n async getAvailability(\n params: {\n users: string[];\n startDateTime: string;\n endDateTime: string;\n },\n headers: { [key in string]: any },\n ): Promise<ScheduleInformation[]> {\n const data = await this.post<{\n id: string;\n value: ScheduleInformation[];\n }>(\n `v1.0/me/calendar/getschedule`,\n getAvailabilityBody({ ...params }),\n headers,\n );\n return data.value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
2
3
|
import useAsync from 'react-use/lib/useAsync';
|
|
3
4
|
import Timeline, { TimelineHeaders, SidebarHeader, DateHeader } from 'react-calendar-timeline';
|
|
4
5
|
import { DateTime } from 'luxon';
|
|
@@ -19,7 +20,7 @@ import Stack from '@mui/material/Stack';
|
|
|
19
20
|
|
|
20
21
|
const DEFAULT_NUM_DAYS = 60;
|
|
21
22
|
const IntervalDateHeader = (props) => {
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
23
24
|
MuiLink,
|
|
24
25
|
{
|
|
25
26
|
sx: {
|
|
@@ -36,9 +37,9 @@ const IntervalDateHeader = (props) => {
|
|
|
36
37
|
width: props?.intervalContext.interval.labelWidth,
|
|
37
38
|
left: props?.intervalContext.interval.left
|
|
38
39
|
},
|
|
39
|
-
onClick: props?.getIntervalProps().onClick
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
onClick: props?.getIntervalProps().onClick,
|
|
41
|
+
children: props?.intervalContext.intervalText
|
|
42
|
+
}
|
|
42
43
|
);
|
|
43
44
|
};
|
|
44
45
|
const CalendarCard = () => {
|
|
@@ -66,7 +67,7 @@ const CalendarCard = () => {
|
|
|
66
67
|
const groups = getGroups(availablity, isUserEntity, users);
|
|
67
68
|
const scheduleItems = getScheduleItems(availablity);
|
|
68
69
|
if (users?.length === 0) {
|
|
69
|
-
return /* @__PURE__ */
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
70
71
|
ErrorPanel,
|
|
71
72
|
{
|
|
72
73
|
title: "No users found.",
|
|
@@ -76,7 +77,7 @@ const CalendarCard = () => {
|
|
|
76
77
|
);
|
|
77
78
|
}
|
|
78
79
|
if (error instanceof Error) {
|
|
79
|
-
return /* @__PURE__ */
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
80
81
|
ErrorPanel,
|
|
81
82
|
{
|
|
82
83
|
title: "Microsoft Graph Error.",
|
|
@@ -85,118 +86,143 @@ const CalendarCard = () => {
|
|
|
85
86
|
}
|
|
86
87
|
);
|
|
87
88
|
}
|
|
88
|
-
return /* @__PURE__ */
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
89
|
+
return /* @__PURE__ */ jsxs(Content, { children: [
|
|
90
|
+
/* @__PURE__ */ jsx(ContentHeader, { title: "Out of Office Calendar", children: /* @__PURE__ */ jsx(SupportButton, { title: "Backstage Out Of Office Calendar", children: /* @__PURE__ */ jsxs(Box, { children: [
|
|
91
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: "How it works" }),
|
|
92
|
+
/* @__PURE__ */ jsx(Typography, { children: 'The "Out of Office"-calendar shows Away events. If you want your calendar events to be seen in the "Out of Office"-calendar, be sure to mark your presence as "Away" in outlook.' }),
|
|
93
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Limitations" }),
|
|
94
|
+
/* @__PURE__ */ jsxs(Typography, { children: [
|
|
95
|
+
"Due to limitations in the Microsoft Graph API the maximum range of the dates is ",
|
|
96
|
+
DEFAULT_NUM_DAYS,
|
|
97
|
+
" days."
|
|
98
|
+
] })
|
|
99
|
+
] }) }) }),
|
|
100
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
101
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", gap: 3, alignItems: "center", children: [
|
|
102
|
+
/* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
|
|
103
|
+
DateSelector,
|
|
104
|
+
{
|
|
105
|
+
onDateChange: (d) => {
|
|
106
|
+
if (d instanceof DateTime) {
|
|
107
|
+
const { days } = endDate.diff(d, "days").toObject();
|
|
108
|
+
if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {
|
|
109
|
+
setEndDate(d.endOf("day").plus({ days: DEFAULT_NUM_DAYS }));
|
|
110
|
+
}
|
|
111
|
+
setStartDate(d);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
initalDate: startDate,
|
|
115
|
+
label: "Start Date"
|
|
113
116
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
initalDate: endDate,
|
|
118
|
-
label: "End Date"
|
|
119
|
-
}
|
|
120
|
-
)), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
|
|
121
|
-
Button,
|
|
122
|
-
{
|
|
123
|
-
onClick: () => {
|
|
124
|
-
fetchNextPage();
|
|
125
|
-
},
|
|
126
|
-
disabled: showLoader || !hasNextPage,
|
|
127
|
-
variant: "contained",
|
|
128
|
-
color: "primary"
|
|
129
|
-
},
|
|
130
|
-
"Show more Users"
|
|
131
|
-
))), showLoader && /* @__PURE__ */ React.createElement(Box, { py: 2 }, /* @__PURE__ */ React.createElement(Progress, { variant: "query" })), !isSignedIn && isInitialized && /* @__PURE__ */ React.createElement(Box, { p: 1, pb: 0, minHeight: 200, maxHeight: 602, overflow: "auto" }, /* @__PURE__ */ React.createElement(SignInContent, { handleAuthClick: () => signIn(false) })), !isAvailabilityLoading && isSignedIn && /* @__PURE__ */ React.createElement(Box, { mt: 3, pb: 0, minHeight: 200, overflow: "auto" }, /* @__PURE__ */ React.createElement(
|
|
132
|
-
Timeline,
|
|
133
|
-
{
|
|
134
|
-
groups,
|
|
135
|
-
sidebarWidth: 250,
|
|
136
|
-
groupRenderer: ({ group }) => {
|
|
137
|
-
return /* @__PURE__ */ React.createElement(
|
|
138
|
-
Link,
|
|
117
|
+
) }),
|
|
118
|
+
/* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
|
|
119
|
+
DateSelector,
|
|
139
120
|
{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
paddingLeft: "4px",
|
|
150
|
-
display: "flex",
|
|
151
|
-
whiteSpace: "nowrap",
|
|
152
|
-
flexWrap: "nowrap",
|
|
153
|
-
flexDirection: "row",
|
|
154
|
-
gap: "5px"
|
|
121
|
+
onDateChange: (d) => {
|
|
122
|
+
if (d instanceof DateTime) {
|
|
123
|
+
const { days } = startDate.diff(d, "days").toObject();
|
|
124
|
+
if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {
|
|
125
|
+
setStartDate(
|
|
126
|
+
d.endOf("day").minus({ days: DEFAULT_NUM_DAYS })
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
setEndDate(d);
|
|
155
130
|
}
|
|
156
131
|
},
|
|
157
|
-
|
|
158
|
-
|
|
132
|
+
initalDate: endDate,
|
|
133
|
+
label: "End Date"
|
|
134
|
+
}
|
|
135
|
+
) }),
|
|
136
|
+
/* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
|
|
137
|
+
Button,
|
|
138
|
+
{
|
|
139
|
+
onClick: () => {
|
|
140
|
+
fetchNextPage();
|
|
141
|
+
},
|
|
142
|
+
disabled: showLoader || !hasNextPage,
|
|
143
|
+
variant: "contained",
|
|
144
|
+
color: "primary",
|
|
145
|
+
children: "Show more Users"
|
|
146
|
+
}
|
|
147
|
+
) })
|
|
148
|
+
] }),
|
|
149
|
+
showLoader && /* @__PURE__ */ jsx(Box, { py: 2, children: /* @__PURE__ */ jsx(Progress, { variant: "query" }) }),
|
|
150
|
+
!isSignedIn && isInitialized && /* @__PURE__ */ jsx(Box, { p: 1, pb: 0, minHeight: 200, maxHeight: 602, overflow: "auto", children: /* @__PURE__ */ jsx(SignInContent, { handleAuthClick: () => signIn(false) }) }),
|
|
151
|
+
!isAvailabilityLoading && isSignedIn && /* @__PURE__ */ jsx(Box, { mt: 3, pb: 0, minHeight: 200, overflow: "auto", children: /* @__PURE__ */ jsx(
|
|
152
|
+
Timeline,
|
|
153
|
+
{
|
|
154
|
+
groups,
|
|
155
|
+
sidebarWidth: 250,
|
|
156
|
+
groupRenderer: ({ group }) => {
|
|
157
|
+
return /* @__PURE__ */ jsx(
|
|
158
|
+
Link,
|
|
159
159
|
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
160
|
+
to: `/catalog/default/user/${group.entity?.metadata.name}`,
|
|
161
|
+
children: /* @__PURE__ */ jsxs(
|
|
162
|
+
"div",
|
|
163
|
+
{
|
|
164
|
+
className: "custom-group",
|
|
165
|
+
style: {
|
|
166
|
+
background: group.highlight ? "linear-gradient(90deg, #FFCC33A0, transparent 100%)" : "",
|
|
167
|
+
marginLeft: "-4px",
|
|
168
|
+
paddingLeft: "4px",
|
|
169
|
+
display: "flex",
|
|
170
|
+
whiteSpace: "nowrap",
|
|
171
|
+
flexWrap: "nowrap",
|
|
172
|
+
flexDirection: "row",
|
|
173
|
+
gap: "5px"
|
|
174
|
+
},
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
177
|
+
Avatar,
|
|
178
|
+
{
|
|
179
|
+
displayName: group.entity?.metadata.displayName,
|
|
180
|
+
picture: group.entity?.spec.profile?.picture,
|
|
181
|
+
customStyles: {
|
|
182
|
+
width: 30,
|
|
183
|
+
height: 30
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
) }),
|
|
187
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("span", { className: "title", children: group.title }) })
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
)
|
|
166
191
|
}
|
|
167
|
-
)
|
|
168
|
-
|
|
192
|
+
);
|
|
193
|
+
},
|
|
194
|
+
items: scheduleItems,
|
|
195
|
+
itemTouchSendsClick: false,
|
|
196
|
+
defaultTimeStart: startDate.toJSDate(),
|
|
197
|
+
defaultTimeEnd: endDate.toJSDate(),
|
|
198
|
+
children: /* @__PURE__ */ jsxs(
|
|
199
|
+
TimelineHeaders,
|
|
200
|
+
{
|
|
201
|
+
style: {
|
|
202
|
+
backgroundColor: "transparent",
|
|
203
|
+
color: "black",
|
|
204
|
+
position: "sticky",
|
|
205
|
+
top: "-6px"
|
|
206
|
+
},
|
|
207
|
+
children: [
|
|
208
|
+
/* @__PURE__ */ jsx(SidebarHeader, { children: ({ getRootProps }) => {
|
|
209
|
+
return /* @__PURE__ */ jsx("div", { ...getRootProps() });
|
|
210
|
+
} }),
|
|
211
|
+
/* @__PURE__ */ jsx(
|
|
212
|
+
DateHeader,
|
|
213
|
+
{
|
|
214
|
+
unit: "primaryHeader",
|
|
215
|
+
intervalRenderer: IntervalDateHeader
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
/* @__PURE__ */ jsx(DateHeader, { intervalRenderer: IntervalDateHeader })
|
|
219
|
+
]
|
|
220
|
+
}
|
|
169
221
|
)
|
|
170
|
-
);
|
|
171
|
-
},
|
|
172
|
-
items: scheduleItems,
|
|
173
|
-
itemTouchSendsClick: false,
|
|
174
|
-
defaultTimeStart: startDate.toJSDate(),
|
|
175
|
-
defaultTimeEnd: endDate.toJSDate()
|
|
176
|
-
},
|
|
177
|
-
/* @__PURE__ */ React.createElement(
|
|
178
|
-
TimelineHeaders,
|
|
179
|
-
{
|
|
180
|
-
style: {
|
|
181
|
-
backgroundColor: "transparent",
|
|
182
|
-
color: "black",
|
|
183
|
-
position: "sticky",
|
|
184
|
-
top: "-6px"
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
/* @__PURE__ */ React.createElement(SidebarHeader, null, ({ getRootProps }) => {
|
|
188
|
-
return /* @__PURE__ */ React.createElement("div", { ...getRootProps() });
|
|
189
|
-
}),
|
|
190
|
-
/* @__PURE__ */ React.createElement(
|
|
191
|
-
DateHeader,
|
|
192
|
-
{
|
|
193
|
-
unit: "primaryHeader",
|
|
194
|
-
intervalRenderer: IntervalDateHeader
|
|
195
222
|
}
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
))));
|
|
223
|
+
) })
|
|
224
|
+
] })
|
|
225
|
+
] });
|
|
200
226
|
};
|
|
201
227
|
|
|
202
228
|
export { CalendarCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarCard.esm.js","sources":["../../../src/components/CalendarCard/CalendarCard.tsx"],"sourcesContent":["import React, { ReactNode, useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport Timeline, {\n TimelineHeaders,\n SidebarHeader,\n DateHeader,\n IntervalRenderer,\n} from 'react-calendar-timeline';\nimport { DateTime } from 'luxon';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n Content,\n ContentHeader,\n SupportButton,\n Link,\n ErrorPanel,\n Progress,\n Avatar,\n} from '@backstage/core-components';\nimport { DateSelector } from '../DateSelector';\nimport { getGroups, getScheduleItems } from './lib';\nimport { fetchGroupEntities, fetchUserEntities } from './fetch';\nimport { useAvailability } from '../../hooks/useAvailibility';\nimport { useSignIn } from '../../hooks';\nimport { SignInContent } from '../SignInContent';\nimport MuiLink from '@mui/material/Link';\nimport Button from '@mui/material/Button';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport { Theme } from '@mui/material/styles';\n\nconst DEFAULT_NUM_DAYS = 60;\n\nconst IntervalDateHeader = (props?: IntervalRenderer<object>): ReactNode => {\n return (\n <MuiLink\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n borderBottom: '1px solid #bbb',\n cursor: 'pointer',\n fontSize: '14px',\n borderLeft: '2px solid #bbb',\n color: (theme: Theme) => theme.palette.text.primary,\n position: 'absolute',\n width: props?.intervalContext.interval.labelWidth,\n left: props?.intervalContext.interval.left,\n }}\n onClick={props?.getIntervalProps().onClick}\n >\n {props?.intervalContext.intervalText}\n </MuiLink>\n );\n};\n\nexport const CalendarCard = () => {\n const { entity } = useEntity();\n const catalogApi = useApi(catalogApiRef);\n\n const [startDate, setStartDate] = useState(DateTime.now());\n const [endDate, setEndDate] = useState(\n DateTime.now().endOf('day').plus({ days: DEFAULT_NUM_DAYS }),\n );\n\n const { isSignedIn, isInitialized, signIn } = useSignIn();\n\n useAsync(async () => signIn(true), [signIn]);\n\n const isUserEntity =\n entity.kind.toLowerCase() === 'user' && entity.metadata.name;\n\n const { value: users } = useAsync(async () => {\n return isUserEntity\n ? fetchUserEntities(catalogApi, entity)\n : fetchGroupEntities(catalogApi, entity);\n }, [catalogApi, entity]);\n\n const {\n availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n } = useAvailability(users, startDate, endDate, isSignedIn);\n\n const showLoader =\n isAvailabilityLoading || isAvailabilityFetching || !isInitialized;\n\n const groups = getGroups(availablity, isUserEntity, users);\n const scheduleItems = getScheduleItems(availablity);\n\n if (users?.length === 0) {\n return (\n <ErrorPanel\n title=\"No users found.\"\n defaultExpanded\n error={Error('No users found for current entity.')}\n />\n );\n }\n if (error instanceof Error) {\n return (\n <ErrorPanel\n title=\"Microsoft Graph Error.\"\n defaultExpanded\n error={error as any}\n />\n );\n }\n\n return (\n <Content>\n <ContentHeader title=\"Out of Office Calendar\">\n <SupportButton title=\"Backstage Out Of Office Calendar\">\n <Box>\n <Typography variant=\"h6\">How it works</Typography>\n <Typography>\n The \"Out of Office\"-calendar shows Away events. If you want your\n calendar events to be seen in the \"Out of Office\"-calendar, be\n sure to mark your presence as \"Away\" in outlook.\n </Typography>\n <Typography variant=\"h6\">Limitations</Typography>\n <Typography>\n Due to limitations in the Microsoft Graph API the maximum range of\n the dates is {DEFAULT_NUM_DAYS} days.\n </Typography>\n </Box>\n </SupportButton>\n </ContentHeader>\n\n <Box>\n <Stack direction=\"row\" gap={3} alignItems=\"center\">\n <Box>\n <DateSelector\n onDateChange={d => {\n if (d instanceof DateTime) {\n const { days } = endDate.diff(d, 'days').toObject();\n if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {\n setEndDate(d.endOf('day').plus({ days: DEFAULT_NUM_DAYS }));\n }\n setStartDate(d);\n }\n }}\n initalDate={startDate}\n label=\"Start Date\"\n />\n </Box>\n <Box>\n <DateSelector\n onDateChange={d => {\n if (d instanceof DateTime) {\n const { days } = startDate.diff(d, 'days').toObject();\n if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {\n setStartDate(\n d.endOf('day').minus({ days: DEFAULT_NUM_DAYS }),\n );\n }\n setEndDate(d as DateTime);\n }\n }}\n initalDate={endDate}\n label=\"End Date\"\n />\n </Box>\n <Box>\n <Button\n onClick={() => {\n fetchNextPage();\n }}\n disabled={showLoader || !hasNextPage}\n variant=\"contained\"\n color=\"primary\"\n >\n Show more Users\n </Button>\n </Box>\n </Stack>\n\n {showLoader && (\n <Box py={2}>\n <Progress variant=\"query\" />\n </Box>\n )}\n {!isSignedIn && isInitialized && (\n <Box p={1} pb={0} minHeight={200} maxHeight={602} overflow=\"auto\">\n <SignInContent handleAuthClick={() => signIn(false)} />\n </Box>\n )}\n {!isAvailabilityLoading && isSignedIn && (\n <Box mt={3} pb={0} minHeight={200} overflow=\"auto\">\n <Timeline\n groups={groups}\n sidebarWidth={250}\n groupRenderer={({ group }) => {\n return (\n <Link\n to={`/catalog/default/user/${group.entity?.metadata.name}`}\n >\n <div\n className=\"custom-group\"\n style={{\n background: group.highlight\n ? 'linear-gradient(90deg, #FFCC33A0, transparent 100%)'\n : '',\n marginLeft: '-4px',\n paddingLeft: '4px',\n display: 'flex',\n whiteSpace: 'nowrap',\n flexWrap: 'nowrap',\n flexDirection: 'row',\n gap: '5px',\n }}\n >\n <div>\n <Avatar\n displayName={\n group.entity?.metadata.displayName as string\n }\n picture={group.entity?.spec.profile?.picture}\n customStyles={{\n width: 30,\n height: 30,\n }}\n />\n </div>\n <div>\n <span className=\"title\">{group.title}</span>\n </div>\n </div>\n </Link>\n );\n }}\n items={scheduleItems as any}\n itemTouchSendsClick={false}\n defaultTimeStart={startDate.toJSDate()}\n defaultTimeEnd={endDate.toJSDate()}\n >\n <TimelineHeaders\n style={{\n backgroundColor: 'transparent',\n color: 'black',\n position: 'sticky',\n top: '-6px',\n }}\n >\n <SidebarHeader>\n {({ getRootProps }) => {\n return <div {...getRootProps()} />;\n }}\n </SidebarHeader>\n <DateHeader\n unit=\"primaryHeader\"\n intervalRenderer={IntervalDateHeader}\n />\n <DateHeader intervalRenderer={IntervalDateHeader} />\n </TimelineHeaders>\n </Timeline>\n </Box>\n )}\n </Box>\n </Content>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CalendarCard.esm.js","sources":["../../../src/components/CalendarCard/CalendarCard.tsx"],"sourcesContent":["import { ReactNode, useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport Timeline, {\n TimelineHeaders,\n SidebarHeader,\n DateHeader,\n IntervalRenderer,\n} from 'react-calendar-timeline';\nimport { DateTime } from 'luxon';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n Content,\n ContentHeader,\n SupportButton,\n Link,\n ErrorPanel,\n Progress,\n Avatar,\n} from '@backstage/core-components';\nimport { DateSelector } from '../DateSelector';\nimport { getGroups, getScheduleItems } from './lib';\nimport { fetchGroupEntities, fetchUserEntities } from './fetch';\nimport { useAvailability } from '../../hooks/useAvailibility';\nimport { useSignIn } from '../../hooks';\nimport { SignInContent } from '../SignInContent';\nimport MuiLink from '@mui/material/Link';\nimport Button from '@mui/material/Button';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport { Theme } from '@mui/material/styles';\n\nconst DEFAULT_NUM_DAYS = 60;\n\nconst IntervalDateHeader = (props?: IntervalRenderer<object>): ReactNode => {\n return (\n <MuiLink\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n borderBottom: '1px solid #bbb',\n cursor: 'pointer',\n fontSize: '14px',\n borderLeft: '2px solid #bbb',\n color: (theme: Theme) => theme.palette.text.primary,\n position: 'absolute',\n width: props?.intervalContext.interval.labelWidth,\n left: props?.intervalContext.interval.left,\n }}\n onClick={props?.getIntervalProps().onClick}\n >\n {props?.intervalContext.intervalText}\n </MuiLink>\n );\n};\n\nexport const CalendarCard = () => {\n const { entity } = useEntity();\n const catalogApi = useApi(catalogApiRef);\n\n const [startDate, setStartDate] = useState(DateTime.now());\n const [endDate, setEndDate] = useState(\n DateTime.now().endOf('day').plus({ days: DEFAULT_NUM_DAYS }),\n );\n\n const { isSignedIn, isInitialized, signIn } = useSignIn();\n\n useAsync(async () => signIn(true), [signIn]);\n\n const isUserEntity =\n entity.kind.toLowerCase() === 'user' && entity.metadata.name;\n\n const { value: users } = useAsync(async () => {\n return isUserEntity\n ? fetchUserEntities(catalogApi, entity)\n : fetchGroupEntities(catalogApi, entity);\n }, [catalogApi, entity]);\n\n const {\n availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n } = useAvailability(users, startDate, endDate, isSignedIn);\n\n const showLoader =\n isAvailabilityLoading || isAvailabilityFetching || !isInitialized;\n\n const groups = getGroups(availablity, isUserEntity, users);\n const scheduleItems = getScheduleItems(availablity);\n\n if (users?.length === 0) {\n return (\n <ErrorPanel\n title=\"No users found.\"\n defaultExpanded\n error={Error('No users found for current entity.')}\n />\n );\n }\n if (error instanceof Error) {\n return (\n <ErrorPanel\n title=\"Microsoft Graph Error.\"\n defaultExpanded\n error={error as any}\n />\n );\n }\n\n return (\n <Content>\n <ContentHeader title=\"Out of Office Calendar\">\n <SupportButton title=\"Backstage Out Of Office Calendar\">\n <Box>\n <Typography variant=\"h6\">How it works</Typography>\n <Typography>\n The \"Out of Office\"-calendar shows Away events. If you want your\n calendar events to be seen in the \"Out of Office\"-calendar, be\n sure to mark your presence as \"Away\" in outlook.\n </Typography>\n <Typography variant=\"h6\">Limitations</Typography>\n <Typography>\n Due to limitations in the Microsoft Graph API the maximum range of\n the dates is {DEFAULT_NUM_DAYS} days.\n </Typography>\n </Box>\n </SupportButton>\n </ContentHeader>\n\n <Box>\n <Stack direction=\"row\" gap={3} alignItems=\"center\">\n <Box>\n <DateSelector\n onDateChange={d => {\n if (d instanceof DateTime) {\n const { days } = endDate.diff(d, 'days').toObject();\n if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {\n setEndDate(d.endOf('day').plus({ days: DEFAULT_NUM_DAYS }));\n }\n setStartDate(d);\n }\n }}\n initalDate={startDate}\n label=\"Start Date\"\n />\n </Box>\n <Box>\n <DateSelector\n onDateChange={d => {\n if (d instanceof DateTime) {\n const { days } = startDate.diff(d, 'days').toObject();\n if (days && Math.abs(days) > DEFAULT_NUM_DAYS) {\n setStartDate(\n d.endOf('day').minus({ days: DEFAULT_NUM_DAYS }),\n );\n }\n setEndDate(d as DateTime);\n }\n }}\n initalDate={endDate}\n label=\"End Date\"\n />\n </Box>\n <Box>\n <Button\n onClick={() => {\n fetchNextPage();\n }}\n disabled={showLoader || !hasNextPage}\n variant=\"contained\"\n color=\"primary\"\n >\n Show more Users\n </Button>\n </Box>\n </Stack>\n\n {showLoader && (\n <Box py={2}>\n <Progress variant=\"query\" />\n </Box>\n )}\n {!isSignedIn && isInitialized && (\n <Box p={1} pb={0} minHeight={200} maxHeight={602} overflow=\"auto\">\n <SignInContent handleAuthClick={() => signIn(false)} />\n </Box>\n )}\n {!isAvailabilityLoading && isSignedIn && (\n <Box mt={3} pb={0} minHeight={200} overflow=\"auto\">\n <Timeline\n groups={groups}\n sidebarWidth={250}\n groupRenderer={({ group }) => {\n return (\n <Link\n to={`/catalog/default/user/${group.entity?.metadata.name}`}\n >\n <div\n className=\"custom-group\"\n style={{\n background: group.highlight\n ? 'linear-gradient(90deg, #FFCC33A0, transparent 100%)'\n : '',\n marginLeft: '-4px',\n paddingLeft: '4px',\n display: 'flex',\n whiteSpace: 'nowrap',\n flexWrap: 'nowrap',\n flexDirection: 'row',\n gap: '5px',\n }}\n >\n <div>\n <Avatar\n displayName={\n group.entity?.metadata.displayName as string\n }\n picture={group.entity?.spec.profile?.picture}\n customStyles={{\n width: 30,\n height: 30,\n }}\n />\n </div>\n <div>\n <span className=\"title\">{group.title}</span>\n </div>\n </div>\n </Link>\n );\n }}\n items={scheduleItems as any}\n itemTouchSendsClick={false}\n defaultTimeStart={startDate.toJSDate()}\n defaultTimeEnd={endDate.toJSDate()}\n >\n <TimelineHeaders\n style={{\n backgroundColor: 'transparent',\n color: 'black',\n position: 'sticky',\n top: '-6px',\n }}\n >\n <SidebarHeader>\n {({ getRootProps }) => {\n return <div {...getRootProps()} />;\n }}\n </SidebarHeader>\n <DateHeader\n unit=\"primaryHeader\"\n intervalRenderer={IntervalDateHeader}\n />\n <DateHeader intervalRenderer={IntervalDateHeader} />\n </TimelineHeaders>\n </Timeline>\n </Box>\n )}\n </Box>\n </Content>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.esm.js","sources":["../../../src/components/CalendarCard/fetch.ts"],"sourcesContent":["import {\n DEFAULT_NAMESPACE,\n Entity,\n UserEntity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/plugin-catalog-react';\n\nconst MANAGER_ANNOTATION = 'manager';\n\nexport const fetchUserEntities = async (\n catalogApi: CatalogApi,\n entity: Entity,\n) => {\n if (!entity.metadata?.annotations?.[MANAGER_ANNOTATION]) {\n return [entity as UserEntity];\n }\n\n const filter = {\n kind: 'User',\n [`metadata.annotations.${MANAGER_ANNOTATION}`]:\n entity.metadata.annotations[MANAGER_ANNOTATION],\n };\n\n const { items } = await catalogApi.getEntities({ filter });\n return items as UserEntity[];\n};\n\nexport const fetchGroupEntities = async (\n catalogApi: CatalogApi,\n entity: Entity,\n) => {\n const {\n metadata: { name: groupName, namespace = DEFAULT_NAMESPACE },\n } = entity;\n\n const filter = {\n kind: 'User',\n 'relations.memberof': [\n stringifyEntityRef({\n kind: 'group',\n namespace: namespace.toLocaleLowerCase('en-US'),\n name: groupName.toLocaleLowerCase('en-US'),\n }),\n ],\n };\n\n return (await catalogApi.getEntities({ filter })).items as UserEntity[];\n};\n"],"names":[],"mappings":";;AAQA,MAAM,kBAAqB,GAAA,SAAA
|
|
1
|
+
{"version":3,"file":"fetch.esm.js","sources":["../../../src/components/CalendarCard/fetch.ts"],"sourcesContent":["import {\n DEFAULT_NAMESPACE,\n Entity,\n UserEntity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/plugin-catalog-react';\n\nconst MANAGER_ANNOTATION = 'manager';\n\nexport const fetchUserEntities = async (\n catalogApi: CatalogApi,\n entity: Entity,\n) => {\n if (!entity.metadata?.annotations?.[MANAGER_ANNOTATION]) {\n return [entity as UserEntity];\n }\n\n const filter = {\n kind: 'User',\n [`metadata.annotations.${MANAGER_ANNOTATION}`]:\n entity.metadata.annotations[MANAGER_ANNOTATION],\n };\n\n const { items } = await catalogApi.getEntities({ filter });\n return items as UserEntity[];\n};\n\nexport const fetchGroupEntities = async (\n catalogApi: CatalogApi,\n entity: Entity,\n) => {\n const {\n metadata: { name: groupName, namespace = DEFAULT_NAMESPACE },\n } = entity;\n\n const filter = {\n kind: 'User',\n 'relations.memberof': [\n stringifyEntityRef({\n kind: 'group',\n namespace: namespace.toLocaleLowerCase('en-US'),\n name: groupName.toLocaleLowerCase('en-US'),\n }),\n ],\n };\n\n return (await catalogApi.getEntities({ filter })).items as UserEntity[];\n};\n"],"names":[],"mappings":";;AAQA,MAAM,kBAAqB,GAAA,SAAA;AAEd,MAAA,iBAAA,GAAoB,OAC/B,UAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,CAAC,MAAA,CAAO,QAAU,EAAA,WAAA,GAAc,kBAAkB,CAAG,EAAA;AACvD,IAAA,OAAO,CAAC,MAAoB,CAAA;AAAA;AAG9B,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,IAAM,EAAA,MAAA;AAAA,IACN,CAAC,wBAAwB,kBAAkB,CAAA,CAAE,GAC3C,MAAO,CAAA,QAAA,CAAS,YAAY,kBAAkB;AAAA,GAClD;AAEA,EAAM,MAAA,EAAE,OAAU,GAAA,MAAM,WAAW,WAAY,CAAA,EAAE,QAAQ,CAAA;AACzD,EAAO,OAAA,KAAA;AACT;AAEa,MAAA,kBAAA,GAAqB,OAChC,UAAA,EACA,MACG,KAAA;AACH,EAAM,MAAA;AAAA,IACJ,QAAU,EAAA,EAAE,IAAM,EAAA,SAAA,EAAW,YAAY,iBAAkB;AAAA,GACzD,GAAA,MAAA;AAEJ,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,IAAM,EAAA,MAAA;AAAA,IACN,oBAAsB,EAAA;AAAA,MACpB,kBAAmB,CAAA;AAAA,QACjB,IAAM,EAAA,OAAA;AAAA,QACN,SAAA,EAAW,SAAU,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QAC9C,IAAA,EAAM,SAAU,CAAA,iBAAA,CAAkB,OAAO;AAAA,OAC1C;AAAA;AACH,GACF;AAEA,EAAA,OAAA,CAAQ,MAAM,UAAW,CAAA,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAG,EAAA,KAAA;AACpD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.esm.js","sources":["../../../src/components/CalendarCard/lib.ts"],"sourcesContent":["import { TimelineItemBase } from 'react-calendar-timeline';\nimport { UserEntity, UserEntityV1alpha1 } from '@backstage/catalog-model';\nimport { ScheduleInformation } from '@microsoft/microsoft-graph-types';\nimport { InfiniteData } from '@tanstack/react-query';\nimport { head } from 'lodash';\nimport { DateTime } from 'luxon';\n\nconst isTimeLineItem = (\n item: TimelineItemBase<any> | undefined,\n): item is TimelineItemBase<any> => {\n return item !== undefined;\n};\n\nconst getFullName = (users: UserEntity[], userId: string) => {\n const name = head(userId.split('@'));\n const user = users.find(u => u.metadata.name === name);\n\n if (user) return user.spec.profile?.displayName;\n return userId;\n};\n\nconst getUser = (users: UserEntity[], userId: string) => {\n const name = head(userId.split('@'));\n const user = users.find(u => u.metadata.name === name);\n\n return user;\n};\n\nexport const getScheduleItems = (\n availablity: InfiniteData<ScheduleInformation[]> | undefined,\n) => {\n return availablity\n ? availablity?.pages\n .flatMap(p => p)\n // @ts-ignore\n .flatMap((a, i) =>\n // @ts-ignore\n a.scheduleItems\n // @ts-ignore\n ?.filter(scheduleItem => scheduleItem.status === 'oof')\n // @ts-ignore\n .map(s => ({\n id: Date.now().toString(36) + Math.random().toString(36).slice(2),\n group: i,\n start_time: DateTime.fromISO(s.start?.dateTime!),\n end_time: DateTime.fromISO(s.end?.dateTime!),\n canMove: false,\n canResize: false,\n })),\n )\n .filter(isTimeLineItem)\n : [];\n};\n\nexport const getGroups = (\n availablity: InfiniteData<ScheduleInformation[]> | undefined,\n isUserEntity: string | false,\n users: UserEntityV1alpha1[] | undefined,\n) => {\n return availablity\n ? availablity.pages\n .flatMap(p => p)\n .map((a, i) => ({\n id: i,\n // @ts-ignore\n highlight:\n isUserEntity &&\n a.scheduleId &&\n isUserEntity === head(a.scheduleId.split('@')),\n title: getFullName(users || [], a.scheduleId || ''),\n entity: getUser(users || [], a.scheduleId || ''),\n height: 30,\n }))\n : [];\n};\n"],"names":[],"mappings":";;;AAOA,MAAM,cAAA,GAAiB,CACrB,IACkC,KAAA;AAClC,EAAA,OAAO,IAAS,KAAA,
|
|
1
|
+
{"version":3,"file":"lib.esm.js","sources":["../../../src/components/CalendarCard/lib.ts"],"sourcesContent":["import { TimelineItemBase } from 'react-calendar-timeline';\nimport { UserEntity, UserEntityV1alpha1 } from '@backstage/catalog-model';\nimport { ScheduleInformation } from '@microsoft/microsoft-graph-types';\nimport { InfiniteData } from '@tanstack/react-query';\nimport { head } from 'lodash';\nimport { DateTime } from 'luxon';\n\nconst isTimeLineItem = (\n item: TimelineItemBase<any> | undefined,\n): item is TimelineItemBase<any> => {\n return item !== undefined;\n};\n\nconst getFullName = (users: UserEntity[], userId: string) => {\n const name = head(userId.split('@'));\n const user = users.find(u => u.metadata.name === name);\n\n if (user) return user.spec.profile?.displayName;\n return userId;\n};\n\nconst getUser = (users: UserEntity[], userId: string) => {\n const name = head(userId.split('@'));\n const user = users.find(u => u.metadata.name === name);\n\n return user;\n};\n\nexport const getScheduleItems = (\n availablity: InfiniteData<ScheduleInformation[]> | undefined,\n) => {\n return availablity\n ? availablity?.pages\n .flatMap(p => p)\n // @ts-ignore\n .flatMap((a, i) =>\n // @ts-ignore\n a.scheduleItems\n // @ts-ignore\n ?.filter(scheduleItem => scheduleItem.status === 'oof')\n // @ts-ignore\n .map(s => ({\n id: Date.now().toString(36) + Math.random().toString(36).slice(2),\n group: i,\n start_time: DateTime.fromISO(s.start?.dateTime!),\n end_time: DateTime.fromISO(s.end?.dateTime!),\n canMove: false,\n canResize: false,\n })),\n )\n .filter(isTimeLineItem)\n : [];\n};\n\nexport const getGroups = (\n availablity: InfiniteData<ScheduleInformation[]> | undefined,\n isUserEntity: string | false,\n users: UserEntityV1alpha1[] | undefined,\n) => {\n return availablity\n ? availablity.pages\n .flatMap(p => p)\n .map((a, i) => ({\n id: i,\n // @ts-ignore\n highlight:\n isUserEntity &&\n a.scheduleId &&\n isUserEntity === head(a.scheduleId.split('@')),\n title: getFullName(users || [], a.scheduleId || ''),\n entity: getUser(users || [], a.scheduleId || ''),\n height: 30,\n }))\n : [];\n};\n"],"names":[],"mappings":";;;AAOA,MAAM,cAAA,GAAiB,CACrB,IACkC,KAAA;AAClC,EAAA,OAAO,IAAS,KAAA,MAAA;AAClB,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAqB,MAAmB,KAAA;AAC3D,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AACnC,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AAErD,EAAA,IAAI,IAAM,EAAA,OAAO,IAAK,CAAA,IAAA,CAAK,OAAS,EAAA,WAAA;AACpC,EAAO,OAAA,MAAA;AACT,CAAA;AAEA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAqB,MAAmB,KAAA;AACvD,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AACnC,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AAErD,EAAO,OAAA,IAAA;AACT,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAC9B,WACG,KAAA;AACH,EAAA,OAAO,cACH,WAAa,EAAA,KAAA,CACV,OAAQ,CAAA,CAAA,CAAA,KAAK,CAAC,CAEd,CAAA,OAAA;AAAA,IAAQ,CAAC,CAAG,EAAA,CAAA;AAAA;AAAA,MAEX,CAAA,CAAE,eAEE,MAAO,CAAA,CAAA,YAAA,KAAgB,aAAa,MAAW,KAAA,KAAK,CAErD,CAAA,GAAA,CAAI,CAAM,CAAA,MAAA;AAAA,QACT,EAAI,EAAA,IAAA,CAAK,GAAI,EAAA,CAAE,SAAS,EAAE,CAAA,GAAI,IAAK,CAAA,MAAA,EAAS,CAAA,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QAChE,KAAO,EAAA,CAAA;AAAA,QACP,UAAY,EAAA,QAAA,CAAS,OAAQ,CAAA,CAAA,CAAE,OAAO,QAAS,CAAA;AAAA,QAC/C,QAAU,EAAA,QAAA,CAAS,OAAQ,CAAA,CAAA,CAAE,KAAK,QAAS,CAAA;AAAA,QAC3C,OAAS,EAAA,KAAA;AAAA,QACT,SAAW,EAAA;AAAA,OACX,CAAA;AAAA;AAAA,GAEL,CAAA,MAAA,CAAO,cAAc,CAAA,GACxB,EAAC;AACP;AAEO,MAAM,SAAY,GAAA,CACvB,WACA,EAAA,YAAA,EACA,KACG,KAAA;AACH,EAAO,OAAA,WAAA,GACH,WAAY,CAAA,KAAA,CACT,OAAQ,CAAA,CAAA,CAAA,KAAK,CAAC,CACd,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAO,MAAA;AAAA,IACd,EAAI,EAAA,CAAA;AAAA;AAAA,IAEJ,SAAA,EACE,YACA,IAAA,CAAA,CAAE,UACF,IAAA,YAAA,KAAiB,KAAK,CAAE,CAAA,UAAA,CAAW,KAAM,CAAA,GAAG,CAAC,CAAA;AAAA,IAC/C,OAAO,WAAY,CAAA,KAAA,IAAS,EAAI,EAAA,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,IAClD,QAAQ,OAAQ,CAAA,KAAA,IAAS,EAAI,EAAA,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,IAC/C,MAAQ,EAAA;AAAA,GACV,CAAE,IACJ,EAAC;AACP;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { AdapterLuxon } from '@mui/x-date-pickers/AdapterLuxon';
|
|
3
3
|
import FormControl from '@mui/material/FormControl';
|
|
4
4
|
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
|
|
@@ -9,7 +9,7 @@ const DateSelector = ({
|
|
|
9
9
|
initalDate,
|
|
10
10
|
onDateChange
|
|
11
11
|
}) => {
|
|
12
|
-
return /* @__PURE__ */
|
|
12
|
+
return /* @__PURE__ */ jsx(FormControl, { variant: "standard", children: /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterLuxon, children: /* @__PURE__ */ jsx(
|
|
13
13
|
DesktopDatePicker,
|
|
14
14
|
{
|
|
15
15
|
format: "yyyy-MM-dd",
|
|
@@ -18,7 +18,7 @@ const DateSelector = ({
|
|
|
18
18
|
defaultValue: initalDate,
|
|
19
19
|
onChange: onDateChange
|
|
20
20
|
}
|
|
21
|
-
)));
|
|
21
|
+
) }) });
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
export { DateSelector };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateSelector.esm.js","sources":["../../../src/components/DateSelector/DateSelector.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"DateSelector.esm.js","sources":["../../../src/components/DateSelector/DateSelector.tsx"],"sourcesContent":["import { DateTime } from 'luxon/src/datetime';\nimport { AdapterLuxon } from '@mui/x-date-pickers/AdapterLuxon';\nimport FormControl from '@mui/material/FormControl';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';\n\ntype DateSelectorProps = {\n label: string;\n initalDate: DateTime;\n onDateChange: (date: DateTime | null | string | undefined) => void;\n};\n\nexport const DateSelector = ({\n label,\n initalDate,\n onDateChange,\n}: DateSelectorProps) => {\n return (\n <FormControl variant=\"standard\">\n <LocalizationProvider dateAdapter={AdapterLuxon}>\n <DesktopDatePicker\n format=\"yyyy-MM-dd\"\n label={label}\n value={initalDate}\n defaultValue={initalDate}\n onChange={onDateChange}\n />\n </LocalizationProvider>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;AAYO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAyB,KAAA;AACvB,EAAA,2BACG,WAAY,EAAA,EAAA,OAAA,EAAQ,YACnB,QAAC,kBAAA,GAAA,CAAA,oBAAA,EAAA,EAAqB,aAAa,YACjC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,YAAA;AAAA,MACP,KAAA;AAAA,MACA,KAAO,EAAA,UAAA;AAAA,MACP,YAAc,EAAA,UAAA;AAAA,MACd,QAAU,EAAA;AAAA;AAAA,KAEd,CACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import Box from '@mui/material/Box';
|
|
3
3
|
import Button from '@mui/material/Button';
|
|
4
4
|
|
|
5
5
|
const SignInContent = ({ handleAuthClick }) => {
|
|
6
|
-
return /* @__PURE__ */
|
|
6
|
+
return /* @__PURE__ */ jsx(Box, { position: "relative", height: "100%", width: "100%", children: /* @__PURE__ */ jsx(
|
|
7
7
|
Box,
|
|
8
8
|
{
|
|
9
9
|
height: "100%",
|
|
@@ -14,19 +14,19 @@ const SignInContent = ({ handleAuthClick }) => {
|
|
|
14
14
|
position: "absolute",
|
|
15
15
|
p: 10,
|
|
16
16
|
left: 0,
|
|
17
|
-
top: 0
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
));
|
|
17
|
+
top: 0,
|
|
18
|
+
children: /* @__PURE__ */ jsx(
|
|
19
|
+
Button,
|
|
20
|
+
{
|
|
21
|
+
variant: "contained",
|
|
22
|
+
color: "primary",
|
|
23
|
+
onClick: handleAuthClick,
|
|
24
|
+
size: "large",
|
|
25
|
+
children: "Sign in"
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
) });
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
export { SignInContent };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInContent.esm.js","sources":["../../../src/components/SignInContent/SignInContent.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"SignInContent.esm.js","sources":["../../../src/components/SignInContent/SignInContent.tsx"],"sourcesContent":["import Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\n\ntype Props = {\n handleAuthClick: React.MouseEventHandler<HTMLElement>;\n};\n\nexport const SignInContent = ({ handleAuthClick }: Props) => {\n return (\n <Box position=\"relative\" height=\"100%\" width=\"100%\">\n <Box\n height=\"100%\"\n width=\"80%\"\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n position=\"absolute\"\n p={10}\n left={0}\n top={0}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleAuthClick}\n size=\"large\"\n >\n Sign in\n </Button>\n </Box>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;AAOO,MAAM,aAAgB,GAAA,CAAC,EAAE,eAAA,EAA6B,KAAA;AAC3D,EAAA,2BACG,GAAI,EAAA,EAAA,QAAA,EAAS,YAAW,MAAO,EAAA,MAAA,EAAO,OAAM,MAC3C,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,MAAA;AAAA,MACP,KAAM,EAAA,KAAA;AAAA,MACN,OAAQ,EAAA,MAAA;AAAA,MACR,cAAe,EAAA,QAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,QAAS,EAAA,UAAA;AAAA,MACT,CAAG,EAAA,EAAA;AAAA,MACH,IAAM,EAAA,CAAA;AAAA,MACN,GAAK,EAAA,CAAA;AAAA,MAEL,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,WAAA;AAAA,UACR,KAAM,EAAA,SAAA;AAAA,UACN,OAAS,EAAA,eAAA;AAAA,UACT,IAAK,EAAA,OAAA;AAAA,UACN,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
|
|
3
3
|
import { CalendarCard } from './CalendarCard/CalendarCard.esm.js';
|
|
4
4
|
|
|
5
5
|
const queryClient = new QueryClient();
|
|
6
6
|
const VacationCalendar = () => {
|
|
7
|
-
return /* @__PURE__ */
|
|
7
|
+
return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(CalendarCard, {}) });
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
export { VacationCalendar };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VacationCalendar.esm.js","sources":["../../src/components/VacationCalendar.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"VacationCalendar.esm.js","sources":["../../src/components/VacationCalendar.tsx"],"sourcesContent":["import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { CalendarCard } from './CalendarCard';\n\nconst queryClient = new QueryClient();\n\nexport const VacationCalendar = () => {\n return (\n <QueryClientProvider client={queryClient}>\n <CalendarCard />\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":";;;;AAGA,MAAM,WAAA,GAAc,IAAI,WAAY,EAAA;AAE7B,MAAM,mBAAmB,MAAM;AACpC,EAAA,2BACG,mBAAoB,EAAA,EAAA,MAAA,EAAQ,WAC3B,EAAA,QAAA,kBAAA,GAAA,CAAC,gBAAa,CAChB,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAvailibility.esm.js","sources":["../../src/hooks/useAvailibility.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport { UserEntityV1alpha1 } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { slice } from 'lodash';\nimport { DateTime } from 'luxon';\nimport { vacationCalendarApiRef } from '../api';\n\nconst PAGE_SIZE = 20;\n\nexport const useAvailability = (\n users: UserEntityV1alpha1[] | undefined,\n startDate: DateTime<true>,\n endDate: DateTime<true>,\n isSignedIn: boolean,\n) => {\n const calendarApi = useApi(vacationCalendarApiRef);\n const {\n data: availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n } = useInfiniteQuery({\n queryFn: ({ pageParam = 0 }) => {\n const currentUsers = slice(users || [], pageParam, pageParam + PAGE_SIZE);\n\n return calendarApi.getAvailability(\n {\n users: currentUsers?.map(u => u.spec.profile?.email ?? '') || [],\n startDateTime: startDate.toISO(),\n endDateTime: endDate.toISO(),\n },\n {\n Prefer: 'outlook.timezone=\"Europe/Stockholm\"',\n },\n );\n },\n queryKey: [\n 'calendarAvailability',\n users,\n startDate.toISO(),\n endDate.toISO(),\n ],\n getNextPageParam: (_, allPages) => {\n const numberOfUsers = allPages.flatMap(p => p).length;\n if (numberOfUsers === users?.length) {\n return undefined;\n }\n // This will be starting index to fetch the next batch.\n return numberOfUsers;\n },\n cacheTime: 30000 * 1000,\n enabled: isSignedIn && startDate.isValid && endDate.isValid && !!users,\n retry: false,\n refetchInterval: 30000 * 1000,\n refetchIntervalInBackground: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n });\n return {\n availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n };\n};\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,SAAY,GAAA,EAAA
|
|
1
|
+
{"version":3,"file":"useAvailibility.esm.js","sources":["../../src/hooks/useAvailibility.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport { UserEntityV1alpha1 } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { slice } from 'lodash';\nimport { DateTime } from 'luxon';\nimport { vacationCalendarApiRef } from '../api';\n\nconst PAGE_SIZE = 20;\n\nexport const useAvailability = (\n users: UserEntityV1alpha1[] | undefined,\n startDate: DateTime<true>,\n endDate: DateTime<true>,\n isSignedIn: boolean,\n) => {\n const calendarApi = useApi(vacationCalendarApiRef);\n const {\n data: availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n } = useInfiniteQuery({\n queryFn: ({ pageParam = 0 }) => {\n const currentUsers = slice(users || [], pageParam, pageParam + PAGE_SIZE);\n\n return calendarApi.getAvailability(\n {\n users: currentUsers?.map(u => u.spec.profile?.email ?? '') || [],\n startDateTime: startDate.toISO(),\n endDateTime: endDate.toISO(),\n },\n {\n Prefer: 'outlook.timezone=\"Europe/Stockholm\"',\n },\n );\n },\n queryKey: [\n 'calendarAvailability',\n users,\n startDate.toISO(),\n endDate.toISO(),\n ],\n getNextPageParam: (_, allPages) => {\n const numberOfUsers = allPages.flatMap(p => p).length;\n if (numberOfUsers === users?.length) {\n return undefined;\n }\n // This will be starting index to fetch the next batch.\n return numberOfUsers;\n },\n cacheTime: 30000 * 1000,\n enabled: isSignedIn && startDate.isValid && endDate.isValid && !!users,\n retry: false,\n refetchInterval: 30000 * 1000,\n refetchIntervalInBackground: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n });\n return {\n availablity,\n error,\n isLoading: isAvailabilityLoading,\n isFetching: isAvailabilityFetching,\n hasNextPage,\n fetchNextPage,\n };\n};\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,SAAY,GAAA,EAAA;AAEX,MAAM,eAAkB,GAAA,CAC7B,KACA,EAAA,SAAA,EACA,SACA,UACG,KAAA;AACH,EAAM,MAAA,WAAA,GAAc,OAAO,sBAAsB,CAAA;AACjD,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA,WAAA;AAAA,IACN,KAAA;AAAA,IACA,SAAW,EAAA,qBAAA;AAAA,IACX,UAAY,EAAA,sBAAA;AAAA,IACZ,WAAA;AAAA,IACA;AAAA,MACE,gBAAiB,CAAA;AAAA,IACnB,OAAS,EAAA,CAAC,EAAE,SAAA,GAAY,GAAQ,KAAA;AAC9B,MAAA,MAAM,eAAe,KAAM,CAAA,KAAA,IAAS,EAAI,EAAA,SAAA,EAAW,YAAY,SAAS,CAAA;AAExE,MAAA,OAAO,WAAY,CAAA,eAAA;AAAA,QACjB;AAAA,UACE,KAAA,EAAO,YAAc,EAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,KAAK,OAAS,EAAA,KAAA,IAAS,EAAE,CAAA,IAAK,EAAC;AAAA,UAC/D,aAAA,EAAe,UAAU,KAAM,EAAA;AAAA,UAC/B,WAAA,EAAa,QAAQ,KAAM;AAAA,SAC7B;AAAA,QACA;AAAA,UACE,MAAQ,EAAA;AAAA;AACV,OACF;AAAA,KACF;AAAA,IACA,QAAU,EAAA;AAAA,MACR,sBAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,KAAM,EAAA;AAAA,MAChB,QAAQ,KAAM;AAAA,KAChB;AAAA,IACA,gBAAA,EAAkB,CAAC,CAAA,EAAG,QAAa,KAAA;AACjC,MAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,OAAQ,CAAA,CAAA,CAAA,KAAK,CAAC,CAAE,CAAA,MAAA;AAC/C,MAAI,IAAA,aAAA,KAAkB,OAAO,MAAQ,EAAA;AACnC,QAAO,OAAA,MAAA;AAAA;AAGT,MAAO,OAAA,aAAA;AAAA,KACT;AAAA,IACA,WAAW,GAAQ,GAAA,GAAA;AAAA,IACnB,SAAS,UAAc,IAAA,SAAA,CAAU,WAAW,OAAQ,CAAA,OAAA,IAAW,CAAC,CAAC,KAAA;AAAA,IACjE,KAAO,EAAA,KAAA;AAAA,IACP,iBAAiB,GAAQ,GAAA,GAAA;AAAA,IACzB,2BAA6B,EAAA,KAAA;AAAA,IAC7B,oBAAsB,EAAA,KAAA;AAAA,IACtB,kBAAoB,EAAA;AAAA,GACrB,CAAA;AACD,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAW,EAAA,qBAAA;AAAA,IACX,UAAY,EAAA,sBAAA;AAAA,IACZ,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSignIn.esm.js","sources":["../../src/hooks/useSignIn.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { microsoftAuthApiRef, useApi } from '@backstage/core-plugin-api';\n\nexport const useSignIn = () => {\n const [isSignedIn, setSignedIn] = useState(false);\n const [isInitialized, setInitialized] = useState(false);\n const authApi = useApi(microsoftAuthApiRef);\n\n const signIn = useCallback(\n async (optional = false) => {\n const token = await authApi.getAccessToken('Calendars.Read', {\n optional,\n instantPopup: !optional,\n });\n\n setSignedIn(!!token);\n setInitialized(true);\n },\n [authApi, setSignedIn],\n );\n\n return { isSignedIn, isInitialized, signIn };\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA
|
|
1
|
+
{"version":3,"file":"useSignIn.esm.js","sources":["../../src/hooks/useSignIn.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { microsoftAuthApiRef, useApi } from '@backstage/core-plugin-api';\n\nexport const useSignIn = () => {\n const [isSignedIn, setSignedIn] = useState(false);\n const [isInitialized, setInitialized] = useState(false);\n const authApi = useApi(microsoftAuthApiRef);\n\n const signIn = useCallback(\n async (optional = false) => {\n const token = await authApi.getAccessToken('Calendars.Read', {\n optional,\n instantPopup: !optional,\n });\n\n setSignedIn(!!token);\n setInitialized(true);\n },\n [authApi, setSignedIn],\n );\n\n return { isSignedIn, isInitialized, signIn };\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAM,MAAA,OAAA,GAAU,OAAO,mBAAmB,CAAA;AAE1C,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IACb,OAAO,WAAW,KAAU,KAAA;AAC1B,MAAA,MAAM,KAAQ,GAAA,MAAM,OAAQ,CAAA,cAAA,CAAe,gBAAkB,EAAA;AAAA,QAC3D,QAAA;AAAA,QACA,cAAc,CAAC;AAAA,OAChB,CAAA;AAED,MAAY,WAAA,CAAA,CAAC,CAAC,KAAK,CAAA;AACnB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,KACrB;AAAA,IACA,CAAC,SAAS,WAAW;AAAA,GACvB;AAEA,EAAO,OAAA,EAAE,UAAY,EAAA,aAAA,EAAe,MAAO,EAAA;AAC7C;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import * as react from 'react';
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
2
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
4
3
|
import { OAuthApi, FetchApi } from '@backstage/core-plugin-api';
|
|
5
4
|
import { Calendar, ScheduleInformation } from '@microsoft/microsoft-graph-types';
|
|
@@ -14,7 +13,7 @@ declare const vacationCalendarPlugin: _backstage_core_plugin_api.BackstagePlugin
|
|
|
14
13
|
* Routable extension for VacationCalendarPage
|
|
15
14
|
* @public
|
|
16
15
|
*/
|
|
17
|
-
declare const VacationCalendarPage: () =>
|
|
16
|
+
declare const VacationCalendarPage: () => react_jsx_runtime.JSX.Element;
|
|
18
17
|
|
|
19
18
|
/**
|
|
20
19
|
* The apiref for the VacationCalendar plugin.
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'react-calendar-timeline/lib/Timeline.css';
|
|
2
|
-
import { createPlugin, createApiFactory,
|
|
2
|
+
import { createPlugin, createApiFactory, fetchApiRef, microsoftAuthApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
3
3
|
import { rootRouteRef } from './routes.esm.js';
|
|
4
4
|
import { vacationCalendarApiRef } from './api/VacationCalendarApi.esm.js';
|
|
5
5
|
import { VacationCalendarApiClient } from './api/VacationCalendarClient.esm.js';
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import 'react-calendar-timeline/lib/Timeline.css';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n microsoftAuthApiRef,\n} from '@backstage/core-plugin-api';\nimport { rootRouteRef } from './routes';\nimport { VacationCalendarApiClient, vacationCalendarApiRef } from './api';\n\n/**\n * Plugin that provides the VacationCalendar api\n * @public */\nexport const vacationCalendarPlugin = createPlugin({\n id: 'vacation-calendar',\n apis: [\n createApiFactory({\n api: vacationCalendarApiRef,\n deps: {\n authApi: microsoftAuthApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ authApi, fetchApi }) =>\n new VacationCalendarApiClient({ authApi, fetchApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\n/**\n * Routable extension for VacationCalendarPage\n * @public\n */\nexport const VacationCalendarPage = vacationCalendarPlugin.provide(\n createRoutableExtension({\n name: 'VacationCalendarPage',\n component: () => import('./components').then(m => m.VacationCalendar),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;;AAcO,MAAM,yBAAyB,YAAa,CAAA;AAAA,EACjD,EAAI,EAAA,mBAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,sBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,OAAS,EAAA,mBAAA;AAAA,QACT,QAAU,EAAA
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import 'react-calendar-timeline/lib/Timeline.css';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n microsoftAuthApiRef,\n} from '@backstage/core-plugin-api';\nimport { rootRouteRef } from './routes';\nimport { VacationCalendarApiClient, vacationCalendarApiRef } from './api';\n\n/**\n * Plugin that provides the VacationCalendar api\n * @public */\nexport const vacationCalendarPlugin = createPlugin({\n id: 'vacation-calendar',\n apis: [\n createApiFactory({\n api: vacationCalendarApiRef,\n deps: {\n authApi: microsoftAuthApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ authApi, fetchApi }) =>\n new VacationCalendarApiClient({ authApi, fetchApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\n/**\n * Routable extension for VacationCalendarPage\n * @public\n */\nexport const VacationCalendarPage = vacationCalendarPlugin.provide(\n createRoutableExtension({\n name: 'VacationCalendarPage',\n component: () => import('./components').then(m => m.VacationCalendar),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;;AAcO,MAAM,yBAAyB,YAAa,CAAA;AAAA,EACjD,EAAI,EAAA,mBAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,sBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,OAAS,EAAA,mBAAA;AAAA,QACT,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,OAAS,EAAA,QAAA,EACnB,KAAA,IAAI,yBAA0B,CAAA,EAAE,OAAS,EAAA,QAAA,EAAU;AAAA,KACtD;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV,CAAC;AAMM,MAAM,uBAAuB,sBAAuB,CAAA,OAAA;AAAA,EACzD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,sBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,2BAAc,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,gBAAgB,CAAA;AAAA,IACpE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
|
package/dist/routes.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'vacation-calendar',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'vacation-calendar',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axis-backstage/plugin-vacation-calendar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"main": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,13 +28,14 @@
|
|
|
28
28
|
"postpack": "backstage-cli package postpack"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@backstage/catalog-model": "^1.
|
|
32
|
-
"@backstage/core-components": "^0.
|
|
33
|
-
"@backstage/core-plugin-api": "^1.
|
|
34
|
-
"@backstage/errors": "^1.2.
|
|
35
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
36
|
-
"@backstage/theme": "^0.
|
|
31
|
+
"@backstage/catalog-model": "^1.7.4",
|
|
32
|
+
"@backstage/core-components": "^0.17.3",
|
|
33
|
+
"@backstage/core-plugin-api": "^1.10.8",
|
|
34
|
+
"@backstage/errors": "^1.2.7",
|
|
35
|
+
"@backstage/plugin-catalog-react": "^1.19.0",
|
|
36
|
+
"@backstage/theme": "^0.6.6",
|
|
37
37
|
"@date-io/luxon": "3.0.0",
|
|
38
|
+
"@material-ui/core": "^4.12.4",
|
|
38
39
|
"@material-ui/pickers": "^3.3.11",
|
|
39
40
|
"@microsoft/microsoft-graph-types": "^2.40.0",
|
|
40
41
|
"@mui/lab": "^5.0.0-alpha.170",
|
|
@@ -45,19 +46,24 @@
|
|
|
45
46
|
"lodash": "^4.17.21",
|
|
46
47
|
"luxon": "^3.4.4",
|
|
47
48
|
"moment": "^2.30.1",
|
|
49
|
+
"prop-types": "^15.8.1",
|
|
48
50
|
"react-calendar-timeline": "^0.28.0",
|
|
49
51
|
"react-use": "^17.5.0"
|
|
50
52
|
},
|
|
51
53
|
"peerDependencies": {
|
|
52
|
-
"react": "^
|
|
54
|
+
"@types/react": "^17.0.0 || ^18.0.0",
|
|
55
|
+
"react": "^17.0.0 || ^18.0.0",
|
|
56
|
+
"react-dom": "^17.0.0 || ^18.0.0",
|
|
57
|
+
"react-router-dom": "^6.3.0"
|
|
53
58
|
},
|
|
54
59
|
"devDependencies": {
|
|
55
|
-
"@backstage/catalog-client": "^1.
|
|
56
|
-
"@backstage/cli": "^0.
|
|
57
|
-
"@backstage/core-app-api": "^1.
|
|
58
|
-
"@backstage/dev-utils": "^1.
|
|
59
|
-
"@backstage/test-utils": "^1.
|
|
60
|
-
"@testing-library/
|
|
60
|
+
"@backstage/catalog-client": "^1.10.1",
|
|
61
|
+
"@backstage/cli": "^0.33.0",
|
|
62
|
+
"@backstage/core-app-api": "^1.17.1",
|
|
63
|
+
"@backstage/dev-utils": "^1.1.11",
|
|
64
|
+
"@backstage/test-utils": "^1.7.9",
|
|
65
|
+
"@testing-library/dom": "^10.0.0",
|
|
66
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
61
67
|
"@testing-library/react": "^16.0.0",
|
|
62
68
|
"@testing-library/user-event": "^14.5.2",
|
|
63
69
|
"@types/lodash": "^4.17.5",
|
|
@@ -67,6 +73,13 @@
|
|
|
67
73
|
"files": [
|
|
68
74
|
"dist"
|
|
69
75
|
],
|
|
76
|
+
"typesVersions": {
|
|
77
|
+
"*": {
|
|
78
|
+
"package.json": [
|
|
79
|
+
"package.json"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
},
|
|
70
83
|
"module": "./dist/index.esm.js",
|
|
71
84
|
"directory": "_release/package"
|
|
72
|
-
}
|
|
85
|
+
}
|