@axis-backstage/plugin-vacation-calendar 0.9.1 → 0.9.3
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 +12 -0
- package/README.md +39 -0
- package/dist/alpha/apis.esm.js +15 -0
- package/dist/alpha/apis.esm.js.map +1 -0
- package/dist/alpha/entityContent.esm.js +18 -0
- package/dist/alpha/entityContent.esm.js.map +1 -0
- package/dist/alpha.d.ts +69 -0
- package/dist/alpha.esm.js +15 -0
- package/dist/alpha.esm.js.map +1 -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 +1 -0
- package/dist/components/CalendarCard/CalendarCard.esm.js.map +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.map +1 -1
- package/dist/components/SignInContent/SignInContent.esm.js.map +1 -1
- package/dist/components/VacationCalendar.esm.js.map +1 -1
- package/dist/components/index.esm.js +5 -1
- package/dist/components/index.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/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/package.json +41 -20
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @axis-backstage/plugin-vacation-calendar
|
|
2
2
|
|
|
3
|
+
## 0.9.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 28e5257: Added new frontend system (NFS) support via a new `./alpha` entry point. The plugin exposes an `EntityContentBlueprint` that renders the Out of Office calendar as an entity content tab, and an `ApiBlueprint` for the vacation calendar API.
|
|
8
|
+
|
|
9
|
+
## 0.9.2
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 36858a7: Bumped to backstage 1.50.2
|
|
14
|
+
|
|
3
15
|
## 0.9.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -100,6 +100,45 @@ const userPage = (
|
|
|
100
100
|
);
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
## New Frontend System
|
|
104
|
+
|
|
105
|
+
The plugin supports the [new Backstage frontend system](https://backstage.io/docs/frontend-system/) via the `./alpha` entry point.
|
|
106
|
+
|
|
107
|
+
1. Install the plugin into your app:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# From your Backstage root directory
|
|
111
|
+
yarn --cwd packages/app add @axis-backstage/plugin-vacation-calendar
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
2. Add the plugin to your app:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
// packages/app/src/App.tsx (or wherever you configure your frontend features)
|
|
118
|
+
import vacationCalendarPlugin from '@axis-backstage/plugin-vacation-calendar/alpha';
|
|
119
|
+
|
|
120
|
+
export const app = createApp({
|
|
121
|
+
features: [
|
|
122
|
+
// ...
|
|
123
|
+
vacationCalendarPlugin,
|
|
124
|
+
],
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The plugin will automatically add an "Out Of Office" tab to Group and User entity pages. No manual route or API setup is required — the plugin handles both the API factory and the entity content tab as extensions.
|
|
129
|
+
|
|
130
|
+
### Overriding the entity filter
|
|
131
|
+
|
|
132
|
+
By default the tab is shown on `Group` and `User` entities. You can override this in your `app-config.yaml`:
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
app:
|
|
136
|
+
extensions:
|
|
137
|
+
- entity-content:vacation-calendar/entity:
|
|
138
|
+
config:
|
|
139
|
+
filter: 'kind: Component'
|
|
140
|
+
```
|
|
141
|
+
|
|
103
142
|
## Development
|
|
104
143
|
|
|
105
144
|
The plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/vacation-calendar](http://localhost:3000/vacation-calendar).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ApiBlueprint, fetchApiRef } from '@backstage/frontend-plugin-api';
|
|
2
|
+
import { microsoftAuthApiRef } from '@backstage/core-plugin-api';
|
|
3
|
+
import { vacationCalendarApiRef } from '../api/VacationCalendarApi.esm.js';
|
|
4
|
+
import { VacationCalendarApiClient } from '../api/VacationCalendarClient.esm.js';
|
|
5
|
+
|
|
6
|
+
const vacationCalendarApi = ApiBlueprint.make({
|
|
7
|
+
params: (defineParams) => defineParams({
|
|
8
|
+
api: vacationCalendarApiRef,
|
|
9
|
+
deps: { authApi: microsoftAuthApiRef, fetchApi: fetchApiRef },
|
|
10
|
+
factory: ({ authApi, fetchApi }) => new VacationCalendarApiClient({ authApi, fetchApi })
|
|
11
|
+
})
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export { vacationCalendarApi };
|
|
15
|
+
//# sourceMappingURL=apis.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apis.esm.js","sources":["../../src/alpha/apis.ts"],"sourcesContent":["import { ApiBlueprint, fetchApiRef } from '@backstage/frontend-plugin-api';\nimport { microsoftAuthApiRef } from '@backstage/core-plugin-api';\nimport { vacationCalendarApiRef } from '../api';\nimport { VacationCalendarApiClient } from '../api';\n\n/**\n * @alpha\n */\nexport const vacationCalendarApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: vacationCalendarApiRef,\n deps: { authApi: microsoftAuthApiRef, fetchApi: fetchApiRef },\n factory: ({ authApi, fetchApi }) =>\n new VacationCalendarApiClient({ authApi, fetchApi }),\n }),\n});\n"],"names":[],"mappings":";;;;;AAQO,MAAM,mBAAA,GAAsB,aAAa,IAAA,CAAK;AAAA,EACnD,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,sBAAA;AAAA,IACL,IAAA,EAAM,EAAE,OAAA,EAAS,mBAAA,EAAqB,UAAU,WAAA,EAAY;AAAA,IAC5D,OAAA,EAAS,CAAC,EAAE,OAAA,EAAS,QAAA,EAAS,KAC5B,IAAI,yBAAA,CAA0B,EAAE,OAAA,EAAS,QAAA,EAAU;AAAA,GACtD;AACL,CAAC;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { isGroupEntity, isUserEntity } from '@backstage/catalog-model';
|
|
3
|
+
import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
4
|
+
import { rootRouteRef } from '../routes.esm.js';
|
|
5
|
+
|
|
6
|
+
const entityVacationCalendarContent = EntityContentBlueprint.make({
|
|
7
|
+
name: "entity",
|
|
8
|
+
params: {
|
|
9
|
+
path: "/vacation-calendar",
|
|
10
|
+
title: "Out Of Office",
|
|
11
|
+
routeRef: rootRouteRef,
|
|
12
|
+
filter: (entity) => isGroupEntity(entity) || isUserEntity(entity),
|
|
13
|
+
loader: async () => import('../components/index.esm.js').then((m) => /* @__PURE__ */ jsx(m.VacationCalendar, {}))
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export { entityVacationCalendarContent };
|
|
18
|
+
//# sourceMappingURL=entityContent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entityContent.esm.js","sources":["../../src/alpha/entityContent.tsx"],"sourcesContent":["import { isGroupEntity, isUserEntity } from '@backstage/catalog-model';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { rootRouteRef } from '../routes';\n\n/**\n * @alpha\n */\nexport const entityVacationCalendarContent = EntityContentBlueprint.make({\n name: 'entity',\n params: {\n path: '/vacation-calendar',\n title: 'Out Of Office',\n routeRef: rootRouteRef,\n filter: entity => isGroupEntity(entity) || isUserEntity(entity),\n loader: async () =>\n import('../components').then(m => <m.VacationCalendar />),\n },\n});\n"],"names":[],"mappings":";;;;;AAOO,MAAM,6BAAA,GAAgC,uBAAuB,IAAA,CAAK;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,eAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,QAAQ,CAAA,MAAA,KAAU,aAAA,CAAc,MAAM,CAAA,IAAK,aAAa,MAAM,CAAA;AAAA,IAC9D,MAAA,EAAQ,YACN,OAAO,4BAAe,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBAAK,GAAA,CAAC,CAAA,CAAE,gBAAA,EAAF,EAAmB,CAAE;AAAA;AAE9D,CAAC;;;;"}
|
package/dist/alpha.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as _backstage_catalog_model from '@backstage/catalog-model';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import * as _backstage_filter_predicates from '@backstage/filter-predicates';
|
|
4
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
5
|
+
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Frontend plugin that fetches and displays out of office events for entities.
|
|
9
|
+
*
|
|
10
|
+
* @alpha
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
14
|
+
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
15
|
+
}, {}, {
|
|
16
|
+
"api:vacation-calendar": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
17
|
+
kind: "api";
|
|
18
|
+
name: undefined;
|
|
19
|
+
config: {};
|
|
20
|
+
configInput: {};
|
|
21
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
22
|
+
inputs: {};
|
|
23
|
+
params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
|
|
24
|
+
}>;
|
|
25
|
+
"entity-content:vacation-calendar/entity": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
26
|
+
kind: "entity-content";
|
|
27
|
+
name: "entity";
|
|
28
|
+
config: {
|
|
29
|
+
path: string | undefined;
|
|
30
|
+
title: string | undefined;
|
|
31
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
32
|
+
group: string | false | undefined;
|
|
33
|
+
icon: string | undefined;
|
|
34
|
+
};
|
|
35
|
+
configInput: {
|
|
36
|
+
path?: string | undefined;
|
|
37
|
+
title?: string | undefined;
|
|
38
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
39
|
+
group?: string | false | undefined;
|
|
40
|
+
icon?: string | undefined;
|
|
41
|
+
};
|
|
42
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
43
|
+
optional: true;
|
|
44
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
45
|
+
optional: true;
|
|
46
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
47
|
+
optional: true;
|
|
48
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
|
|
49
|
+
optional: true;
|
|
50
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string | react.ReactElement<any, string | react.JSXElementConstructor<any>>, "catalog.entity-content-icon", {
|
|
51
|
+
optional: true;
|
|
52
|
+
}>;
|
|
53
|
+
inputs: {};
|
|
54
|
+
params: {
|
|
55
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
56
|
+
path: string;
|
|
57
|
+
defaultTitle?: [Error: `Use the 'title' param instead`];
|
|
58
|
+
title: string;
|
|
59
|
+
defaultGroup?: [Error: `Use the 'group' param instead`];
|
|
60
|
+
group?: ("overview" | "documentation" | "development" | "deployment" | "operation" | "observability") | (string & {});
|
|
61
|
+
icon?: string | react.ReactElement;
|
|
62
|
+
loader: () => Promise<JSX.Element>;
|
|
63
|
+
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
64
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
65
|
+
};
|
|
66
|
+
}>;
|
|
67
|
+
}>;
|
|
68
|
+
|
|
69
|
+
export { _default as default };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
2
|
+
import { vacationCalendarApi } from './alpha/apis.esm.js';
|
|
3
|
+
import { entityVacationCalendarContent } from './alpha/entityContent.esm.js';
|
|
4
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
5
|
+
|
|
6
|
+
var alpha = createFrontendPlugin({
|
|
7
|
+
pluginId: "vacation-calendar",
|
|
8
|
+
extensions: [entityVacationCalendarContent, vacationCalendarApi],
|
|
9
|
+
routes: {
|
|
10
|
+
root: rootRouteRef
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export { alpha as default };
|
|
15
|
+
//# sourceMappingURL=alpha.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.ts"],"sourcesContent":["import { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport {\n entityVacationCalendarContent,\n vacationCalendarApi,\n} from './alpha/index';\nimport { rootRouteRef } from './routes';\n\n/**\n * Frontend plugin that fetches and displays out of office events for entities.\n *\n * @alpha\n * @packageDocumentation\n */\nexport default createFrontendPlugin({\n pluginId: 'vacation-calendar',\n extensions: [entityVacationCalendarContent, vacationCalendarApi],\n routes: {\n root: rootRouteRef,\n },\n});\n"],"names":[],"mappings":";;;;;AAaA,YAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,mBAAA;AAAA,EACV,UAAA,EAAY,CAAC,6BAAA,EAA+B,mBAAmB,CAAA;AAAA,EAC/D,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;;;;"}
|
|
@@ -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,
|
|
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,YAAA,CAAkC;AAAA,EACtE,EAAA,EAAI;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;AACF,
|
|
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
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import 'react-calendar-timeline/lib/Timeline.css';
|
|
2
3
|
import { useState } from 'react';
|
|
3
4
|
import useAsync from 'react-use/lib/useAsync';
|
|
4
5
|
import Timeline, { TimelineHeaders, SidebarHeader, DateHeader } from 'react-calendar-timeline';
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"CalendarCard.esm.js","sources":["../../../src/components/CalendarCard/CalendarCard.tsx"],"sourcesContent":["import 'react-calendar-timeline/lib/Timeline.css';\nimport { 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":";;;;;;;;;;;;;;;;;;;;;AAmCA,MAAM,gBAAA,GAAmB,EAAA;AAEzB,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAgD;AAC1E,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,MAAA,EAAQ,MAAA;AAAA,QACR,YAAA,EAAc,gBAAA;AAAA,QACd,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,gBAAA;AAAA,QACZ,KAAA,EAAO,CAAC,KAAA,KAAiB,KAAA,CAAM,QAAQ,IAAA,CAAK,OAAA;AAAA,QAC5C,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,KAAA,EAAO,eAAA,CAAgB,QAAA,CAAS,UAAA;AAAA,QACvC,IAAA,EAAM,KAAA,EAAO,eAAA,CAAgB,QAAA,CAAS;AAAA,OACxC;AAAA,MACA,OAAA,EAAS,KAAA,EAAO,gBAAA,EAAiB,CAAE,OAAA;AAAA,MAElC,iBAAO,eAAA,CAAgB;AAAA;AAAA,GAC1B;AAEJ,CAAA;AAEO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AAEvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AACzD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA;AAAA,IAC5B,QAAA,CAAS,GAAA,EAAI,CAAE,KAAA,CAAM,KAAK,EAAE,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB;AAAA,GAC7D;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAe,MAAA,KAAW,SAAA,EAAU;AAExD,EAAA,QAAA,CAAS,YAAY,MAAA,CAAO,IAAI,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE3C,EAAA,MAAM,eACJ,MAAA,CAAO,IAAA,CAAK,aAAY,KAAM,MAAA,IAAU,OAAO,QAAA,CAAS,IAAA;AAE1D,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,SAAS,YAAY;AAC5C,IAAA,OAAO,eACH,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA,GACpC,kBAAA,CAAmB,YAAY,MAAM,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,UAAA,EAAY,MAAM,CAAC,CAAA;AAEvB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,IACX,UAAA,EAAY,sBAAA;AAAA,IACZ,WAAA;AAAA,IACA;AAAA,GACF,GAAI,eAAA,CAAgB,KAAA,EAAO,SAAA,EAAW,SAAS,UAAU,CAAA;AAEzD,EAAA,MAAM,UAAA,GACJ,qBAAA,IAAyB,sBAAA,IAA0B,CAAC,aAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,WAAA,EAAa,YAAA,EAAc,KAAK,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,iBAAiB,WAAW,CAAA;AAElD,EAAA,IAAI,KAAA,EAAO,WAAW,CAAA,EAAG;AACvB,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,iBAAA;AAAA,QACN,eAAA,EAAe,IAAA;AAAA,QACf,KAAA,EAAO,MAAM,oCAAoC;AAAA;AAAA,KACnD;AAAA,EAEJ;AACA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,wBAAA;AAAA,QACN,eAAA,EAAe,IAAA;AAAA,QACf;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAM,wBAAA,EACnB,QAAA,kBAAA,GAAA,CAAC,iBAAc,KAAA,EAAM,kCAAA,EACnB,+BAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,sBACrC,GAAA,CAAC,cAAW,QAAA,EAAA,kLAAA,EAIZ,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,2BACnC,UAAA,EAAA,EAAW,QAAA,EAAA;AAAA,QAAA,kFAAA;AAAA,QAEI,gBAAA;AAAA,QAAiB;AAAA,OAAA,EACjC;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,yBAEC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,SAAM,SAAA,EAAU,KAAA,EAAM,GAAA,EAAK,CAAA,EAAG,YAAW,QAAA,EACxC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,cAAc,CAAA,CAAA,KAAK;AACjB,cAAA,IAAI,aAAa,QAAA,EAAU;AACzB,gBAAA,MAAM,EAAE,MAAK,GAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAM,EAAE,QAAA,EAAS;AAClD,gBAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,gBAAA,EAAkB;AAC7C,kBAAA,UAAA,CAAW,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,KAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAC,CAAA;AAAA,gBAC5D;AACA,gBAAA,YAAA,CAAa,CAAC,CAAA;AAAA,cAChB;AAAA,YACF,CAAA;AAAA,YACA,UAAA,EAAY,SAAA;AAAA,YACZ,KAAA,EAAM;AAAA;AAAA,SACR,EACF,CAAA;AAAA,4BACC,GAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,cAAc,CAAA,CAAA,KAAK;AACjB,cAAA,IAAI,aAAa,QAAA,EAAU;AACzB,gBAAA,MAAM,EAAE,MAAK,GAAI,SAAA,CAAU,KAAK,CAAA,EAAG,MAAM,EAAE,QAAA,EAAS;AACpD,gBAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,gBAAA,EAAkB;AAC7C,kBAAA,YAAA;AAAA,oBACE,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,MAAM,EAAE,IAAA,EAAM,kBAAkB;AAAA,mBACjD;AAAA,gBACF;AACA,gBAAA,UAAA,CAAW,CAAa,CAAA;AAAA,cAC1B;AAAA,YACF,CAAA;AAAA,YACA,UAAA,EAAY,OAAA;AAAA,YACZ,KAAA,EAAM;AAAA;AAAA,SACR,EACF,CAAA;AAAA,4BACC,GAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AACb,cAAA,aAAA,EAAc;AAAA,YAChB,CAAA;AAAA,YACA,QAAA,EAAU,cAAc,CAAC,WAAA;AAAA,YACzB,OAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAM,SAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAEC,UAAA,wBACE,GAAA,EAAA,EAAI,EAAA,EAAI,GACP,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,CAAA,EAC5B,CAAA;AAAA,MAED,CAAC,cAAc,aAAA,oBACd,GAAA,CAAC,OAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,WAAW,GAAA,EAAK,QAAA,EAAS,QACzD,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,iBAAiB,MAAM,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA,EACvD,CAAA;AAAA,MAED,CAAC,qBAAA,IAAyB,UAAA,oBACzB,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAS,MAAA,EAC1C,QAAA,kBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,YAAA,EAAc,GAAA;AAAA,UACd,aAAA,EAAe,CAAC,EAAE,KAAA,EAAM,KAAM;AAC5B,YAAA,uBACE,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAA,EAAQ,SAAS,IAAI,CAAA,CAAA;AAAA,gBAExD,QAAA,kBAAA,IAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,cAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,UAAA,EAAY,KAAA,CAAM,SAAA,GACd,qDAAA,GACA,EAAA;AAAA,sBACJ,UAAA,EAAY,MAAA;AAAA,sBACZ,WAAA,EAAa,KAAA;AAAA,sBACb,OAAA,EAAS,MAAA;AAAA,sBACT,UAAA,EAAY,QAAA;AAAA,sBACZ,QAAA,EAAU,QAAA;AAAA,sBACV,aAAA,EAAe,KAAA;AAAA,sBACf,GAAA,EAAK;AAAA,qBACP;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,KAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,WAAA,EACE,KAAA,CAAM,MAAA,EAAQ,QAAA,CAAS,WAAA;AAAA,0BAEzB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,OAAA;AAAA,0BACrC,YAAA,EAAc;AAAA,4BACZ,KAAA,EAAO,EAAA;AAAA,4BACP,MAAA,EAAQ;AAAA;AACV;AAAA,uBACF,EACF,CAAA;AAAA,sCACA,GAAA,CAAC,SACC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,OAAA,EAAS,QAAA,EAAA,KAAA,CAAM,OAAM,CAAA,EACvC;AAAA;AAAA;AAAA;AACF;AAAA,aACF;AAAA,UAEJ,CAAA;AAAA,UACA,KAAA,EAAO,aAAA;AAAA,UACP,mBAAA,EAAqB,KAAA;AAAA,UACrB,gBAAA,EAAkB,UAAU,QAAA,EAAS;AAAA,UACrC,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,UAEjC,QAAA,kBAAA,IAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,eAAA,EAAiB,aAAA;AAAA,gBACjB,KAAA,EAAO,OAAA;AAAA,gBACP,QAAA,EAAU,QAAA;AAAA,gBACV,GAAA,EAAK;AAAA,eACP;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,YAAA,EAAa,KAAM;AACrB,kBAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAK,GAAG,YAAA,EAAa,EAAG,CAAA;AAAA,gBAClC,CAAA,EACF,CAAA;AAAA,gCACA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,eAAA;AAAA,oBACL,gBAAA,EAAkB;AAAA;AAAA,iBACpB;AAAA,gCACA,GAAA,CAAC,UAAA,EAAA,EAAW,gBAAA,EAAkB,kBAAA,EAAoB;AAAA;AAAA;AAAA;AACpD;AAAA,OACF,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -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,
|
|
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,kBAAA,GAAqB,SAAA;AAEpB,MAAM,iBAAA,GAAoB,OAC/B,UAAA,EACA,MAAA,KACG;AACH,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,WAAA,GAAc,kBAAkB,CAAA,EAAG;AACvD,IAAA,OAAO,CAAC,MAAoB,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,CAAC,wBAAwB,kBAAkB,CAAA,CAAE,GAC3C,MAAA,CAAO,QAAA,CAAS,YAAY,kBAAkB;AAAA,GAClD;AAEA,EAAA,MAAM,EAAE,OAAM,GAAI,MAAM,WAAW,WAAA,CAAY,EAAE,QAAQ,CAAA;AACzD,EAAA,OAAO,KAAA;AACT;AAEO,MAAM,kBAAA,GAAqB,OAChC,UAAA,EACA,MAAA,KACG;AACH,EAAA,MAAM;AAAA,IACJ,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,iBAAA;AAAkB,GAC7D,GAAI,MAAA;AAEJ,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,oBAAA,EAAsB;AAAA,MACpB,kBAAA,CAAmB;AAAA,QACjB,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,SAAA,CAAU,iBAAA,CAAkB,OAAO,CAAA;AAAA,QAC9C,IAAA,EAAM,SAAA,CAAU,iBAAA,CAAkB,OAAO;AAAA,OAC1C;AAAA;AACH,GACF;AAEA,EAAA,OAAA,CAAQ,MAAM,UAAA,CAAW,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAA,EAAG,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,
|
|
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,IAAA,KACkC;AAClC,EAAA,OAAO,IAAA,KAAS,MAAA;AAClB,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAqB,MAAA,KAAmB;AAC3D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AACnC,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,OAAK,CAAA,CAAE,QAAA,CAAS,SAAS,IAAI,CAAA;AAErD,EAAA,IAAI,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,WAAA;AACpC,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAqB,MAAA,KAAmB;AACvD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AACnC,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,OAAK,CAAA,CAAE,QAAA,CAAS,SAAS,IAAI,CAAA;AAErD,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,MAAM,gBAAA,GAAmB,CAC9B,WAAA,KACG;AACH,EAAA,OAAO,cACH,WAAA,EAAa,KAAA,CACV,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAC,CAAA,CAEd,OAAA;AAAA,IAAQ,CAAC,CAAA,EAAG,CAAA;AAAA;AAAA,MAEX,CAAA,CAAE,eAEE,MAAA,CAAO,CAAA,YAAA,KAAgB,aAAa,MAAA,KAAW,KAAK,CAAA,CAErD,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACT,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QAChE,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAE,OAAO,QAAS,CAAA;AAAA,QAC/C,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAE,KAAK,QAAS,CAAA;AAAA,QAC3C,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACb,CAAE;AAAA;AAAA,GACN,CACC,MAAA,CAAO,cAAc,CAAA,GACxB,EAAC;AACP;AAEO,MAAM,SAAA,GAAY,CACvB,WAAA,EACA,YAAA,EACA,KAAA,KACG;AACH,EAAA,OAAO,WAAA,GACH,WAAA,CAAY,KAAA,CACT,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAC,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,IACd,EAAA,EAAI,CAAA;AAAA;AAAA,IAEJ,SAAA,EACE,YAAA,IACA,CAAA,CAAE,UAAA,IACF,YAAA,KAAiB,KAAK,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IAC/C,OAAO,WAAA,CAAY,KAAA,IAAS,EAAC,EAAG,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,IAClD,QAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,IAC/C,MAAA,EAAQ;AAAA,GACV,CAAE,IACJ,EAAC;AACP;;;;"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CAAA,KAAyB;AACvB,EAAA,2BACG,WAAA,EAAA,EAAY,OAAA,EAAQ,YACnB,QAAA,kBAAA,GAAA,CAAC,oBAAA,EAAA,EAAqB,aAAa,YAAA,EACjC,QAAA,kBAAA,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAO,YAAA;AAAA,MACP,KAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,YAAA,EAAc,UAAA;AAAA,MACd,QAAA,EAAU;AAAA;AAAA,KAEd,CAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,aAAA,GAAgB,CAAC,EAAE,eAAA,EAAgB,KAAa;AAC3D,EAAA,2BACG,GAAA,EAAA,EAAI,QAAA,EAAS,YAAW,MAAA,EAAO,MAAA,EAAO,OAAM,MAAA,EAC3C,QAAA,kBAAA,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAS,UAAA;AAAA,MACT,CAAA,EAAG,EAAA;AAAA,MACH,IAAA,EAAM,CAAA;AAAA,MACN,GAAA,EAAK,CAAA;AAAA,MAEL,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,KAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,eAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACN,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,WAAA,EAAY;AAE7B,MAAM,mBAAmB,MAAM;AACpC,EAAA,2BACG,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,gBAAa,CAAA,EAChB,CAAA;AAEJ;;;;"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { VacationCalendar } from './VacationCalendar.esm.js';
|
|
2
2
|
export { vacationCalendarApiRef } from '../api/VacationCalendarApi.esm.js';
|
|
3
3
|
export { VacationCalendarApiClient } from '../api/VacationCalendarClient.esm.js';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export { VacationCalendar };
|
|
4
8
|
//# sourceMappingURL=index.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -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,
|
|
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,SAAA,GAAY,EAAA;AAEX,MAAM,eAAA,GAAkB,CAC7B,KAAA,EACA,SAAA,EACA,SACA,UAAA,KACG;AACH,EAAA,MAAM,WAAA,GAAc,OAAO,sBAAsB,CAAA;AACjD,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,KAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,IACX,UAAA,EAAY,sBAAA;AAAA,IACZ,WAAA;AAAA,IACA;AAAA,MACE,gBAAA,CAAiB;AAAA,IACnB,OAAA,EAAS,CAAC,EAAE,SAAA,GAAY,GAAE,KAAM;AAC9B,MAAA,MAAM,eAAe,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,SAAA,EAAW,YAAY,SAAS,CAAA;AAExE,MAAA,OAAO,WAAA,CAAY,eAAA;AAAA,QACjB;AAAA,UACE,KAAA,EAAO,YAAA,EAAc,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA,IAAK,EAAC;AAAA,UAC/D,aAAA,EAAe,UAAU,KAAA,EAAM;AAAA,UAC/B,WAAA,EAAa,QAAQ,KAAA;AAAM,SAC7B;AAAA,QACA;AAAA,UACE,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,sBAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,KAAA,EAAM;AAAA,MAChB,QAAQ,KAAA;AAAM,KAChB;AAAA,IACA,gBAAA,EAAkB,CAAC,CAAA,EAAG,QAAA,KAAa;AACjC,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,MAAA;AAC/C,MAAA,IAAI,aAAA,KAAkB,OAAO,MAAA,EAAQ;AACnC,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAW,GAAA,GAAQ,GAAA;AAAA,IACnB,SAAS,UAAA,IAAc,SAAA,CAAU,WAAW,OAAA,CAAQ,OAAA,IAAW,CAAC,CAAC,KAAA;AAAA,IACjE,KAAA,EAAO,KAAA;AAAA,IACP,iBAAiB,GAAA,GAAQ,GAAA;AAAA,IACzB,2BAAA,EAA6B,KAAA;AAAA,IAC7B,oBAAA,EAAsB,KAAA;AAAA,IACtB,kBAAA,EAAoB;AAAA,GACrB,CAAA;AACD,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,IACX,UAAA,EAAY,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;AAChD,EAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,
|
|
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,EAAA,MAAM,OAAA,GAAU,OAAO,mBAAmB,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,OAAO,WAAW,KAAA,KAAU;AAC1B,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,cAAA,CAAe,gBAAA,EAAkB;AAAA,QAC3D,QAAA;AAAA,QACA,cAAc,CAAC;AAAA,OAChB,CAAA;AAED,MAAA,WAAA,CAAY,CAAC,CAAC,KAAK,CAAA;AACnB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,WAAW;AAAA,GACvB;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,aAAA,EAAe,MAAA,EAAO;AAC7C;;;;"}
|
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,
|
|
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,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,sBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,mBAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,OAAA,EAAS,QAAA,EAAS,KAC5B,IAAI,yBAAA,CAA0B,EAAE,OAAA,EAAS,QAAA,EAAU;AAAA,KACtD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAMM,MAAM,uBAAuB,sBAAA,CAAuB,OAAA;AAAA,EACzD,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,sBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,2BAAc,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,gBAAgB,CAAA;AAAA,IACpE,UAAA,EAAY;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,
|
|
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,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axis-backstage/plugin-vacation-calendar",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
|
+
"exports": {
|
|
5
|
+
".": {
|
|
6
|
+
"import": "./dist/index.esm.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"default": "./dist/index.esm.js"
|
|
9
|
+
},
|
|
10
|
+
"./alpha": {
|
|
11
|
+
"backstage": "@backstage/FrontendPlugin",
|
|
12
|
+
"import": "./dist/alpha.esm.js",
|
|
13
|
+
"types": "./dist/alpha.d.ts",
|
|
14
|
+
"default": "./dist/alpha.esm.js"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
4
18
|
"main": "dist/index.esm.js",
|
|
5
19
|
"types": "dist/index.d.ts",
|
|
20
|
+
"typesVersions": {
|
|
21
|
+
"*": {
|
|
22
|
+
"alpha": [
|
|
23
|
+
"dist/alpha.d.ts"
|
|
24
|
+
],
|
|
25
|
+
"package.json": [
|
|
26
|
+
"package.json"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
6
30
|
"license": "Apache-2.0",
|
|
7
31
|
"publishConfig": {
|
|
8
32
|
"access": "public",
|
|
@@ -15,7 +39,10 @@
|
|
|
15
39
|
"pluginId": "vacation-calendar",
|
|
16
40
|
"pluginPackages": [
|
|
17
41
|
"@axis-backstage/plugin-vacation-calendar"
|
|
18
|
-
]
|
|
42
|
+
],
|
|
43
|
+
"features": {
|
|
44
|
+
"./alpha": "@backstage/FrontendPlugin"
|
|
45
|
+
}
|
|
19
46
|
},
|
|
20
47
|
"sideEffects": false,
|
|
21
48
|
"scripts": {
|
|
@@ -28,12 +55,13 @@
|
|
|
28
55
|
"postpack": "backstage-cli package postpack"
|
|
29
56
|
},
|
|
30
57
|
"dependencies": {
|
|
31
|
-
"@backstage/catalog-model": "^1.
|
|
32
|
-
"@backstage/core-components": "^0.18.
|
|
33
|
-
"@backstage/core-plugin-api": "^1.12.
|
|
34
|
-
"@backstage/errors": "^1.
|
|
35
|
-
"@backstage/plugin-
|
|
36
|
-
"@backstage/
|
|
58
|
+
"@backstage/catalog-model": "^1.8.0",
|
|
59
|
+
"@backstage/core-components": "^0.18.9",
|
|
60
|
+
"@backstage/core-plugin-api": "^1.12.5",
|
|
61
|
+
"@backstage/errors": "^1.3.0",
|
|
62
|
+
"@backstage/frontend-plugin-api": "^0.16.2",
|
|
63
|
+
"@backstage/plugin-catalog-react": "^2.1.4",
|
|
64
|
+
"@backstage/theme": "^0.7.3",
|
|
37
65
|
"@date-io/luxon": "3.0.0",
|
|
38
66
|
"@material-ui/core": "^4.12.4",
|
|
39
67
|
"@material-ui/pickers": "^3.3.11",
|
|
@@ -57,11 +85,11 @@
|
|
|
57
85
|
"react-router-dom": "^6.3.0"
|
|
58
86
|
},
|
|
59
87
|
"devDependencies": {
|
|
60
|
-
"@backstage/catalog-client": "^1.
|
|
61
|
-
"@backstage/cli": "^0.
|
|
62
|
-
"@backstage/core-app-api": "^1.
|
|
63
|
-
"@backstage/dev-utils": "^1.1.
|
|
64
|
-
"@backstage/test-utils": "^1.7.
|
|
88
|
+
"@backstage/catalog-client": "^1.15.0",
|
|
89
|
+
"@backstage/cli": "^0.36.1",
|
|
90
|
+
"@backstage/core-app-api": "^1.20.0",
|
|
91
|
+
"@backstage/dev-utils": "^1.1.22",
|
|
92
|
+
"@backstage/test-utils": "^1.7.17",
|
|
65
93
|
"@testing-library/dom": "^10.0.0",
|
|
66
94
|
"@testing-library/jest-dom": "^6.0.0",
|
|
67
95
|
"@testing-library/react": "^16.0.0",
|
|
@@ -73,13 +101,6 @@
|
|
|
73
101
|
"files": [
|
|
74
102
|
"dist"
|
|
75
103
|
],
|
|
76
|
-
"typesVersions": {
|
|
77
|
-
"*": {
|
|
78
|
-
"package.json": [
|
|
79
|
-
"package.json"
|
|
80
|
-
]
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
104
|
"module": "./dist/index.esm.js",
|
|
84
105
|
"directory": "_release/package"
|
|
85
106
|
}
|